深度学习 | BN层原理浅谈
文章目录
- 深度学习 | BN层原理浅谈
- 一. 背景
- 二. BN层作用
- 三. 计算原理
- 四. 注意事项
- 为什么BN层一般用在线性层和卷积层的后面,而不是放在激活函数后
- 为什么BN能抑制过拟合(有争议)
一. 背景
神经网络在训练时,由于内存限制,各框架都会设置batch和epoch的概念来进行训练。
每个batch内采样的训练数据的分布各不相同,那么网络就要在每次迭代都去学习以适应不同的分布。对于深度学习这种包含很多隐层的网络结构,各隐层学到的权重等参数都在不停的变化,导致隐层的输入分布老是变来变去,产生了所谓的“Internal Covariate Shift”(内部协变量偏移)现象,
使用更好的参数初始化或者使用较低的分辨率能够一定程度上缓和这个问题,但是会大大降低网络的训练速度,为了保证隐层分布稳定及训练速度,Batch Nomalization算法随之而来;
二. BN层作用
(1)将每一隐层参数都归一化至均值0、方差为1,输出至下一隐层;
(2)加速网络收敛速度,可以使用较大的学习率来训练网络
(3)改善梯度弥散
(4)提高网络的泛化能力
(5)BN层一般用在线性层和卷积层后面,而不是放在非线性单元后
三. 计算原理
BN层对每一个batch内样本的features中计算其均值 μ \mu μ和方差σ,然后对每一个x减去均值除以标准差,最后利用超参数 γ \gamma γ和 β \beta β进行仿射变换,即可得到最终的BN输出y,具体过程如下:
1.计算样本均值。
2.计算样本方差。
3.样本数据标准化处理。
4.进行平移和缩放处理。引入了
γ
\gamma
γ和
β
\beta
β两个参数。来训练γ和β两个参数。引入了这个可学习重构参数
γ
\gamma
γ和
β
\beta
β,让我们的网络可以学习恢复出原始网络所要学习的特征分布。
四. 注意事项
为什么BN层一般用在线性层和卷积层的后面,而不是放在激活函数后
因为激活函数一般为非线性,非线性单元的输出分布形状会在训练过程中发生变化,归一化无法消除它的方差偏移,相反的,全连接和卷积层的输出一般是一个对称的,非稀疏的一个分布,更加类似于高斯分布,对他们进行归一化会产生更加稳定的分布。例如Relu激活函数,如果输入的数据是一个高斯分布,经过Relu输出的数据小于0的被抑制,就不是高斯分布了。
为什么BN能抑制过拟合(有争议)
BN每个batch采样的数据都不一样,但是每次的batch的数据都会被局部均值和方差作用,可以认为是引入了噪声,增强了过拟合能力。