一、不使用Batch Normalization
- 对某层的前向传播过程有:
- 针对该层的反向传播过程为:
- 连续多层的梯度反向传播过程为:
在梯度的连续反向传播过程中,是通过权重的连乘进行的。如果权重总是较小,则在反向过程中,梯度呈指数级衰减,就出现了梯度消失的问题;反之,则相应的就会出现梯度爆炸的问题。
结论:在反向传播过程中,权值的大小会极大的影响梯度的有效传播。因此,有必要在一定程度上限制甚至消除权值对梯度反向传播的不良影响。
二、使用Batch Normalization
- 带有BN的前向传播如下所示:
- 则其反向传播有:
- 相应的,连续多层的梯度反向传播过程为:
与不使用BN相比,每层的反向传播过程增加了一个基于标准差的矩阵对权重进行缩放。
这样的缩放能够产生什么效果?如果权重较小,那必然较小,从而使得其标准差较小,相对的较大,所以相对于原本的就放大了,避免了梯度的衰减;同样的,如果权重较大,可以很容易得到缩小,避免了梯度的膨胀。
加入了BN的反向传播过程中,不易出现梯度消失或梯度爆炸,梯度将始终保持在一个合理的范围内。好处:基于梯度的训练过程可以更加有效的进行,即加快收敛速度,减轻梯度消失或爆炸导致的无法训练的问题。
三、加入BN后的反向传播与权重尺度无关
四、关于Batch Normalization
- gamma与beta
正如文章中所说,使用gamma和beta是为了通过 "scale and shift" 操作来保证整个网络的capacity,毕竟,一直将feature限制在均值为0方差为1的分布下,明显是不那么明智的。尤其是在使用ReLU激活函时,将其输入限制在均值为0,相当于强制让其输出中总有一半为0,想想都觉得荒谬。- Batch Normalization的具体操作
首先,一般性的,我们可以先假设输入数据的维度为 (N, C, D),其中D在MLP中就是1,在2D CNN中就是(H, W)。而BN之所以称之为batch,就是因为normalization只沿batchsize维度进行,即N维。具体而言,就是针对每一个channel(也可以认为是对每一个神经元的输出),对batchsize求均值方差,对MLP而言,均值方差的求解是显而易见的;对2D CNN而言,就是将该channel对应的batchsize个维度为(H, W)的tensor求解出一对均值方差,对这batchsize个(H, W)的tensor,其每一个pixel value减去该均值并除以该方差。总而言之,就是normalization只在batch维进行,相应的gamma和beta也都是长度为channel_num的向量。
网友评论