文章目录
1. 为什么训练时要保证每层的方差一致?
每层的方差保持一致可以减缓梯度消失或爆炸。简单的说,神经网络的误差反向传播,忽略激活函数的偏导数时,相当于自后向前不停乘上网络每一层的权重。我们知道,对与一个任意张量,例如3, 当我们把它不停的乘上一个小于1的正数,那么最后结果就会越来越小,最后变成0。如果把一个数不停的乘上一个大于1的整数,结果就会变成无穷大。对于误差,也是这样,如果权重太大,梯度就会越来越大,导致梯度爆炸。如果网络权重太小,梯度就会越来愈小,导致梯度消失。权重初始化就是要使权重大小刚好在这个范围里。 合理的方差既保证了数值一定的不同, 又保证了数值一定的稳定。 因此,保证每层方差一致可以减缓梯度消失或爆炸。
2. 什么是Covariate Shift现象?
"Covariate Shift"可以理解为网络中间层的输入分布发生变化的现象。
假设这是一个识别猫的神经网络模型,并且我们已经在所有黑猫的图像上训练了数据(如左图所示)。但如果现在我们想把此网络应用于所有颜色的猫,此时网络可能就不会那么好用了。
如果你的训练数据分布是左图(红色圆圈为正例,黑色叉号表示反例),你想把从左图训练好的网络应用于右图的数据分布,那可能就需要重新训练神经网络了。这就是网络各层的输入分布发生了变化。归一化就是想解决因为数据分布的变化导致后面层难以训练的问题。
3. Batch Norm中为什么归一化后还要引入 γ \gamma γ和 β \beta β?
减均值除方差得到的分布是正态分布,我们能否认为正态分布就是最好或最能体现我们训练样本的特征分布呢?
不能这样认为,如果激活函数在方差为1的数据上,没有表现最好的效果,比如Sigmoid激活函数。这个函数在-1~1之间的梯度变化不大。假如某一层学习到特征数据本身就分布在S型激活函数的两侧,把它归一化处理、标准差也限制在了1,把数据变换成分布于s函数的中间部分,就没有达到非线性变换的目的,换言之,减均值除方差操作后可能会削弱网络的性能。如果每一层的数据分布都是标准正太分布,导致其完全学习不到输入数据的特征,因为,费劲心思学习到的特征分布被归一化了,因此,直接对每一层做归一化显然是不合理的。
4. Batch Norm训练和测试的区别
在每个batch上进行而不是在整个数据集上进行。在训练集上有BN测试集上没有BN,这样不会发生数值上的偏移,道理类似dropout,即记录下训练集上的BN参数(均值、标准差、\beta、\gamma)作为网络参数的一部分。
训练阶段:
计算每一batch的mean和variance,然后归一化,放缩
测试阶段:
5. 为什么Dropout后需要Rescale?
假设失活概率为 p ,就是某层中的每个神经元都有p的概率失活,而实际测试时是不会有dropout的,这样在训练和测试时,输出层每个神经元的输入和的期望会有量级上的差异。则会导致每次预测的结果都不一样。因此在训练时还要对隐藏层的输出数据除以(1-p)之后再传给输出层神经元,作为神经元失活的补偿,以使得在训练时和测试时每一层输入有大致相同的期望。训练时,对于网络中的某个输出值x,期望变为 ( 1 − p ) ∗ x + p ∗ 0 = ( 1 − p ) ∗ x (1-p)*x + p*0 = (1-p)*x (1−p)∗x+p∗0=(1−p)∗x, 为了保持测试时(没有dropout)期望一致,在训练时, 对包含dropout的输出乘 1 ( 1 − p ) \frac{1}{(1-p)} (1−p)1, 使得期望仍然为 1 / ( 1 − p ) ∗ ( 1 − p ) x = x 1/(1-p) * (1-p)x = x 1/(1−p)∗(1−p)x=x。 因此,dropout后做rescale主要保证了神经元的期望均值与无dropout时一致,但未保证期望方差(标准差)一致。方差会产生一个与dropout系数p相关的偏移。所以dropout与bn联合使用可能会产生一定问题。
6. dropout与Batch Norm联合使用会产生哪些问题?
参考:https://zhuanlan.zhihu.com/p/33101420
未完待续。。。
7. 如何减轻该状况?
- 高斯Dropout
- 引入IndependentComponent(IC)层
未完待续。。。