Batch Normalization

BN的目的

加速网络训练,减少网络中的 internal covariate shift. 由于训练集和测试集存在的 covariate shift, 也就是训练集和测试集不服从独立同分布,相关的解决方法我们称之为 domain adaptation。 在训练神经网络时,由于网络参数的变化,导致网络每一层的输入/输出的分布在迭代训练过程中也在不断发生变化,这对于网络的训练使不利的,BN的目的主要就是要解决该问题。BN论文原文对internal covariate shift 的论述为:(sec2)
We define Internal Covariate Shift as the change in the distribution of network activations due to the change in network parameters during training. To improve the training, we seek to reduce the internal covariate shift.
神经网络本就是在学习数据的分布,因此是不希望有这个internal covariate shift的.

BN的思路

  1. 在网络训练过程中,如果我们能保证网络每一层的非线性输入的分布保持稳定,优化器就不会陷入饱和状态,从而加速训练。方法就是固定每一层输入的均值和方差。
  2. BN对梯度的传播也有影响,能够减少梯度对参数规模和初始值的依赖。
  3. 进行BN操作时,可以使用高的学习率,而不会有divergence的风险。
  4. BN是对模型的正则化,使用BN之后可以不用再进行Dropout操作。
  5. BN通过防止网络(激活函数)陷入饱和模式,使饱和和非线性成为可能。

Batch Normalization 伪代码

在这里插入图片描述
x x x进行Batch Normalization得到 x ^ \hat{x} x^, 之后,又引入了放缩和平移系数 γ \gamma γ, β \beta β,这两个参数是需要通过梯度反向传播进行学习得到的,所以,BN最终实现的是将每一个Batch的均值和方差通过学习进行自适应的修正,而不是必须统一为均值为0方差为1的高斯分布。

BN是对每个Batch 进行Norm, 而不是整个训练集,这样BN的参数 γ \gamma γ, β \beta β就能参与梯度的反传过程。

另外,网络训练时,每个batch的均值和方差都会进行计算,然后使用滑动平均的方式,对均值和方差进行更新并保存,保存的均值和方差会在测试时使用到。(注意训练和测试时BN的不同)

BN的几点说明

1· 均值和方差的计算是有偏估计,在进行初始化时要进行偏差校正,有相应的理论公式推导。
2· 放缩和平移的作用是充分利用神经网络的非线性拟合能力,如果没有这个操作,经过归一化后的数据主要分布在0附近,当激活函数为sigmoid函数是,在0附近激活函数近似线性,为了避免数据分布都落在该近似线性区域,并提升网络的非线性拟合能力,因此进行缩放和平移操作,缩放和平移的极端情况是将逆变换为。
3· BN在训练和测试时的区别:训练时均值和方差是以指数移动平均的方式进行更新,测试时,则是利用训练集的均值和方差进行 BN。

Pytorch中的BN实现

torch.nn.BatchNorm1d
torch.nn.BatchNorm2d
torch.nn.BatchNorm3d

以一个全连接层为例,tensor的流程为 linear,BN,Activation,即我们是在linear之后,activation之前进行的batch norm操作,这样能够充分利用activation的中间的近似线性部分(非饱和部分),而没有利用它的饱和特性(以sigmoid激活函数为例进行理解)。

torch.nn.BatchNorm1d 中的参数。

Args:
        num_features: :math:`C` from an expected input of size
            :math:`(N, C, L)` or :math:`L` from input of size :math:`(N, L)`
            # 特征维数(该层神经元的节点数)
        eps: a value added to the denominator for numerical stability.
            Default: 1e-5
            # 对应伪代码中的扰动量 $\epsilon$
        momentum: the value used for the running_mean and running_var
            computation. Can be set to `None` for cumulative moving average
            (i.e. simple average). Default: 0.1
            # 训练时更新均值和方差的动量参数
        affine: a boolean value that when set to `True`, this module has
            learnable affine parameters. Default: `True`
            # 是否进行仿射变化,即是否引入放缩、平移参数 $\gamma$, $\beta$
        track_running_stats: a boolean value that when set to `True`, this
            module tracks the running mean and variance, and when set to `False`,
            this module does not track such statistics, and initializes statistics
            buffers :attr:`running_mean` and :attr:`running_var` as `None`.
            When these buffers are `None`, this module always uses batch statistics.
            in both training and eval modes. Default: `True` 
            # 是否跟踪均值和方差,即对均值和方差进行滑动更新

为什么BN能够加速网络训练

(论文sec4.2.1)

  1. 使用BN时可以使用高的学习率。
  2. 使用BN之后可以去掉Dropout, BN对网路有正则化的效果,Dropout会对BN产生影响。
  3. 彻底shuffle训练集。
  4. 减弱L2正则化。
  5. 加速学习率的衰减。
  6. 去掉局部相应标准化。
  7. 减小光度失真。

Batch Normalization 与 Layer Normlization的区别与联系

BN是将一个Batch的m个样本flow到某一层的某个神经元之后,对这m个样本进行Normalization, 即对特征表示的每一维进行Norm。
Layer Norm 是一个样本flow到网络的某一层的k个神经元,对这k个输出进行Norm.
假设NN中某一层的输出为 Z ( l ) = [ z ( 1 , l ) , z ( 2 , l ) , . . . , z ( m , l ) , ] Z^{(l)}=[z^{(1,l)}, z^{(2,l)}, ...,z^{(m,l)},] Z(l)=[z(1,l),z(2,l),...,z(m,l),], BN是对 Z ( l ) Z^{(l)} Z(l)的每一行(特征表示的每一维)进行Norm, LN是对 Z ( l ) Z^{(l)} Z(l)的每一列(每个样本)进行Norm.

Transformer/BERT中为什么用的是LN而不是BN?

首先是Transformer中LN的效果更好,更深层次的原因解释比较多,一个较为认同的观点是:图像数据是自然界客观存在的,像素的组织形式已经包含了“信息”,而NLP数据不一样,网络对NLP数据学习的真正开端是从‘embedding’开始的,而这个‘embedding’并不是客观存在的,它也是通过网络学习出来的。

解释1:LN 有助于得到一个球体空间中符合0均值1方差高斯分布的 embedding,BN 不具备这个功能。

解释2:LN 可以对 transformer 学习过程中由于多次条 embedding 累加可能带来的“尺度”问题施加约束,相当于对表达每个词一词多义的空间施加约束,有效降低模型方差,BN 不具备这个功能。

embedding 并不存在一个客观的分布,需要考虑的是:希望得到一个什么样分布的embedding?答案是,通过 LN 得到的 embedding 是在以坐标原点为中心,1 为标准差,越往外越稀疏的球体空间中的。

从正则化的角度进行理解,深度学习中的正则化就是通过把一部分不重要的复杂信息损失掉,以此来降低拟合难度以及过拟合风险,从而加速模型的收敛,norm 的目的就是让分布稳定下来,降低各维度数据的方差。

参考文献

Ioffe S, Szegedy C. Batch normalization: Accelerating deep network training by reducing internal covariate shift[C]//International conference on machine learning. PMLR, 2015: 448-456.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值