BN层
原理和公式
BN层解决内部协变量偏移ICS问题,通过减少内部协变量偏移加快神经网络训练。
z ^ l = γ ∗ z l − μ δ 2 + σ + β \hat{z}^{l} = \gamma * \frac{z^l-\mu}{\sqrt{\delta^2+\sigma}} + \beta z^l=γ∗δ2+σzl−μ+β
参数量
做法
将网络层的输出分布强制转为均值为0,方差为1的分布之后,为了部分还原,又乘以伽马(γ,scale),加上贝塔(β,shift)。
- BN为什么要有伽马和贝塔:为了在强制转换之后做一定还原,保持模型原有的表达能力(capacity)
- 这样变过来又变回去是不是跟没变一样?
不会跟没变一样, 因为,再变换引入了两个新参数 γ \gamma γ 和 β \beta β。在旧参数中, x 的均值取决于下层神经网络的复杂关联;但在新参数中,均值仅仅由 β \beta β 来确定,去除了与下层计算的密切耦合。新参数可以通过梯度下降来学习,简化了神经网络的训练。 - BN如果去掉伽马和贝塔:可能会导致特征分布差异性降低,损坏特征表达,导致模型拟合能力降低,精度下降。但是模型应该也可以收敛。
用法和步骤:
- BN层一般放在卷积层后,用于重新调整数据分布 (确保网络中的各层即使参数变化,输入/输出的分布也不会发生较大变化)
- 求batch均值、batch方差
- 对每个元素进行归一化
- 尺度缩放和偏移 (变换回数据原始分布,减少),γ代表方差,β代表偏移
优点和缺点
优点
- 在模型训练过程中,批量归一化利用小批量的均值和标准差,不断调整神经网络的中间输出,使整个神经网络各层的中间输出值更加稳定。
- 减轻对初始值的依赖
- 训练更快,可以用更大的学习率
- 批量归一化有许多有益的副作用,主要是正则化。
缺点
- batch太小时,计算的均值方差不稳定,例如在线的单例学习
- 放在激活层之前或者之后
CBN和CmBN
CmBN(Cross mini-Batch Normalization)是 CBN(Cross-Iteration Batch Normalization)的修改版。
-
CBN由于在计算每个迭代时刻统计量时候会考虑前3个时刻的统计量,故变相实现了大batch,然后在每个mini batch内部,都是标准的BN操作即,1 计算BN统计量,2 应用BN,3 更新可学习参数和网络权重
-
CmBN是CBN的简化版本,其唯一差别就是在计算第t时刻的BN统计量时候,CBN会考虑前一个mini batch内部的统计量,而CmBN版本,所有计算都是在mini batch内部。我怀疑是为了减少内存消耗,提高训练速度
假设当前是第t次迭代时刻,也是mini-batch的起点,
(1) 在第t时刻开始进行梯度累加操作
(2) 在第t时刻开始进行BN统计量汇合操作,这个就是和CBN的区别,CBN在第t时刻,也会考虑前3个时刻的统计量进行汇合,而CmBN操作不会,其仅仅在mini batch内部进行汇合操作
(3) 就是正常的应用BN,对输入进行变换输出即可
(4) 在mini batch的最后一个时刻,进行参数更新和可学习参数更新
https://www.zybuluo.com/huanghaian/note/1698991
https://blog.csdn.net/P_LarT/article/details/128026229
训练和测试时的区别
-
训练时,是对每一批的训练数据进行归一化,也即用每一批数据的均值和标准差。
默认track=True,会通过移动平均,记录训练数据的均值和标准差 -
测试时,模型训练完成,它的所有参数都确定了,包括均值和标准差, γ \gamma γ和 β \beta β 。如果训练时设置了track=True,保存了移动平均,则直接使用训练时得到的均值和标准差做测试。如果没有,则使用测试时计算的均值、标准差
Dropout
原理
在训练时以一定的概率使神经元失活,实际上就是让对应神经元的输出为0
训练和测试时的区别
- 训练和测试时为什么有差异?
- 训练时神经元有开有关,测试时全开
- 如何处理训练和测试时候的不一致性?Dropout 如何平衡训练和测试时的差异?
-
假设失活概率为 p ,就是这一层中的每个神经元都有p的概率失活,这样在训练和测试时,输出层每个神经元的输入和的期望会有量级上的差异。
-
因此在训练时还要对bn的输出数据除以(1-p)之后再传给下一层神经元,作为神经元失活的补偿,以使得在训练时和测试时每一层输入有大致相同的期望。
-
假设BN层输入的期望为a,在不使用dropout的时候,它的期望依旧是a。如果该层进行了dropout, 相当于有p的概率被丢弃,(1-p)的概率被保留,则此层的期望为(1-p)a1+pa0=(1-p)a, 为了保证输入与输出的期望一致,需要在训练的时候,对bn层的输出做:y = y / (1-p) 的处理。
多种类型的dropout: https://mp.weixin.qq.com/s/fTkMNaABWF3h0rpuam1XGw
https://blog.csdn.net/songyunli1111/article/details/89071021
https://zhuanlan.zhihu.com/p/61725100
其他:
- BN层的输出维度:上一层输出是NCHW,BN层的参数维度为
以下内容来自沐神第二版新书:
小结¶
- 批量归一化在全连接层和卷积层的使用略有不同。
- 另一方面,”减少内部协变量偏移“的原始动机似乎不是一个有效的解释。