Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
1. 摘要
训练深层的神经网络非常困难,因为在训练的过程中,随着前面层数参数的改变,每层输入的分布也会随之改变。这需要我们设置较小的学习率并且谨慎地对参数进行初始化,因此训练过程比较缓慢。
作者将这种现象称之为 internal covariate shift,通过对每层的输入进行归一化来解决这个问题。
引入 BN 后,我们可以不用太在意参数的初始化,同时使用更大的学习率,而且也会有正则化的效果,在一些情况下可以不用再使用 Dropout。
2. 介绍
因为网络中每一层的输入都受到前面所有层参数的影响,因此参数的一个小的改变将会随着网络加深而被逐渐放大。在这样的情况下,每一层网络都需要一直去适应新的输入分布,训练过程也就变得很慢。
考虑如下的网络计算
\(F_1\) 和 \(F_2\) 是任意的变换,\(\Theta_1\) 和 \(\Theta_2\) 是需要学习的参数。学习 \(\Theta_2\) 可以看作是输入 \(x=F_1(u, \Theta_1)\) 被传入子网络
因此,如果 \(x\) 的分布保持不变的话, \(\Theta_2\) 就不用去重新适应来补偿 \(x\) 分布的变化。
另一方面,如果我们采用 Sigmoid 激活函数的话,随着网络加深,我们很容易落入到饱和区域,容易产生梯度消失现象,减缓训练过程。但是,如果我们能够确保非线性输入的分布维持稳定的话,优化就不容易陷入到饱和区域,从而能够加速训练。
3. 小批量归一化
针对每一层的所有输入进行白化代价非常高并且不是处处可微,因此作者进行了两个必要的简化。
第一,我们独立地归一化一层中的每一个特征,让它们具有零均值标准方差。针对一个 \(d\) 维的输入 \(x=(x^{(1)}...x^{(d)})\),我们将分别对每一维进行归一化。
但是,这样简单地归一化每个输入会改变当前层网络的表达能力。比如,归一化 Sigmoid 函数的输入将会使它们落入激活函数的线性区域。为了解决这个问题,我们要保证嵌入到网络中的变换能够表示恒等变换。对此,我们引入一对参数 \(\gamma^{(k)}, \beta^{(k)}\) 来对归一化后的值再进行缩放和平移。
这样,通过设定 \(\gamma^{(k)}=\sqrt {Var[x^{(k)}]}, \beta^{(k)}=E[x^{(k)}]\) ,如果原始激活值是最优的话,我们也能够恢复到原有状态。
第二,用小批量样本来产生对每个激活值均值和方差的估计。针对 \(m\) 个样本的小批量,归一化变换如下所示:
在训练过程中,我们需要计算 BN 变换参数的梯度来进行反向传播,根据链式法则,有
因此,BN 在网络中引入了对激活值的归一化,并且是一个可微的变换。这样,每一层都可以在同样的分布上持续学习而不用担心内部偏移问题,所以可以加速训练过程。最后,在归一化后学习到的仿射变换允许网络表示恒等变换,因此也保留了网络的容量也即表示能力。
4. 测试
虽然对小批量的激活值进行归一化在训练时是非常有效的,但在测试时却是不必要也不可取的,我们想让输出只确定地依赖于输入。因此,一旦训练好了一个网络,我们用训练时总体的均值和方差来进行归一化。
忽略 \(\epsilon\),这些归一化后的激活值就具有了和训练时一样的零均值和标准方差。我们采用无偏的方差估计
期望是根据训练过程中所有大小为 \(m\) 的小批量样本计算的,\(\sigma_B^2\) 代表它们的方差。同时,我们使用滑动平均来跟踪训练过程中每个小批量的均值和方差。
5. 在全连接和卷积网络中引入 BN
针对全连接网络,我们在非线性之前加入 BN 变换,对 \(x=Wu+b\) 进行归一化。注意到,偏置 \(b\) 可以被忽略,因为在后序的减去均值的过程中它的作用被抵消了。因此,就变成了
\[z=g(Wu+b) \to z=g(BN(Wu))\]
对于 \(x\) 的每一个维度我们学习一对参数 \(\gamma^{(k)}, \beta^{(k)}\) 。
针对卷积网络,我们想要归一化保持卷积的特性,因此,不同样本的所有位置的同一个特征图用同样的方式进行归一化。对于一个大小为 \(m\) 的小批量样本和大小为 \(p×q\) 的特征图,有效的小批次为
\[m'=m\cdot pq\]
对于每一个特征图我们学习一对参数 \(\gamma^{(k)}, \beta^{(k)}\) 。
6. BN 允许更高的学习率
在传统的网络中,太高的学习率可能会导致梯度消失或者爆炸,也会使网络陷入在糟糕的局部最优解。但引入 BN 后,它会阻止参数的小的变化被放大成激活值和梯度的更大变化或者次优变化,比如说不会让训练陷入到非线性的饱和区域。
BN 也使得训练对参数的规模更适应。正常情况下,大的学习率会增大参数,然后放大反向传播的梯度导致模型爆炸。但是,引入 BN 后,反向传播不受参数的规模影响。实际上,对于标量 \(a\),有
\[x_i = Wu_i\]
\[\mu = \frac{1}{m}\sum_{i=1}^{m}x_i\]
\[\sigma^2 = \frac{1}{m}\sum_{i=1}^{m}(x_i-\mu)^2\]
\[\hat x_i = \frac{x_i-\mu}{\sqrt{\sigma^2+\epsilon}}\]
\[y_i =\gamma \hat x_i+\beta=BN[Wu_i]\]
所以,\(BN[Wu] = BN[(aW)u]\),\(\hat x_i\) 求取时分子分母都放大 \(a\) 倍。反向传播时,有
\[\frac{\partial BN[(aW)u]}{\partial x} = \frac{1}{a} \cdot \frac{\partial BN[Wu]}{\partial x}\]
\[\tag{1}\frac{\partial BN[(aW)u]}{\partial u} = \frac{\partial BN[Wu]}{\partial u}\]
\[\tag{2}\frac{\partial BN[(aW)u]}{\partial (aW)} = \frac{1}{a} \cdot \frac{\partial BN[Wu]}{\partial W}\]
由式 (1) 可以看到,参数的规模不影响梯度的反向传播。而且,由式 (2) 知,较大的参数将会获得较小的梯度,BN 能够稳定参数的增长。
7. BN 的正则化效果
当使用 BN 进行训练时,小批次中的一个样本会与其他样本结合在一起被传入网络中,网络不再会为某个给定的训练样例生成确定值。在实验中,作者发现这种效应有利于网络的泛化。引入 BN 后,Dropout 可以被移除或减少作用。
8. 加速 BN 网络的训练
仅仅在网络中添加 BN 不能充分利用这种方法的优越性,除此之外,作者采用了以下策略:
- 增大学习率
- 移除 Dropout
- 减小 L2 正则化权重
- 加快学习率衰减
- 移除局部响应归一化
- 更彻底地打乱训练数据,防止同样的数据总出现在同一个批次中
- 减少光度畸变
9. 实验结果
可以看到,在 MNIST 数据集上,引入 BN 后网络网络收敛很快,并且输入的分布更加稳定。
在 ImageNet 数据集上,引入 BN 后很快就达到了原来 Inception 网络取得的准确率。
获取更多精彩,请关注「seniusen」!
Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift的更多相关文章
- Batch normalization:accelerating deep network training by reducing internal covariate shift的笔记
说实话,这篇paper看了很久,,到现在对里面的一些东西还不是很好的理解. 下面是我的理解,当同行看到的话,留言交流交流啊!!!!! 这篇文章的中心点:围绕着如何降低 internal covari ...
- Deep Learning 27:Batch normalization理解——读论文“Batch normalization: Accelerating deep network training by reducing internal covariate shift ”——ICML 2015
这篇经典论文,甚至可以说是2015年最牛的一篇论文,早就有很多人解读,不需要自己着摸,但是看了论文原文Batch normalization: Accelerating deep network tr ...
- 图像分类(二)GoogLenet Inception_v2:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
Inception V2网络中的代表是加入了BN(Batch Normalization)层,并且使用 2个 3*3卷积替代 1个5*5卷积的改进版,如下图所示: 其特点如下: 学习VGG用2个 3* ...
- 论文笔记:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
ICML, 2015 S. Ioffe and C. Szegedy 解决什么问题(What) 分布不一致导致训练慢:每一层的分布会受到前层的影响,当前层分布发生变化时,后层网络需要去适应这个分布,训 ...
- Batch Normalization:Accelerating Deep Network Training by Reducing Internal Covariate Shift(BN)
internal covariate shift(ics):训练深度神经网络是复杂的,因为在训练过程中,每层的输入分布会随着之前层的参数变化而发生变化.所以训练需要更小的学习速度和careful参数初 ...
- Batch Normalization原理及其TensorFlow实现——为了减少深度神经网络中的internal covariate shift,论文中提出了Batch Normalization算法,首先是对”每一层“的输入做一个Batch Normalization 变换
批标准化(Bactch Normalization,BN)是为了克服神经网络加深导致难以训练而诞生的,随着神经网络深度加深,训练起来就会越来越困难,收敛速度回很慢,常常会导致梯度弥散问题(Vanish ...
- 深度学习网络层之 Batch Normalization
Batch Normalization Ioffe 和 Szegedy 在2015年<Batch Normalization: Accelerating Deep Network Trainin ...
- 【深度学习】深入理解Batch Normalization批标准化
这几天面试经常被问到BN层的原理,虽然回答上来了,但还是感觉答得不是很好,今天仔细研究了一下Batch Normalization的原理,以下为参考网上几篇文章总结得出. Batch Normaliz ...
- 解读Batch Normalization
原文转自:http://blog.csdn.net/shuzfan/article/details/50723877 本次所讲的内容为Batch Normalization,简称BN,来源于<B ...
随机推荐
- 二叉查找树(二叉排序树)(C语言)
#include<stdio.h> #include "fatal.h" struct TreeNode; typedef struct TreeNode *Posit ...
- OpenID Connect Core 1.0(五)使用授权码流验证(下)
3.1.2.6 验证错误响应(Authentication Error Response) 验证错误响应是一个OAuth 2.0授权错误响应消息,是RP发送授权请求的消息,由OP授权终结点的响应返回. ...
- C++练习 | 在递增序列中查找最后一个小于等于指定数的元素
#include <iostream> using namespace std; int mid,l0; int solve(int a1[],int l,int r,int x) { & ...
- 蓝桥杯第七届决赛(国赛)C++B组 第四题 机器人塔
机器人塔 X星球的机器人表演拉拉队有两种服装,A和B.他们这次表演的是搭机器人塔. 类似: A B B A B A A A B B B B B A BA B A B B A 队内的组塔规则 ...
- Linux 三剑客之sed命令总结
sed ### sed ### .关键字取行 sed -n '/jpinsz/p' test.txt sed -n '/^d/p' test.txt .根据行数取行 sed -n '2,5p' tes ...
- transition(过渡)
transition:过渡 渡过渡原理:原始状态a状态-向-最终结束状态b状态 格式:transition: all 1s linear; 过渡的四个参数: 1.参与过渡的属性(属性(width)/a ...
- laravel5.5源码笔记(六、中间件)
laravel中的中间件作为一个请求与响应的过滤器,主要分为两个功能. 1.在请求到达控制器层之前进行拦截与过滤,只有通过验证的请求才能到达controller层 2.或者是在controller中运 ...
- Call to a member function allowField() on null 错误总结
Call to a member function allowField() on null 在空对象上调用 allowField() 没有该模型对象无法调用,需要创建相应的模型 错误版本: if ...
- pomelo vscode 调试配置
步骤 config/server.js 配置 .vscode/launch.json 配置 详细 1. 在server的配置中添加 args 参数,此参数为node开启此服务器时命令参数 " ...
- 20155339 2016-2017 2 《Java程序设计》第2周学习总结
20155339 2016-2017-2 <Java程序设计>第2周学习总结 教材学习内容总结 这周学习了课本的第三章,主要内容是JAVA的基础语法,在这章的学习过程中我发现大部分与c语言 ...