聊聊深度学习中的BN和LN

在一个深度神经网络中,每一层的神经网络参数发生变化会影响其上层的输入数据分布,又因为DP的网络深度较大,这样层层叠加,导致高层的输入分布变化较大,使得高层的参数需要不断的去适应底层的参数更新。导致神经网络难以训练。

这听起来很糟糕,那么有什么方案去解决这个问题呢?
我们可以为每一层都设立不同的学习率、不同的初始化策略等,去解决这个问题。但是这样的解决方案非常麻烦,而且需要很多人为的经验。而Normalization能够较好的解决该问题,且不需要为每一层单独设置学习率等。

什么是Normalization

上节说到,高层的输入数据由于底层的参数变化发生剧烈震荡,那么在送入上层神经元之前,首先对数据进行平移和伸缩变化,使其分布规范化成在固定区间的标准分布。进一步的,假设有输入向量 x = ( x 1 , x 2 , ⋯   , x d ) x=(x_1,x_2,\cdots,x_d) x=(x1,x2,,xd),令其变化为:
x = g ⋅ x − μ σ + b x=g \cdot \frac{x-\mu}{\sigma} + b x=gσxμ+b
其中, μ \mu μ x x x的均值, σ \sigma σ x x x的方差,最终我们会得到均值是 b b b,方差是 g 2 g^2 g2的分布; g g g b b b均是可以学习的。

将其规范化到均值为0,方差为1的数据分布不行么?为什么要再将其rescale到均值为 b b b,方差为 g 2 g^2 g2的分布?

其目的是,保证模型的capacity。 最后的rescale操作可以理解为加入的Normalization有可能可以还原原来的输入。当然,这个操作有可能会改变原来的输入,也有可能不改变。如此,既可以保持原输入,又可以改变原输入,其模型的capacity就提升了。而且,增加了rescale之后,与下层计算解耦,可以简化神经网络的训练。

接下来,我们将介绍一些常用的Normalization的方法。

Batch Normalization(BN)

BN是针对每一个batch中的样本的同一个维度特征做处理。其计算方式如下:
在这里插入图片描述

  • BN独立的规范化每一个输入的维度,且其规范化的参数为每个mini batch的均值和方差。这相当于隐性的要求每一个mini batch与整个train样本之间是同分布的,如果mini batch与所有的train的数据分布近似相同,那么对该mini batch的训练可以认为引入了噪声,可以增强泛化性;但是如果数据分布差距很大,那么将会导致模型的效果不好。因此,在做BN时,最好batch设置的比较大,且做好充分的shuffle
  • BN可以有效防止梯度弥散。 一般来说,我们都是在激活函数之前去做BN(当然,这不是说BN就不能放在激活函数之后),通过BN我们能将输入的数据规范在梯度较大的范围,从而防止梯度弥散。
  • BN在RNN上效果不佳。原因可能是因为RNN的输入是动态的,也就是说,对语句较长的句子可能只有几个样本,这些样本很有可能不在一个batch中,那么对于这个维度的数据而言,其样本数太少,其统计量不具有代表性,从而导致其效果不佳。该问题其实可以限制每个batch的句子长度相近来缓解。更大的问题是,在NLP任务中,BN是对每个单词做处理。举个例子,针对下面这两句话,认为I和today是同一个维度的特征,这显然不合理。

Today is a good day.
I love China.

Layer Normalization(LN)

LN在NLP任务中更为常用,比如在transformer中,使用的nomalization方法就是LN而非BN,那么LN是怎么计算的呢?
相较于BN计算的是每一个batch的每一个特征维度,LN每次只针对每个样本的所有特征维度计算。因为LN每次只针对一个样本,不依赖于其他的数据,所以避免了BN中mini batch数据分布的问题。

回到之前的例子:
Today is a good day.
做LN时,会将这几个单词一起做归一化,这样的处理相比BN能符合直觉。因为这样的处理,会使得句子中的每个单词都包含一部分的语义信息。

但是,BN 的转换是针对单个神经元可训练的——不同神经元的输入经过再平移和再缩放后分布在不同的区间,而 LN 对于一整层的神经元训练得到同一个转换——所有的输入都在同一个区间范围内。如果不同输入特征不属于相似的类别(比如颜色和大小),那么 LN 的处理可能会降低模型的表达能力。

参考资料

深度学习的BN为什么效果好
李宏毅的batch normalization
各种Normalization
详解深度学习中的Normalization,BN/LN/WN

如有转载,请注明出处。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值