论文:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

Internal Covariate Shift

深度神经网络涉及到很多层的叠加,而每一层的参数更新会导致上层的输入数据分布发生变化,通过层层叠加,高层的输入分布变化会非常剧烈,这就使得高层需要不断去重新适应底层的参数更新。为了训好模型,我们需要非常谨慎地去设定学习率、初始化权重、以及尽可能细致的参数更新策略。

Google 将这一现象总结为 Internal Covariate Shift,简称 ICS.

BatchNorm的基本思想:能不能让每个隐层节点的激活输入分布固定下来呢?这样就避免了“Internal Covariate Shift”问题了。

Mini-Batch SGD

BatchNorm是基于Mini-Batch SGD的。SGD训练的缺点:超参数调起来很麻烦。

所谓“Mini-Batch”,是指的从训练数据全集T中随机选择的一个训练数据子集合。假设训练数据集合T包含N个样本,而每个Mini-Batch的Batch Size为b,于是整个训练数据可被分成N/b个Mini-Batch。在模型通过SGD进行训练时,一般跑完一个Mini-Batch的实例,叫做完成训练的一步(step),跑完N/b步则整个训练数据完成一轮训练,则称为完成一个Epoch。完成一个Epoch训练过程后,对训练数据做随机Shuffle打乱训练数据顺序,重复上述步骤,然后开始下一个Epoch的训练,对模型完整充分的训练由多轮Epoch构成(参考图1)。

在拿到一个Mini-Batch进行参数更新时,首先根据当前Mini-Batch内的b个训练实例以及参数对应的损失函数的偏导数来进行计算,以获得参数更新的梯度方向,然后根据SGD算法进行参数更新,以此来达到本步(Step)更新模型参数并逐步寻优的过程。

批归一化的本质和意义

算法 1:批归一化变换,在一个 mini-batch 上应用于激活 x。

批归一化是一种用于训练神经网络模型的有效方法,是在深度神经网络训练过程中使得每一层神经网络的输入保持相同分布的。

BatchNorm的目标是对特征进行归一化处理(使每层网络的输出都经过激活),得到标准差为 1 的零均值状态。所以其相反的现象是非零均值。这将如何影响模型的训练: 首先,这可以被理解成非零均值是数据不围绕 0 值分布的现象,而是数据的大多数值大于 0 或小于 0。结合高方差问题,数据会变得非常大或非常小。在训练层数很多的神经网络时,这个问题很常见。如果特征不是分布在稳定的区间(从小到大的值)里,那么就会对网络的优化过程产生影响。我们都知道,优化神经网络将需要用到导数计算。其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。

假设一个简单的层计算$y = (W_{x} + b)$,y 在 W 上的导数就是这样:$d_{y}=dW_{x}$。因此,x 的值会直接影响导数的值(当然,神经网络模型的梯度概念不会如此之简单,但理论上,x 会影响导数)。因此,如果 x 引入了不稳定的变化,则这个导数要么过大,要么就过小,最终导致学习到的模型不稳定。而这也意味着当使用批归一化时,我们可以在训练中使用更高的学习率。

批归一化可帮助我们避免 x 的值在经过非线性激活函数之后陷入饱和的现象。也就是说,批归一化能够确保激活都不会过高或过低。这有助于权重学习——如果不使用这一方案,某些权重可能永远不会学习。这还能帮助我们降低对参数的初始值的依赖。

批归一化也可用作正则化(regularization)的一种形式,有助于实现过拟合的最小化。使用批归一化时,我们无需再使用过多的 dropout;这是很有助益的,因为我们无需担心再执行 dropout 时丢失太多信息。但是,仍然建议组合使用这两种技术。

均值为0,方差为1的标准正态分布代表什么含义:

这意味着在一个标准差范围内,也就是说64%的概率x其值落在[-1,1]的范围内,在两个标准差范围内,也就是说95%的概率x其值落在了[-2,2]的范围内。那么这又意味着什么?我们知道,激活值x=WU+B,U是真正的输入,x是某个神经元的激活值,假设非线性函数是sigmoid,那么看下sigmoid(x)其图形:

图:Sigmoid(x)

