文章来自:公众号【机器学习炼丹术】。求关注~

其实关于BN层,我在之前的文章“梯度爆炸”那一篇中已经涉及到了,但是鉴于面试经历中多次问道这个,这里再做一个更加全面的讲解。

Internal Covariate Shift(ICS)

Batch Normalization的原论文作者给了Internal Covariate Shift一个较规范的定义:在深层网络训练的过程中,由于网络中参数变化而引起内部结点数据分布发生变化的这一过程被称作Internal Covariate Shift。

这里做一个简单的数学定义,对于全链接网络而言,第i层的数学表达可以体现为:

\(Z^i=W^i\times input^i+b^i\)

\(input^{i+1}=g^i(Z^i)\)

  • 第一个公式就是一个简单的线性变换;
  • 第二个公式是表示一个激活函数的过程。

【怎么理解ICS问题】

我们知道,随着梯度下降的进行,每一层的参数\(W^i,b^i\)都会不断地更新,这意味着\(Z^i\)的分布也不断地改变,从而\(input^{i+1}\)的分布发生了改变。这意味着,除了第一层的输入数据不改变,之后所有层的输入数据的分布都会随着模型参数的更新发生改变,而每一层就要不停的去适应这种数据分布的变化,这个过程就是Internal Covariate Shift。

BN解决的问题

【ICS带来的收敛速度慢】

因为每一层的参数不断发生变化,从而每一层的计算结果的分布发生变化,后层网络不断地适应这种分布变化,这个时候会让整个网络的学习速度过慢。

【梯度饱和问题】

因为神经网络中经常会采用sigmoid,tanh这样的饱和激活函数(saturated actication function),因此模型训练有陷入梯度饱和区的风险。解决这样的梯度饱和问题有两个思路:第一种就是更为非饱和性激活函数,例如线性整流函数ReLU可以在一定程度上解决训练进入梯度饱和区的问题。另一种思路是,我们可以让激活函数的输入分布保持在一个稳定状态来尽可能避免它们陷入梯度饱和区,这也就是Normalization的思路。

Batch Normalization

batchNormalization就像是名字一样,对一个batch的数据进行normalization。

现在假设一个batch有3个数据,每个数据有两个特征:(1,2),(2,3),(0,1)

如果做一个简单的normalization,那么就是计算均值和方差,把数据减去均值除以标准差,变成0均值1方差的标准形式。

对于第一个特征来说:

\(\mu=\frac{1}{3}(1+2+0)=1\)

\(\sigma^2=\frac{1}{3}((1-1)^2+(2-1)^2+(0-1)^2)=0.67\)

【通用公式】

\(\mu=\frac{1}{m}\sum_{i=1}^m{Z}\)

\(\sigma^2=\frac{1}{m}\sum_{i=1}^m(Z-\mu)\)

\(\hat{Z}=\frac{Z-\mu}{\sqrt{\sigma^2+\epsilon}}\)

  • 其中m表示一个batch的数量。
  • \(\epsilon\)是一个极小数,防止分母为0。

目前为止,我们做到了让每个特征的分布均值为0,方差为1。这样分布都一样,一定不会有ICS问题

如同上面提到的,Normalization操作我们虽然缓解了ICS问题,让每一层网络的输入数据分布都变得稳定,但却导致了数据表达能力的缺失。每一层的分布都相同,所有任务的数据分布都相同,模型学啥呢

【0均值1方差数据的弊端】

  1. 数据表达能力的缺失;
  2. 通过让每一层的输入分布均值为0,方差为1,会使得输入在经过sigmoid或tanh激活函数时,容易陷入非线性激活函数的线性区域。(线性区域和饱和区域都不理想,最好是非线性区域)

为了解决这个问题,BN层引入了两个可学习的参数\(\gamma\)和\(\beta\),这样,经过BN层normalization的数据其实是服从\(\beta\)均值,\(\gamma^2\)方差的数据。

所以对于某一层的网络来说,我们现在变成这样的流程:

  1. \(Z=W\times input^i+b\)
  2. \(\hat{Z}=\gamma \times \frac{Z-\mu}{\sqrt{\sigma^2+\epsilon}}+\beta\)
  3. \(input^{i+1}=g(\hat{Z})\)

(上面公式中,省略了\(i\),总的来说是表示第i层的网络层产生第i+1层输入数据的过程)

