How Does Batch Normalization Help Optimization?
1. 摘要
BN 是一个广泛应用的用于快速稳定地训练深度神经网络的技术,但是我们对其有效性的真正原因仍然所知甚少。
输入分布的稳定性和 BN 的成功之间关系很小,BN 对训练过程更根本的影响是:它让优化更加平滑。这种平滑让梯度更加可预测更加稳定,从而加速训练。
2. BN 和 internal covariate shift
在原始论文 Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift 中,作者认为 BN 减小了所谓的 internal covariate shift(ICS),这也被认为是 BN 成功的根基。
于是,作者就做了一个实验。在有和没有 BN 的情况下分别训练了一个 VGG 网络,然后观察某一层在训练过程中的分布情况。

可以看到,加入 BN 后训练速度和准确度都有所提升,但是某一层的分布情况却相差甚微。基于此观察,作者提出了两个问题:
- BN 的有效性是否真的和 ICS 有关?
- BN 让输入分布稳定是否能有效减小 ICS?
接下来,我们对这两个问题问题深入探讨。
2.1. BN 的性能提升是否来源于控制 ICS
BN 的中心思想就是说控制输入分布的均值和方差可以提升训练性能,怎么才能证明吗?那我们就来看看在 BN 后面引入随机噪声会发生什么。

这里的噪声在每一次都是不一样的,所以就会使激活值产生严重的偏移,实验结果如下。

引入噪声后的 BN 相比标准网络分布更加不稳定,但是在训练过程中依然表现非常好,这显然与之前的说法冲突。
2.2. BN 是否能减小 ICS
上面的实验说明,如果我们将 ICS 和输入分布的均值及方差稳定性联系在一起的话,显然 ICS 和训练性能没有直接联系。但是,我们可能会怀疑:是否有一个对 ICS 更广泛的定义使其与训练性能有直接联系呢?如果是的话,BN 确实能减小 ICS 吗?
原论文中关于 ICS 的定义是:网络中参数的变化引起的输入分布的变化。为了衡量前面层参数的更新而导致后面参数需要调整的程度,我们来比较每一层在前面所有层参数更新前后的梯度差异。也就有了下面的定义:

这样,G 和 G' 的差异就反映了输入的变化引起的优化环境相对于权重的变化。针对上面的定义,作者比较了有无 BN 的网络在训练过程中上述差异的变化情况,如下所示。

可以看到,配备了 BN 后,上述差异变化得反而更加剧烈,尤其是相对于没有激活函数的 DLN 网络。也即是,从优化的角度来说, BN 甚至没有减小 ICS。
3. BN 为什么有效
除了减小 ICS,BN 还有其他很多优点:防止梯度消失爆炸、对诸如学习率和参数初始化策略的不同设置比较鲁棒、防止落入激活函数的饱和区。这些特性明显都有利于训练,但是,它们都是 BN 简单的结果而不是真正底层的原因。
3.1. BN 的平滑效果
- 概念引入
一个函数 f 是 L-Lipschitz 的,如果它满足:

非负的实数 L 是斜率的最小上确界,称之为利普希茨常数。

也就是说,利普希茨常数限制了函数可以改变得多快。换句话说,如果没有利普希茨常数,函数可以无限快地改变,也就是不连续了。
将上式展开可以得到:

也就是固定了 x1,x2 的函数值是一个线性函数,并且被 L 约束在了一个范围内。

一个连续可微的函数是贝塔平滑的如果它的梯度满足贝塔利普希茨,也就是:

同理我们可知,贝塔平滑是限制一个函数的一阶导数变化得多快的。
作者发现,BN 的关键作用是让优化过程更加平滑,也就是,损失改变得更慢而且梯度的幅值也更小。更深层次的原因则是 BN 的重新参数化让损失函数更加利普希茨更加贝塔平滑。

引入 BN 后的损失函数就像上面的右图那样更加平滑,梯度更加可靠更加可预测,即使我们走了一大步,梯度的方向仍然是真实梯度的准确估计。
3.2. 优化过程的探索
为了展示 BN 对优化过程的稳定,作者进行了下面的实验。在训练过程中的每一步,通过移动不同的步长,我们来观察损失函数、梯度的变化情况。

可以发现,引入 BN 后损失函数、梯度以及“有效”的贝塔平滑都更加稳定。

3.3. BN 是最好的或者唯一的平滑优化过程的方法吗?

作者发现,用范数进行归一化也可以取得和 BN 类似的效果,BN 的有效可能只是一个偶然的发现。
3.4. 理论分析

针对未引入 BN 的普通网络以及引入 BN 后的网络,作者推导了它们梯度的相对关系。

引入了 BN 后,损失函数相对于激活函数值的梯度幅值更小,也即损失函数更加利普希兹。

引入了 BN 后,损失函数相对于激活函数值的二阶项幅值更小,也即损失函数更加贝塔平滑。