sigmoid(x)的导数为:G’=f(x)*(1-f(x)),因为f(x)=sigmoid(x)在0到1之间,所以G’在0到0.25之间,其对应的图如下:

假设没有经过BN调整前x的原先正态分布均值是-6,方差是1,那么意味着95%的值落在了[-8,-4]之间,那么对应的Sigmoid(x)函数的值明显接近于0,这是典型的梯度饱和区,在这个区域里梯度变化很慢,为什么是梯度饱和区?请看下sigmoid(x)如果取值接近0或者接近于1的时候对应导数函数取值,接近于0,意味着梯度变化很小甚至消失。而假设经过BN后,均值是0,方差是1,那么意味着95%的x值落在了[-2,2]区间内,很明显这一段是sigmoid(x)函数接近于线性变换的区域,意味着x的小变化会导致非线性函数值较大的变化,也即是梯度变化较大,对应导数函数图中明显大于0的区域,就是梯度非饱和区。

批归一化的局限性

局限1:BN是严重依赖Mini-Batch中的训练实例的

如果Batch Size比较小则任务效果有明显的下降。在小的BatchSize意味着数据样本少,因而得不到有效统计量,也就是说噪音太大。

局限2:对于有些像素级图片生成任务来说,BN效果不佳

对于图片分类等任务,只要能够找出关键特征,就能正确分类,这算是一种粗粒度的任务,在这种情形下通常BN是有积极效果的。但是对于有些输入输出都是图片的像素级别图片生成任务,比如图片风格转换等应用场景,使用BN会带来负面效果,这很可能是因为在Mini-Batch内多张无关的图片之间计算统计量,弱化了单张图片本身特有的一些细节信息。

局限3:RNN等动态网络使用BN效果不佳且使用起来不方便 !

对于RNN来说,尽管其结构看上去是个静态网络,但在实际运行展开时是个动态网络结构,因为输入的Sequence序列是不定长的,这源自同一个Mini-Batch中的训练实例有长有短。对于类似RNN这种动态网络结构,BN使用起来不方便,因为要应用BN,那么RNN的每个时间步需要维护各自的统计量,而Mini-Batch中的训练实例长短不一,这意味着RNN不同时间步的隐层会看到不同数量的输入数据,而这会给BN的正确使用带来问题。假设Mini-Batch中只有个别特别长的例子,那么对较深时间步深度的RNN网络隐层来说,其统计量不方便统计而且其统计有效性也非常值得怀疑。另外,如果在推理阶段遇到长度特别长的例子,也许根本在训练阶段都无法获得深层网络的统计量。综上,在RNN这种动态网络中使用BN很不方便,而且很多改进版本的BN应用在RNN效果也一般。

局限4:训练时和推理时统计量不一致

对于BN来说,采用Mini-Batch内实例来计算统计量,这在训练时没有问题,但是在模型训练好之后,在线推理的时候会有麻烦。因为在线推理或预测的时候,是单实例的,不存在Mini-Batch,所以就无法获得BN计算所需的均值和方差,一般解决方法是采用训练时刻记录的各个Mini-Batch的统计量的数学期望,以此来推算全局的均值和方差,在线推理时采用这样推导出的统计量。虽说实际使用并没大问题,但是确实存在训练和推理时刻统计量计算方法不一致的问题。

综上,共同点就是BN要求计算统计量的时候必须在同一个Mini-Batch内的实例之间进行统计,因此形成了Batch内实例之间的相互依赖和影响的关系。如何从根本上解决这些问题?一个自然的想法是:把对Batch的依赖去掉,转换统计集合范围。在统计均值方差的时候,不依赖Batch内数据,只用当前处理的单个训练数据来获得均值方差的统计量,这样因为不再依赖Batch内其它训练数据,那么就不存在因为Batch约束导致的问题。在BN后的几乎所有改进模型都是在这个指导思想下进行的。

但是这个指导思路尽管会解决BN带来的问题,又会引发新的问题,新的问题是:我们目前已经没有Batch内实例能够用来求统计量了,此时统计范围必须局限在一个训练实例内,一个训练实例看上去孤零零的无依无靠没有组织,怎么看也无法求统计量,所以核心问题是对于单个训练实例,统计范围怎么算?

====> 请看下一篇:

