赞
踩
批量归一化是指对某一层的某一个批量数据进行归一化处理。方法是计算这个批量的均值和方差,利用如下公式处理批量数据:
x
i
+
1
=
γ
x
i
−
μ
B
σ
B
+
β
{x_{i+1}}^ = \gamma \frac{{{x_i} - {\mu _B}}}{{{\sigma _B}}} + \beta
xi+1=γσBxi−μB+β
其中
x
i
+
1
{x_{i+1}}
xi+1表示批归一化之后的数据,
μ
B
{\mu _B}
μB表示这个批量样本的均值,
σ
B
{\sigma _B}
σB表示样本方差。可以看到,批量归一化在我们熟知的归一化的基础上对数据做了拉伸和偏移(即参数
γ
\gamma
γ和参数
β
\beta
β),这也是批量归一化的灵魂。
如果仅仅是把数据做归一化使其符合高斯分布,虽然可以让网络训练更快,但某种程度上会限制网络的学习能力(把数据分布限制住了),而加入这两个参数后,相当于对数据做了尺度变换,这使得数据的分布可以更加自由(但是总体上依然大致符合高斯分布,戴着镣铐跳舞),而且这两个参数是可学习的,因此可以把批量归一化这个操作视为网络的一层,即BN层。
对于图像数据,批量归一化是在通道维进行的。稍微有点难以理解,举例说明:例如,一批64x32x256x256的数据,其均值和方差是在通道维求出的1x32x1x1的张量。单看每一个通道,把每个像素点当做样本,一个通道对应着64x256x256个像素数据,在通道维求均值也就是求这个通道对应的64x256x256个像素值的均值。得到的结果自然是1x32x1x1的张量。求出均值后每个像素点都带入上述公式计算批量归一化后的结果。
层数较深的网络一般来说收敛较慢,训练起来非常困难。最大的原因是:反向传播计算梯度时,越靠近输出的层更容易收敛,越靠近数据的层收敛会很慢。而靠近数据的网络层的参数稍微一改变,靠近输出的网络参数又需要重新更新,导致网络收敛慢,本质上是因为浅层和深层收敛不同步。
收敛不同步的原因是:深层网络参数的梯度一般比较大(链式法则求导,越靠近输出求导时连乘的偏导项越少),参数更新比较快;浅层网络参数的梯度一般很小(链式法则求导,越靠近数据端求导时连乘的偏导项越多,而偏导数一般比较小;那么偏导项越多,梯度值越小),非常容易出现梯度消失的问题,参数更新慢。
李沐老师给出的直觉上的解释是:让小批量的数据分布都近似符合正态分布,这样网络学起来更快(好吧没懂)。我个人的理解是,如果极端一点,在原本网络的每一层后面都加一层批量归一化层,那么每一层的数据分布大致都是一样的,这样网络学起来自然快;但问题是不能这样做,这会极大限制住网络的学习能力,因此BN层的数量应该酌情添加。 作者的解释是:BN可以减小训练时数据内部协变量的转移(O.o)。
还有一种说法是:BN实际上是在每一个小批量加入了噪声,理由是小批量的均值与方差可以认为是随机的。因为每一个小批量的数据量相对整个数据集来说是很小的,它的均值和方差代表不了整个数据集的均值和方差,具有很大的随机性,因此不同小批量的均值方差差异很大,视为随机噪声。向网络添加随机噪声是可以一定程度上缓解过拟合的,因此BN也被视为一种正则化的手段。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。