同理,损失函数相对于权重的梯度幅值也更小。

引入 BN 后,权重的最优解与初始解的距离也更小,也即神经网络更快就可以训练到最佳表现。
获取更多精彩,请关注「seniusen」!

How Does Batch Normalization Help Optimization?的更多相关文章
- Batch Normalization详解
目录 动机 单层视角 多层视角 什么是Batch Normalization Batch Normalization的反向传播 Batch Normalization的预测阶段 Batch Norma ...
- [CS231n-CNN] Training Neural Networks Part 1 : activation functions, weight initialization, gradient flow, batch normalization | babysitting the learning process, hyperparameter optimization
课程主页:http://cs231n.stanford.edu/ Introduction to neural networks -Training Neural Network ________ ...
- Paper | Batch Normalization
目录 1. PROBLEM 1.1. Introduction 1.2. Analysis 2. SOLUTION 2.1. Batch Normalization 及其问题 2.2. 梯度修正及其问 ...
- 转载-通俗理解BN(Batch Normalization)
转自:参数优化方法 1. 深度学习流程简介 1)一次性设置(One time setup) -激活函数(Activation functions) - 数据预处理(Data Prep ...
- 从Bayesian角度浅析Batch Normalization
前置阅读:http://blog.csdn.net/happynear/article/details/44238541——Batch Norm阅读笔记与实现 前置阅读:http://www.zhih ...
- 深度学习网络层之 Batch Normalization
Batch Normalization Ioffe 和 Szegedy 在2015年<Batch Normalization: Accelerating Deep Network Trainin ...
- Batch Normalization
一.BN 的作用 1.具有快速训练收敛的特性:采用初始很大的学习率,然后学习率的衰减速度也很大 2.具有提高网络泛化能力的特性:不用去理会过拟合中drop out.L2正则项参数的选择问题 3.不需要 ...
- 使用TensorFlow中的Batch Normalization
问题 训练神经网络是一个很复杂的过程,在前面提到了深度学习中常用的激活函数,例如ELU或者Relu的变体能够在开始训练的时候很大程度上减少梯度消失或者爆炸问题.但是却不能保证在训练过程中不出现该问题, ...
- 【深度学习】批归一化(Batch Normalization)
BN是由Google于2015年提出,这是一个深度神经网络训练的技巧,它不仅可以加快了模型的收敛速度,而且更重要的是在一定程度缓解了深层网络中"梯度弥散"的问题,从而使得训练深层网 ...
随机推荐
- 架构风格:你真的懂REST吗?
本文探讨如下几个问题: 什么是REST REST包含哪些约束 什么是RESTful 纯RESTful API的难点在哪里 如果你去搜索「什么是REST」的话,大部分情况下,你看到的基本都是RESTfu ...
- 如何理解低耦合AND高内聚?[转]
1.高内聚 首先我们来看看内聚的含义:软件含义上的内聚其实是从化学中的分子的内聚演变过来的,化学中的分子间的作用力,作用力强则表现为内聚程度高.在软件中内聚程度的高低,标识着软件设计的好坏. 我们在进 ...
- ArrayList详解
一.ArrayList类介绍:(这里给出jdk1.8源码上中文翻译) ArrayList是List接口以可变数组方式实现的,实现了所有的lis接口中的操作,并容许有null等所有元素.除了实现了Lis ...
- Oracle行转列,pivot函数和unpivot函数
pivot函数:行转列函数: 语法:pivot(任一聚合函数 for 需专列的值所在列名 in (需转为列名的值)):unpivot函数:列转行函数: 语法:unpivot(新增值所在列的列名 for ...
- hashMap 和 linkedHashMap 的区别和联系
直接举例说明. 运行如下例子程序 mport java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; ...
- SQL语句中生成UUID方法
SQL语句中生成UUID方法为UUID() 生成带横线UUID: select UUID() 形如:abaffaca-fd55-11e5-b3d0-d2 ...
- go加密算法:非对称加密(二)--Hash
关于一些加密算法的应用和信息,可以在以下博客中查找到: https://www.cnblogs.com/charlesblc/p/6130141.html // MyHash package main ...
- UML类图介绍以及PlantUML使用方法
类的UML表示方法 UML介绍 类图,是UML(统一建模语言)中用于描述"类"以及"类与类"之间的示意图.它形象的描述出了系统的结构,帮助人们理解系统. 类图是 ...
- 第七篇:gcc和arm-linux-gcc常用选项
目录 一.gcc和arm-linux-gcc的常用选项 二.从.c文件到可执行文件过程 一.gcc和arm-linux-gcc的常用选项 常用选型 -v 查看gcc编译器的版本,显示gcc执行时的详细 ...
- ubuntu 防止软件包自动更新
阻止软件包升级 有两种方法阻止软件包升级,使用dpkg,或者在Woody中使用APT. 使用dpkg,首先导出软件包选择列表: dpkg --get-selections \* > select ...