Batch Normalization技巧自从2015年被谷歌提出以来,因其有效提升网络训练效率,获得广泛应用与持续研究。然而,要透彻理解BN却不容易,下图是Kainming He在《Learning Deep Representations for Visual Recognition》报告中的一页,只需要注意右下角的红色描述。
图 1. 右下角的红色提示足见BN的费解. (来源: Learning Deep Representations for Visual Recognition)
大咖都会在BN上踩坑,可想而知,如果萌新接触这个概念,更是不易。因此《理解Batch Normalization系列》将对Batch Normalization做一个全面总结。
系列目录
理解Batch Normalization系列1——原理
理解Batch Normalization系列2——训练及评估
理解Batch Normalization系列3——为什么有效及若干讨论
理解Batch Normalization系列4——实践
本文目录
1 初始idea
2 原始神经网络的结构
3 BN的神经网络结构
4 BN的前向传播
4.1 标准化
4.2 缩放平移
5 BN实现的效果
6 总结
参考文献
1 初始idea
如果做神经网络训练前,对输入的像素进行标准化处理,将有效降低模型的训练难度。受此启发,作者想到,既然输入层可以加标准化有好处,那么网络里的隐层为什么不可以标准化?
于是,作者通过对每层加权和进行标准化,然后再通过缩放平移来“适度还原”。这样,做到了既不过分破坏输入信息,又抑制了各batch之间各位置点像素分布的剧烈变化带来的学习难度。
在原作中,最主要的思想就是下面这个公式。(别担心!只需要扫一眼即可!)
图 2. BN的核心思想. (来源: Batch Normalization Paper)
我们可以先绕开图2,分以下三步理解。
- 先了解BN给神经网络结构带来了什么。
- 然后理解BN是如何进行前向传播。
- 理解BN是如何进行前向传播
2 原始神经网络的结构
一个经典的神经网络,它的某一个隐层如图3所示。
图 3. 经典网络的示意图
为了和原始论文统一,将之前常见的加权和符号改用表示。即上一层输出的激活值为 ,那么经过本层加权和处理后,获得加权和,然后经过本层激活后即输出。
(符号短缺,代表求激活,代表方差)
3 BN的神经网络结构
加入BN之后的网络结构如图4所示。
图 4. 加入BN网络的示意图
很抱歉,为了容纳更多的有效信息,导致这个图有点复杂。总体上来说,对于本层的加权和,BN先进行标准化求出,再进行缩放和平移求出 ,这个取代了原始的进行激活。
关键就是标准化、缩放平移这两个环节。
4 BN的前向传播
认识BN的困难在于维度太多了!大脑里至少能联想到三个维度:batch_size维度(时间顺序维度)、网络层维度(结构横向维度)、向量维度(结构纵向维度)。
所以,当你了解图4的结构图,那么图5里用一个究极简明的例子,说明了BN到底在干啥,如果完全理解了图5,后面关于标准化、缩放平移只需要扫一眼黑体字即可。
(如果图中字符太小,请务必点击原图,放大后真的狠清晰)
图 5. BN前向传播示意图
4.1 标准化
标准化即对一组数据中的每个数字,减均值再除以标准差(给方差开个根号),就可把一个该组数据转换为一个均值为0方差为1的标准正态分布。
Batch Normalization的数据组的构造方法:一个batch上所有m个样本分别进行前向传播时,传到这个隐层时所有m个的每个维度,分别构成一个数据组。
在原始论文里,用下标B指的正是一个batch(也就是我们常说的mini-batch),包含m个样本。这也就是为啥叫Batch Normalization的原因。
- 对这m个,在每一个维度上标量们,分别求均值和方差。
- 得到的均值和方差分别对应该层的每个神经元维度。
只要我们求得均值和方差,就可以进行标准化了:
为避免分母为0的极端情况,工程上可以给分母增加一个非常小的小数(例如)。
4.2 缩放平移
由标准化公式可以反推出:
因此仿照这个公式,作者构造了下面这个公式,即 scale and shift 公式
很直觉就能看出来, 是对 的缩放, 是对的平移。可以增加可学习的参数、,如果, ,那么必然有 ,即我们就能够完全地还原成功!我们可以通过反向传播来训练这两个参数(推导表明这是可以训练的),而至于 多大程度上接近 , 多大程度上接近 ,让损失函数对它们计算出的梯度决定!注意,和都是向量。
因此,
- 只要损失函数有需要,公式(3)赋予了它左右BN层还原程度的能力,而且上限是完全还原;
- 具体对每一层还原多少,则是由损失函数对每一层这两个系数的梯度来决定;
- 损失通过梯度来控制还原的程度,较好利于减少损失,就多还原;较少利于减少损失,就少还原。
5 BN实现的效果
图 6. BN的效果
BN实现的效果是:对于某一层来说,它的每个元素的数值,在一个batch上的分布是一个任意的未知分布,BN首先把它标准化为了一个标准正态分布。
这样是否太暴力了?如果所有输入样本被层层改分布,相当于输入信息都损失掉了,网络是没法训练的。
所以需要第二步对标准正态分布再进行一定程度的还原操作,即缩放平移。
最终使得这个数值分布,兼顾保留有效信息、加速梯度训练。
6 总结
介绍了Batch Normalization的结构和前向传播,总之,就是在加权和后,加了一个标准化层、一个还原层。
标准化层,用来把一个batch_size上的该层该神经元的数值进行标准正态分布(均值为0,方差为1)
还原层,就是引入缩放系数、平移系数,让梯度决定还原程度。
设想虽好,如何训练?请关注下一期《理解Batch Normalization系列2——训练及评估》
参考文献
[1] https://arxiv.org/pdf/1502.03167v3.pdf
[2] https://r2rt.com/implementing-batch-normalization-in-tensorflow.html
[3] Adjusting for Dropout Variance in Batch Normalization and Weight Initialization
[4] https://www.jianshu.com/p/05f3e7ddf1e1
[7] https://panxiaoxie.cn/2018/07/28/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0-Batch-Normalization/
[8] https://www.tensorflow.org/api_docs/python/tf/layers/batch_normalization