dropout层

之前了解的网络都是在全连接层加dropout层,防止模型过拟合。在看deepfm的模型的时候,发现在每一层都可以加入dropout层

对dropout层的深入理解

做分类的时候,Dropout 层一般加在全连接层 防止过拟合 提升模型泛化能力。而很少见到卷积层后接Drop out (原因主要是 卷积参数少,不易过拟合) er

类似卷积神经网络,只是在最后的全连接层使用dropout,循环神经网络一般在不同层循环结构体zhij使用dropout, 而不在同一层的循环结构之间使用

 

其中dropout论文:

from the Srivastava/Hinton dropout paper:

“The additional gain in performance obtained by adding dropout in the convolutional layers (3.02% to 2.55%) is worth noting. One may have presumed that since the convolutional layers don’t have a lot of parameters, overfitting is not a problem and therefore dropout would not have much effect. However, dropout in the lower layers still helps because it provides noisy inputs for the higher fully connected layers which prevents them from overfitting.” 
They use 0.7 prob for conv drop out and 0.5 for fully connected.

即,卷积层参数较少,加入dropout作用甚微,较低层,有噪音,较高层,全连接层可以增加模型的鲁棒性,泛化性能。

 

关于dropout能够较好减轻CNN过拟合的原因,看了一些论文和博客,目前有多种不同的解释,大致整理如下。

在设计网络时,设定的每层神经元代表一个学习到的中间特征(即几个权值的组合),网络所有神经元共同作用来表征输入数据的特定属性(如图像分类中,表征所属类别)。当相对于网络的复杂程度(即网络的表达能力、拟合能力)而言数据量过小时,出现过拟合,显然这时各神经元表示的特征相互之间存在许多重复和冗余。

dropout的直接作用是减少中间特征的数量,从而减少冗余,即增加每层各个特征之间的正交性(数据表征的稀疏性观点也恰好支持此解释)。
 

 

测试层面

预测的时候,每一个单元的参数要预乘以p。 
img5

 

lingyizhong dropout 的设定:

测试阶段不需要设定dropout的值。

1.前向传播

训练阶段:前向传播给定每个神经元一个随机值(0~1),假定设置采样阈值为0.5,如果该神经元对应的随机值小于0.5,则设置该神经元为0,否则设置该神经元值为2乘以原值,(1/0.5),并把所有神经元对应的随机值保存下来,在后向传播是需要使用。

测试阶段:无需dropout。

2.反向传播

读取在前向传播记录的随机值,同样的操作:该梯度值对应的随机值小于0.5,则设置该梯度值为0,否则设置该梯度值值为2乘以原值,(1/0.5)。


 

 

 

dropout率的选择

  • 经过交叉验证,隐含节点dropout率等于0.5的时候效果最好,原因是0.5的时候dropout随机生成的网络结构最多。
  • dropout也可以被用作一种添加噪声的方法,直接对input进行操作。输入层设为更接近1的数。使得输入变化不会太大(0.8)

dropout 概率值得选取:通常会设置为0.5,然后通过验证集来确定随机采样概率(0.5的时候最随机,可以产生网络的组合最多)

输入层的时候随机采样选取的比较多,随机扔掉的比较少,通常训练集的概率在0.1左右,中间层可以选取0.5左右,

 

我的经验是决定dropout之前,需要先判断是否模型过拟合

先dropout=0, 训练后得到模型的一些指标(比如:  F1, Accuracy, AP)。比较train数据集和test数据集的指标。

  • 过拟合:尝试下面的步骤。
  • 欠拟合:尝试调整模型的结构,暂时忽略下面步骤。

dropout设置成0.4-0.6之间, 再次训练得到模型的一些指标。

  • 如果过拟合明显好转,但指标也下降明显,可以尝试减少dropout(0.2)
  • 如果过拟合还是严重,增加dropout(0.2)

重复上面的步骤多次,就可以找到理想的dropout值了

 

dropout随机扔掉一些神经元,因此在迭代的时候,该神经元对应的权重即保持上一步不变,其他的权重即更新(个人理解,在该步就类似与找最优解,这一步的迭代陷入了局部最优解,在下一个batch中,继续迭代,重新寻找最优解,多个这种寻找过程,可以较好的避免模型陷入局部最优解,因此最终的结果较好)

 

 

 

你可能感兴趣的:(深度学习)