测试阶段的BN

我们知道BN在每一层计算的\(\mu\)与\(\sigma^2\) 都是基于当前batch中的训练数据,但是这就带来了一个问题:我们在预测阶段,有可能只需要预测一个样本或很少的样本,没有像训练样本中那么多的数据,这样的\(\sigma^2\)和\(\mu\)要怎么计算呢?

利用训练集训练好模型之后,其实每一层的BN层都保留下了每一个batch算出来的\(\mu\)和\(\sigma^2\).然后呢利用整体的训练集来估计测试集的\(\mu_{test}\)和\(\sigma_{test}^2\)

\(\mu_{test}=E(\mu_{train})\)

\(\sigma_{test}^2=\frac{m}{m-1}E(\sigma_{train}^2)\)

然后再对测试机进行BN层:

当然,计算训练集的\(\mu\)和\(\simga\)的方法除了上面的求均值之外。吴恩达老师在其课程中也提出了,可以使用指数加权平均的方法。不过都是同样的道理,根据整个训练集来估计测试机的均值方差。

BN层的好处有哪些

  1. BN使得网络中每层输入数据的分布相对稳定,加速模型学习速度。

    BN通过规范化与线性变换使得每一层网络的输入数据的均值与方差都在一定范围内,使得后一层网络不必不断去适应底层网络中输入的变化,从而实现了网络中层与层之间的解耦,允许每一层进行独立学习,有利于提高整个神经网络的学习速度。

  2. BN允许网络使用饱和性激活函数(例如sigmoid,tanh等),缓解梯度消失问题

    通过normalize操作可以让激活函数的输入数据落在梯度非饱和区,缓解梯度消失的问题;另外通过自适应学习\(\gamma\)与 \(\beta\) 又让数据保留更多的原始信息。

  3. BN具有一定的正则化效果

    在Batch Normalization中,由于我们使用mini-batch的均值与方差作为对整体训练样本均值与方差的估计,尽管每一个batch中的数据都是从总体样本中抽样得到,但不同mini-batch的均值与方差会有所不同,这就为网络的学习过程中增加了随机噪音

BN与其他normalizaiton的比较

【weight normalization】

Weight Normalization是对网络权值进行normalization,也就是L2 norm。

相对于BN有下面的优势:

  1. WN通过重写神经网络的权重的方式来加速网络参数的收敛,不依赖于mini-batch。BN因为以来minibatch所以BN不能用于RNN网路,而WN可以。而且BN要保存每一个batch的均值方差,所以WN节省内存;
  2. BN的优点中有正则化效果,但是添加噪音不适合对噪声敏感的强化学习、GAN等网络。WN可以引入更小的噪音。

但是WN要特别注意参数初始化的选择。


【Layer normalization】

更常见的比较是BN与LN的比较。

BN层有两个缺点:

  1. 无法进行在线学习,因为在线学习的mini-batch为1;LN可以
  2. 之前提到的BN不能用在RNN中;LN可以
  3. 消耗一定的内存来记录均值和方差;LN不用

但是,在CNN中LN并没有取得比BN更好的效果。

参考链接:

  1. https://zhuanlan.zhihu.com/p/34879333
  2. https://www.zhihu.com/question/59728870
  3. https://zhuanlan.zhihu.com/p/113233908
  4. https://www.zhihu.com/question/55890057/answer/267872896





