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 后训练速度和准确度都有所提升,但是某一层的分布情况却相差甚微。基于此观察,作者提出了两个问题:

  1. BN 的有效性是否真的和 ICS 有关?
  2. 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?的更多相关文章

  1. Batch Normalization详解

    目录 动机 单层视角 多层视角 什么是Batch Normalization Batch Normalization的反向传播 Batch Normalization的预测阶段 Batch Norma ...

  2. [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 ________ ...

  3. Paper | Batch Normalization

    目录 1. PROBLEM 1.1. Introduction 1.2. Analysis 2. SOLUTION 2.1. Batch Normalization 及其问题 2.2. 梯度修正及其问 ...

  4. 转载-通俗理解BN(Batch Normalization)

    转自:参数优化方法 1. 深度学习流程简介 1)一次性设置(One time setup)          -激活函数(Activation functions) - 数据预处理(Data Prep ...

  5. 从Bayesian角度浅析Batch Normalization

    前置阅读:http://blog.csdn.net/happynear/article/details/44238541——Batch Norm阅读笔记与实现 前置阅读:http://www.zhih ...

  6. 深度学习网络层之 Batch Normalization

    Batch Normalization Ioffe 和 Szegedy 在2015年<Batch Normalization: Accelerating Deep Network Trainin ...

  7. Batch Normalization

    一.BN 的作用 1.具有快速训练收敛的特性:采用初始很大的学习率,然后学习率的衰减速度也很大 2.具有提高网络泛化能力的特性:不用去理会过拟合中drop out.L2正则项参数的选择问题 3.不需要 ...

  8. 使用TensorFlow中的Batch Normalization

    问题 训练神经网络是一个很复杂的过程,在前面提到了深度学习中常用的激活函数,例如ELU或者Relu的变体能够在开始训练的时候很大程度上减少梯度消失或者爆炸问题.但是却不能保证在训练过程中不出现该问题, ...

  9. 【深度学习】批归一化(Batch Normalization)

    BN是由Google于2015年提出,这是一个深度神经网络训练的技巧,它不仅可以加快了模型的收敛速度,而且更重要的是在一定程度缓解了深层网络中"梯度弥散"的问题,从而使得训练深层网 ...

随机推荐

  1. 关于chrome浏览器不能更新js的问题

    今天写程序时,突然发现无论我怎么改本地js,用chrome打开时,均是改动之前的效果,F12查看Sources时发现js文件并没有被改动.由此引发的问题,经查询解决方法如下: F12后按F1,出现Se ...

  2. MySQL索引的使用及注意事项

    索引是存储引擎用于快速找到记录的一种数据结构.索引优化应该是对查询性能优化最有效的手段了.索引能够轻易将查询性能提高几个数量级,"最优"的索引有时比一个"好的" ...

  3. openresty 配置 mongodb 可操作插件

    1.下载lua-resty-mongol https://github.com/bigplum/lua-resty-mongol 2.配置_mongo.conf文件,在conf创建_mongo.con ...

  4. thinkphp5实现定位功能

    一.所需资源链接:百度网盘.主要包含一个ip地址库和一个ip类文件. 二.下载好后,在extend目录下面创建一个location的目录,将下载的文件解压到该目录.给类文件增加一个命名空间,便于我们使 ...

  5. Asp.Net Core使用Log4Net优化日志【项目开源】

    我在前一篇文章中介绍了一种使用Log4Net的方法,但是那种方法打出来的日志不是很直观 然后我前不久阅读了一篇非常不错的博客:https://www.cnblogs.com/guolianyu/p/9 ...

  6. laravel form 表单提交

    form表单需要加token,不然会出现419错误,csrf_token不用自己生成,放进去就行,laravel自己会生成 路由: 控制器生成一个:

  7. Python写网络后台脚本

    Python写网络后台脚本. 首先安装Python3.6.5,在centos中自带的Python是2.6版本的,现在早就出现了3.6版本了况且2和3 之间的差距还是比较大的,所以我选择更新一下Pyth ...

  8. golang 多维哈希(map,hashmap)实践随笔

    有些场景使用多维哈希来存储数据,时间复杂度恒定,简单粗暴好用.这里记录一下. 如下是三维哈希的简单示意图,建议层数不要太多,否则时间久了,自己写的代码都不认识. 下图是三维哈希在内存的存储形式,has ...

  9. Matlab R2018a版离线使用帮助文档方法

    转载自:Matlab R2018a版离线使用帮助文档方法 问题 Matlab R2018a版本安装后,帮助文档默认为在线方式,需要使用账号登录,如果没有激活密钥或许可证编号,就无法使用帮助文档了. 方 ...

  10. geoserver中WMS服务详细说明

    官方geoserver中WMS服务中几种操作的API的详细说明地址: http://docs.geoserver.org/stable/en/user/services/wms/reference.h ...