批归一化作用_批归一化(Batch Normalization)相关推荐

  1. 批归一化作用_批归一化Batch Normalization的原理及算法

    一.BN提出的背景意义 本文的背景文献是:<Batch Normalization: Accelerating Deep Network Training by Reducing Interna ...

  2. 批归一化作用_为什么数据要做归一化处理,什么是批归一化?

    原因: 我们知道网络一旦train起来,那么参数就要发生更新,除了输入层的数据外(因为输入层数据,我们已经人为的为每个样本归一化),后面网络每一层的输入数据分布是一直在发生变化的,因为在训练的时候,前 ...

  3. 深度学习中 Internal Covariate Shift 问题以及 Batch Normalization 的作用

    深度学习中 Internal Covariate Shift 问题以及 Batch Normalization 的作用 前言 一.Batch Normalization是什么? 1.1 Interna ...

  4. 像素值为什么归一化?归一化作用?

    答: 1.0-256数据较大且为整数,计算机进行计算时,容易造成精度丢失.如1/3 = 0: 2.在深度神经网络训练时一般使用较小的权重值来进行拟合,而当训练数据的值是较大整数值时,可能会减慢模型训练 ...

  5. Batch Normalization的诅咒

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者:Sahil Uppal 编译:ronghuaiyang 导读 ...

  6. Batch Normalization的一些缺陷

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:作者丨ronghuaiyang 来源丨AI公园 AI博士笔记 ...

  7. 花书+吴恩达深度学习(八)优化方法之 Batch normalization

    目录 0. 前言 1. Batch normalization 训练 2. Batch normalization 测试 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔~我会非常开心的~ 花书 ...

  8. Batch Normalization深入理解

    Batch Normalization深入理解 1. BN的提出背景是什么? 统计学习中的一个很重要的假设就是输入的分布是相对稳定的.如果这个假设不满足,则模型的收敛会很慢,甚至无法收敛.所以,对于一 ...

  9. 数据处理-Batch Normalization

    今年过年之前,MSRA和Google相继在ImagenNet图像识别数据集上报告他们的效果超越了人类水平,下面将分两期介绍两者的算法细节. 这次先讲Google的这篇<Batch Normali ...

最新文章

  1. Opencv实战 | 用摄像头自动化跟踪特定颜色物体
  2. Agile Manifesto and principle
  3. c++primer练习13.42
  4. java xml签名_Java使用DSA密钥对生成XML签名的方法
  5. 使用Mockito测试Spring组件
  6. 数字信号处理基础知识之DFT、DTFT、DFS、FFT基本概念扫盲
  7. 计算机操作系统实验银行家算法,实验六 银行家算法(下)
  8. python+ BeautifulSoup抓取“全国行政区划信息查询平台”的省市区信息
  9. flutter图片聊天泡泡_flutter即时聊天IM仿微信|flutter聊天界面
  10. python全栈开发-Day11 迭代器、生成器、面向过程编程
  11. JSK-390 计负均正【入门】
  12. node.js 使用数据校验 joi 报错:Cannot mix different versions of joi schemas
  13. 介绍几种初学者学习电脑入门知识的方法
  14. java架构师年薪_Java架构师一般的薪资是多少?高不高?
  15. 习题 9.10 已有a,b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列。
  16. 华为公司如何开好经营分析会(战略落地的核心抓手)?
  17. C/C++文件读写操作 —— windowsAPI
  18. 数学系出身,如何从零到一地开始机器学习
  19. 测试点击屏幕次数的软件_变视读为聆听,解决老同志阅读困难的一款实用的文字转语音软件...
  20. 2023年天津理工大学中环信息学院专升本专业课报名考试须知

热门文章

  1. Nginx listen指令处理连接请求
  2. f**k命令(解压神器)
  3. C++ 字符串、string、char *、char[]、const char*的转换和区别
  4. 牛客网前端刷题(二)
  5. 向右看齐 (排序问题)
  6. 通过RViz中的InteractiveMarkers在ROS中仿真力和力矩(wrench.force和wrench.torque)
  7. Vue2+Node.js前后端分离项目部署到云服务器
  8. 使用python的turtle画国旗
  9. Topsis模型小记
  10. 深入理解操作系统实验——bomb lab(phase_1)