干货 | 这可能全网最好的BatchNorm详解的更多相关文章

  1. [转帖]HTTPS系列干货(一):HTTPS 原理详解

    HTTPS系列干货(一):HTTPS 原理详解 https://tech.upyun.com/article/192/HTTPS%E7%B3%BB%E5%88%97%E5%B9%B2%E8%B4%A7 ...

  2. 【转】HTTPS系列干货(一):HTTPS 原理详解

    HTTPS系列干货(一):HTTPS 原理详解 前言 HTTPS(全称:HyperText Transfer Protocol over Secure Socket Layer),其实 HTTPS 并 ...

  3. Mybatis系列全解(五):全网最全!详解Mybatis的Mapper映射文件

    封面:洛小汐 作者:潘潘 若不是生活所迫,谁愿意背负一身才华. 前言 上节我们介绍了 < Mybatis系列全解(四):全网最全!Mybatis配置文件 XML 全貌详解 >,内容很详细( ...

  4. HTTPS系列干货(一):HTTPS 原理详解

    HTTPS(全称:HyperText Transfer Protocol over Secure Socket Layer),其实 HTTPS 并不是一个新鲜协议,Google 很早就开始启用了,初衷 ...

  5. 【腾讯Bugly干货分享】iOS10 SiriKit QQ适配详解

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57ece0331288fb4d31137da6 1. 概述 苹果在iOS10开放 ...

  6. 干货分享:Academic Essay写作套路详解

    你想过如何中立的表达自己吗?大概只有10%不到的同学,会真正重视这个细节.但很多留学生能顺利写完作文已经不容易,还要注意什么中立不中立的.我知道这个标准,对许多同学有些过分,但很残酷的告诉你,这的确是 ...

  7. 干货分享:Research Essay写作规范详解

    同学们在刚到国外时觉得一切都很新鲜,感觉到处都在吸引着他们,但是大部分留学生在刚碰到Research Essay便是一头包.其实Research Essay也没有想象中的那么难,只是留学生们初次接触, ...

  8. 全程干货,requests模块与selenium框架详解

    requests模块 前言: 通常我们利用Python写一些WEB程序.webAPI部署在服务端,让客户端request,我们作为服务器端response数据: 但也可以反主为客利用Python的re ...

  9. Mybatis系列全解(四):全网最全!Mybatis配置文件XML全貌详解

    封面:洛小汐 作者:潘潘 做大事和做小事的难度是一样的.两者都会消耗你的时间和精力,所以如果决心做事,就要做大事,要确保你的梦想值得追求,未来的收获可以配得上你的努力. 前言 上一篇文章 <My ...

随机推荐

  1. 在Github上建立自己的个人主页

    目录 注册Github账号 登录Github账号 建立新仓库 选择个人主页的主题 注册Github账号 首先打开Github的主页(https://github.com/),点击右上角的sign up ...

  2. C# wpf 实现 MD5加密解密 小工具

    源文件: http://pan.baidu.com/share/link?shareid=2038099474&uk=3912660076 MD5 C# 实现代码来源于网络,感谢原系作者! 参 ...

  3. struts2+hibernate+spring简单整合且java.sql.SQLException: No suitable driver 问题解决

    最近上j2ee的课,老师要求整合struts2+hibernate+spring,我自己其实早早地有准备弄的,现在都第9个项目了,无奈自己的思路和头绪把自己带坑了,当然也是经验问题,其实只是用myec ...

  4. 一个神奇的SQL语句

    题目是这样的: 分别往这两张表中添加3条数据... 查询营业额最高商家的商品总价与营业额最低商家的商品总价差是多少(5分)CREATE VIEW vm2 AS SELECT price*limit_n ...

  5. Cannot use 'in' operator to search for '23' in

    在用$.each(data,function(){i,n})时,有时会报错 Cannot use 'in' operator to search for '23' in,

  6. 让网页变灰的实现_网站蒙灰CSS样式总汇

    每次全国哀悼日,各大网站首页都变成了灰色,添加以下全局CSS样式,可以实现此效果: 方法一 html { -webkit-filter: grayscale(100%);filter:progid:D ...

  7. css3动画添加间隔

    因项目需要,需要在元素上实现动画效果,并且需要有动画间隔.坑爹的是animation-delay只有在第一次动画开始的时候才起效. 在网上找了很多方法,最终的方法基本都是改动画规则,比如 @keyfr ...

  8. Howdoo欢迎Mitel成为内容发布支持者

    原文链接:https://medium.com/howdoo/howdoo-welcomes-mitel-as-a-launch-supporter-4c40027d4dd1 “Mitel很高兴能够成 ...

  9. 阿里云centos7服务器nginx配置及常见问题解答

    前言: 本文参考了jackyzm的博客:https://www.cnblogs.com/jackyzm/p/9600738.html,进行了内容的更新,并请注意这里适用的版本是centos7的版本.并 ...

  10. Redis RDB 分析工具 rdbtools 说明

    背景 Redis是基于内存的KV数据库,内存作为存储介质,关注其内存的使用情况是一个重要指标,解析其内部的存储信息是给出优化方法和维护的最基本要求.解析内存有二种方法:第一个是通过scan遍历所有ke ...