当前位置:首页 » 《随便一记》 » 正文

聊聊深度学习中的Normalization——part 1_init__的博客

21 人参与  2022年02月20日 08:19  分类 : 《随便一记》  评论

点击全文阅读


在一个深度神经网络中,每一层的神经网络参数发生变化会影响其上层的输入数据分布,又因为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.

其他的Normalization方法,持续更新中。

参考资料

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

如有转载,请注明出处。


点击全文阅读


本文链接:http://zhangshiyu.com/post/34992.html

输入  分布  方差  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1