博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【DL-CV】批量归一化(BN算法)
阅读量:6612 次
发布时间:2019-06-24

本文共 1681 字,大约阅读时间需要 5 分钟。

<前篇---后篇>

先来交代一下背景:在网络训练的过程中,参数的更新会导致网络的各层输入数据的分布不断变化,那么各层在训练的过程中就需要不断的改变以适应这种新的数据分布,从而造成网络训练困难,收敛变慢(而且网络越深越难),在论文中这个问题被称为“Internal Covariate Shift”。为了解决这个问题出现了批量归一化的算法,他对每一层的输入进行归一化,保证每层的输入数据分布是稳定的,从而加速训练

批量归一化(Batch Normalization/BN)

  • Normalization——“归一化”
  • Batch——“批”,一批样本输入,batch_size=m,m个样本

与激活函数层、卷积层(cnn)、全连接层(FC)、池化层一样,批量归一化也属于网络的一层,简称BN。BN通常用在FC/cnn之后,激活函数层之前,他对FC/cnn的输出的每一维进行归一化(归一化至:均值0、方差为1),然后变换重构后再把数据喂给下一层网络。

归一化

对输入数据的每一维xk(每一列)进行归一化得到$\hat{x}^{k}$

$$\hat{x}^{(k)} = \frac{x^{k} - E[x^{k}]}{\sqrt{Var[x^{k}]}}$$

clipboard.png

通过该公式我们强行把数据归一化,特征分布成功被压缩至标准差为1。但这种变化是有破坏性的,原来的特征分布都被搞乱了那还学个鬼?——为了解决这一问题,我们对归一化后的数据再进行变换重构,以恢复原来的特征

变换重构

对于归一化后输入$\hat{x}^{k}$,我们再引入两个可供学习的参数$\gamma$和$\beta$使

$$y^{k} = \gamma^{k}\hat{x}^{k}+\beta^{k}$$
注意如果$\gamma^{k}=\sqrt{Var[x^k]}$,$\beta^{k}=E[x^k]$时,是可以恢复原有的特征的。这就是引入这两个参数的意义,虽然网络不太可能学习到$\gamma^{k}=\sqrt{Var[x^k]}$,$\beta^{k}=E[x^k]$,但是好歹通过学习到这两个参数尽可能地回复原有的特征(实践中的表现说明这是有用的)


最后总结BN操作:(m是mini batch size,根号中的ε是一个很小的数防止分母为0)

clipboard.png
clipboard.png

测试时!

上面讲了这么多其实都是训练时的BN算法,训练时是一个一个batch进去的,训练完成后得到$\gamma$和$\beta$。但是在测试时,我们只是丢一个样本进去让网络预测,试问一个样本何来均值和方差?

均值和方差最好的来源是整个训练集,但是整个训练集往往太大,我们不太想算。能不能从现成的 mini batch 的均值和方差(因为在训练时算了出来)估计出整个训练集的均值和方差呢——当然可以,因为mini batch是随机取样的:
$$E[x] = E_B[\mu_B]$$
$$Var[x] = \frac{m}{m-1}E_B[\sigma_B^2]$$
即平均值为所有mini-batch的平均值的平均值,而方差为每个batch的方差的。当网络训练完后,我们通过训练时保存下来的每个batch的均值与方差估算出全局均值与方差供测试时使用,也就是说当网络训练完后每个BN层中的均值也和标准差也会随之确定。

BN好处有啥

  • 能选择较大的初始学习率,提高训练收敛速度
  • 你再也不用去理会过拟合中drop out、L2正则项参数的选择问题,采用BN算法后,你可以移除这两项了参数,或者可以选择更小的L2正则约束参数了,因为BN自带正则化的特性,能提高网络泛化能力
  • 减少梯度爆炸/消失的出现,特别对于tanh,sigmoid这类会两端饱和的激活函数
  • 减少对参数初始化的依赖,就算参数初始化得不好,在BN的加持下网络还是表现较好

虽然BN是2015才提出来的(看上去像个新米),但是他表现也超凡,BN算法已经被大量使用于深度学习中,真的是nb

补充

  • 以上的BN使用是基于全连接层的,输入数据都是二维矩阵。BN也可以用在cnn中,用法不同,可以参考
  • 推荐

转载地址:http://mraso.baihongyu.com/

你可能感兴趣的文章
【VMCloud云平台】SCCM(八)OSD(二)- 模板机捕获准备
查看>>
Docker容器固定IP分配
查看>>
刺激用户危机意识,实现快速盈利的营销思维
查看>>
虚拟化系列-Citrix XenServer 6.1 网络管理
查看>>
一个电脑做Wifi热点的软件——Connectify
查看>>
英特尔嵌入式突围
查看>>
WIN FORM 多线程更新UI(界面控件)
查看>>
一道打印M的面试题[java]
查看>>
【常见问题】系列01:双击文件夹打开新窗口
查看>>
Quartz 框架快速入门(三)
查看>>
关于程序内存的问题
查看>>
将字符串中从n位开始以*代替
查看>>
access 2007创建表关系
查看>>
JDBC公共动作类
查看>>
JUnit单元测试
查看>>
[logstash-input-file]插件使用详解
查看>>
HDU 3103 Shoring Up the Levees(计算几何 搜寻区域)
查看>>
spring mvc模拟用户增删改查以及登录和上传文件的相关流程
查看>>
11.并发包阻塞队列之LinkedBlockingQueue
查看>>
植物大战僵尸
查看>>