Batch Normalization
训练和测试的参数是否一致?
- 对于BN,训练的时候是对每一批数据操作,所以用到的均值方差都是一批的。
- 测试的时候,没有一批的概念,这时候的均值和方差用到的是全量训练数据的(可以通过一定的方法求得)
BN中均值 方差 训练不用全局的原因?
- 在训练的第一个完整epoch过程中是无法得到输入层之外其他层全量训练集的均值和方差,只能在前向传播过程中获取已训练batch的均值和方差。
- 每一批数据的均值、方差都会有差别,会增加模型的鲁棒性
Dropout
Dropout就是:我们在前向传播的时候,让某个神经元的激活值以一定的概率p停止工作,这样可以使模型泛化性更强,因为它不会太依赖某些局部的特征。
可以参考很详细
Dropout在训练和测试的差别
(1)训练阶段
此时公式变化如下 是让神经元的激活函数的输出0
- 没有Dropout的网络计算公式:
- 有Dropout的公式
上面公式中Bernoulli函数是为了生成概率r向量,也就是随机生成一个0、1的向量。
代码层面实现让某个神经元以概率p停止工作,其实就是让它的激活函数值以概率p变为0。比如我们某一层网络神经元的个数为1000个,其激活函数输出值为y1、y2、y3、…、y1000,我们dropout比率选择0.4,那么这一层神经元经过dropout后,1000个神经元中会有大约400个的值被置为0。
注意: 经过上面屏蔽掉某些神经元,使其激活值为0以后,我们还需要对向量y1……y1000进行缩放,也就是乘以1/(1-p)。如果你在训练的时候,经过置0后,没有对y1……y1000进行缩放(rescale),那么在测试的时候,就需要对权重进行缩放,操作如下。
(2)在测试模型阶段
只有在训练阶段没有除(1-p)的,在测试的时候会乘P 否则不用
预测模型的时候,每一个神经单元的权重参数要乘以概率p。
测试阶段Dropout公式:
其问题 Dropout层的位置?
Dropout一般放在全连接层防止过拟合,提高模型返回能力,由于卷积层参数较少,很少有放在卷积层后面的情况,卷积层一般使用batch norm。
全连接层中一般放在激活函数层之后,有的帖子说一定放在激活函数后,个人推测是因为对于部分激活函数输入为0输出不一定为0,可能会起不到效果,不过对于relu输入0输出也是0就无所谓了。