关闭

[水文]Batch Normalization

754人阅读 评论(0) 收藏 举报
分类:

转载两个答案

答案一

作者:魏秀参

链接:http://www.zhihu.com/question/38102762/answer/85238569
来源:知乎

这里分五部分简单解释一下Batch Normalization (BN)。
1. What is BN?
顾名思义,batch normalization嘛,就是“批规范化”咯。Google在ICML文中描述的非常清晰,即在每次SGD时,通过mini-batch来对相应的activation做规范化操作,使得结果(输出信号各个维度)的均值为0,方差为1. 而最后的“scale and shift”操作则是为了让因训练所需而“刻意”加入的BN能够有可能还原最初的输入(即当
从而保证整个network的capacity。


关于DNN中的normalization,大家都知道白化(whitening),只是在模型训练过程中进行白化操作会带来过高的计算代价和运算时间。因此本文提出两种简化方式:1)直接对输入信号的每个维度做规范化(“normalize each scalar feature independently”);2)在每个mini-batch中计算得到mini-batch mean和variance来替代整体训练集的mean和variance. 这便是Algorithm 1.
关于DNN中的normalization,大家都知道白化(whitening),只是在模型训练过程中进行白化操作会带来过高的计算代价和运算时间。因此本文提出两种简化方式:1)直接对输入信号的每个维度做规范化(“normalize each scalar feature independently”);2)在每个mini-batch中计算得到mini-batch mean和variance来替代整体训练集的mean和variance. 这便是Algorithm 1.

2. How to Batch Normalize?
怎样学BN的参数在此就不赘述了,就是经典的chain rule:


3. Where to use BN?
BN可以应用于网络中任意的activation set。文中还特别指出在CNN中,BN应作用在非线性映射前,即对x=wu+b做规范化。另外对CNN的“权值共享”策略,BN还有其对应的做法(详见文中3.2节)。

4. Why BN?
好了,现在才是重头戏--为什么要用BN?BN work的原因是什么?
说到底,BN的提出还是为了克服深度神经网络难以训练的弊病。其实BN背后的insight非常简单,只是在文章中被Google复杂化了。
首先来说说“Internal Covariate Shift”。文章的title除了BN这样一个关键词,还有一个便是“ICS”。大家都知道在统计机器学习中的一个经典假设是“源空间(source domain)和目标空间(target domain)的数据分布(distribution)是一致的”。如果不一致,那么就出现了新的机器学习问题,如,transfer learning/domain adaptation等。而covariate shift就是分布不一致假设之下的一个分支问题,它是指源空间和目标空间的条件概率是一致的,但是其边缘概率不同,即:对所有

,但是. 

大家细想便会发现,的确,对于神经网络的各层输出,由于它们经过了层内操作作用,其分布显然与各层对应的输入信号分布不同,而且差异会随着网络深度增大而增大,可是它们所能“指示”的样本标记(label)仍然是不变的,这便符合了covariate shift的定义。由于是对层间信号的分析,也即是“internal”的来由。
那么好,为什么前面我说Google将其复杂化了。其实如果严格按照解决covariate shift的路子来做的话,大概就是上“importance weight”(ref)之类的机器学习方法。可是这里Google仅仅说“通过mini-batch来规范化某些层/所有层的输入,从而可以固定每层输入信号的均值与方差”就可以解决问题。如果covariate shift可以用这么简单的方法解决,那前人对其的研究也真真是白做了。此外,试想,均值方差一致的分布就是同样的分布吗?当然不是。显然,ICS只是这个问题的“包装纸”嘛,仅仅是一种high-level demonstration。
那BN到底是什么原理呢?说到底还是为了防止“梯度弥散”。关于梯度弥散,大家都知道一个简单的栗子:0.9^30≈0.04。在BN中,是通过将activation规范为均值和方差一致的手段使得原本会减小的activation的scale变大。可以说是一种更有效的local response normalization方法(见4.2.1节)。

5. When to use BN?
OK,说完BN的优势,自然可以知道什么时候用BN比较好。例如,在神经网络训练时遇到收敛速度很慢,或梯度爆炸等无法训练的状况时可以尝试BN来解决。另外,在一般使用情况下也可以加入BN来加快训练速度,提高模型精度。


诚然,在DL中还有许多除BN之外的“小trick”。别看是“小trick”,实则是“大杀器”,正所谓“The devil is in the details”。希望了解其它DL trick(特别是CNN)的各位请移步我之前总结的:Must Know Tips/Tricks in Deep Neural Networks


答案二
作者:纳米酱
链接:http://www.zhihu.com/question/38102762/answer/84238772
来源:知乎

用点比较俏皮的语言简单说说个人理解,学术上可能有点过于俏皮:
  1. 批训练会带来梯度之间的互相竞争,竞争有好处,诸如避开局部优,然而也带来效率上的问题,比如10个batch,前8个要求z方向+0.1,后两个要求z方向-0.4,最终有效梯度为0.8-0.4*2=0,这种竞争消耗着效率。
  2. 对于深层模型,越底层,越到训练后期,这种batch梯度之间的方向竞争会变得厉害(这是统计上的,某个时刻不一定成立),类似饱和。深层模型都用不着坐等梯度衰减,光是batch方向感就乱了训练效率。如果将不同batch看成不同的人,本来要求适当的竞争回避局部优,结果导致恶性竞争乱了大局。
  3. 改变措施很多,如在优化中引入不同batch梯度的记忆,包括强度的记忆(rmsprop)和以及强度和方向的记忆(adam),这样可以利用前面一些batch的长处或者某种统计倾向去修正后面的batch的梯度。这些方法,都是要求后来人忍让前面的人从而规范的,是出了事才去约束竞争的方法,是局部以及某个小训练时刻的动态调整,不是全局调整。
  4. BN算一种全局的调整(实际算法需要动态更新一些参数,只是因为算不动而做,不是算法思想本身需要)。虽然BN是对每层的输入进行线性变换,但这完全可以等价到该层的参数变换去,于是,抽取掉每时每刻都不均一的输入方差和中心,统一换用训练调整出来的方差和中心(gamma和beta这些),直观上,一定程度限制参数在不同batch上瞎跑,防止梯度方向竞争进入”白热化“。俏皮点说,类似是规范了行业标准,发现batch之间的恶性方向竞争会弱化。
  5. 但是,BN仍然不是最好的全局调整,最好的应该是随时都能保证参数的分布在不同层都有可比的标准,就是说:行业规范及早定,定好就不要频繁的动态变更。这种思考,便是Natural Gradient,Natural Gradient在ML中相当于引入大约束到损失函数,这个约束规范并控制着参数的分布保持不变,也有几何上的理解,具体参考:arxiv.org/abs/1301.3584arxiv.org/abs/1303.0818。近来NIPS上有些研究声称利用Natural Gradient思想到深层神经网络,其某种近似类似BN,但是效果会比BN强一点。arxiv.org/abs/1507.0021
  6. BN大法好,但可能不是最好!猜测一下,这些看起来一点也不漂亮的调参是不是都是trick,黑魔法背后会不会有非常朴素干净统一的理解呢?蛤~

参考文献
Ioffe, Sergey, and Christian Szegedy. "Batch normalization: Accelerating deep network training by reducing internal covariate shift."arXiv preprint arXiv:1502.03167 (2015).

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:88130次
    • 积分:1109
    • 等级:
    • 排名:千里之外
    • 原创:24篇
    • 转载:6篇
    • 译文:0篇
    • 评论:101条
    博客专栏
    文章分类
    最新评论