批量归一化(BN: Batch Normalization)

batch size=8样本,每个样本4维度,左边是数字是第l层输出,即每个神经元输出8个响应值,再经过计算均值,方差后
值都在0附近,对激活函数容易训练,加速收敛。

BN训练

  1. 随机梯度下降法(SGD)对于训练深度网络简单高效,但是它有个毛病,就是需要我们人为的去选择参数,比如学习率、参数初始化、权重衰减系数、Dropout比例等。这些参数的选择对训练结果至关重要,以至于我们很多时间都浪费在这些的调参上。那么使用BN(详见论文《Batch Normalization_ Accelerating Deep Network Training by Reducing Internal Covariate Shift》)之后,你可以不需要那么刻意的慢慢调整参数。
  2. 神经网络一旦训练起来,那么参数就要发生更新,除了输入层的数据外(因为输入层数据,我们已经人为的为每个样本归一化),后面网络每一层的输入数据分布是一直在发生变化的,因为在训练的时候,前面层训练参数的更新将导致后面层输入数据分布的变化。以网络第二层为例:网络的第二层输入,是由第一层的参数和input计算得到的,而第一层的参数在整个训练过程中一直在变化,因此必然会引起后面每一层输入数据分布的改变。我们把网络中间层在训练过程中,数据分布的改变称之为:“Internal Covariate Shift”。Paper所提出的算法,就是要解决在训练过程中,中间层数据分布发生改变的情况,于是就有了Batch Normalization,这个牛逼算法的诞生。
  3. BN的地位:与激活函数层、卷积层、全连接层、池化层一样,BN(Batch Normalization)也属于网络的一层
  4. BN的本质原理:在网络的每一层输入的时候,又插入了一个归一化层,也就是先做一个归一化处理(归一化至:均值0、方差为1),然后再进入网络的下一层。不过文献归一化层,可不像我们想象的那么简单,它是一个可学习、有参数(γ、β)的网络层
  5. 归一化公式:
  6. 如果是仅仅使用上面的归一化公式,对网络某一层A的输出数据做归一化,然后送入网络下一层B,这样是会影响到本层网络A所学习到的特征的。比如我网络中间某一层学习到特征数据本身就分布在S型激活函数的两侧,你强制把它给我归一化处理、标准差也限制在了1,把数据变换成分布于s函数的中间部分,这样就相当于我这一层网络所学习到的特征分布被你搞坏了,这可怎么办?于是文献使出了一招惊天地泣鬼神的招式:变换重构,引入了可学习参数γ、β,这就是算法关键之处:

    上面的公式表明,通过学习到的重构参数γ、β,是可以恢复出原始的某一层所学到的特征的。
  7. 引入了这个可学习重构参数γ、β,让我们的网络可以学习恢复出原始网络所要学习的特征分布。最后Batch Normalization网络层的前向传导过程公式就是:
  8. BN层是对于每个神经元做归一化处理,甚至只需要对某一个神经元进行归一化,而不是对一整层网络的神经元进行归一化。既然BN是对单个神经元的运算,那么在CNN中卷积层上要怎么搞?假如某一层卷积层有6个特征图,每个特征图的大小是100100,这样就相当于这一层网络有6100100个神经元,如果采用BN,就会有6100*100个参数γ、β,这样岂不是太恐怖了。因此卷积层上的BN使用,其实也是使用了类似权值共享的策略,把一整张特征图当做一个神经元进行处理
  9. 卷积神经网络经过卷积后得到的是一系列的特征图,如果min-batch sizes为m,那么网络某一层输入数据可以表示为四维矩阵(m,f,w,h),m为min-batch sizes,f为特征图个数,w、h分别为特征图的宽高。在CNN中我们可以把每个特征图看成是一个特征处理(一个神经元),因此在使用Batch Normalization,mini-batch size 的大小就是:mwh,于是对于每个特征图都只有一对可学习参数:γ、β。说白了吧,这就是相当于求取所有样本所对应的一个特征图的所有神经元的平均值、方差,然后对这个特征图神经元做归一化
  10. 在使用BN前,减小学习率、小心的权重初始化的目的是:使其输出的数据分布不要发生太大的变化。

BN的作用

  1. 改善流经网络的梯度

  2. 允许更大的学习率,大幅提高训练速度: 你可以选择比较大的初始学习率,让你的训练速度飙涨。以前还需要慢慢调整学习率,甚至在网络训练到一半的时候,还需要想着学习率进一步调小的比例选择多少比较合适,现在我们可以采用初始很大的学习率,然后学习率的衰减速度也很大,因为这个算法收敛很快。当然这个算法即使你选择了较小的学习率,也比以前的收敛速度快,因为它具有快速训练收敛的特性(果每层的数据分布都不一样的话,将会导致网络非常难收敛和训练,如果把 每层的数据都在转换在均值为零,方差为1 的状态下,这样每层数据的分布都是一样的训练会比较容易收敛)

  3. 减少对初始化的强烈依赖

  4. 改善正则化策略:作为正则化的一种形式,轻微减少了对dropout的需求
    你再也不用去理会过拟合中drop out、L2正则项参数的选择问题,采用BN算法后,你可以移除这两项了参数,或者可以选择更小的L2正则约束参数了,因为BN具有提高网络泛化能力的特性

  5. 再也不需要使用使用局部响应归一化层了(局部响应归一化是Alexnet网络用到的方法,搞视觉的估计比较熟悉),因为BN本身就是一个归一化网络层;

  6. 可以把训练数据彻底打乱(防止每批训练的时候,某一个样本都经常被挑选到,文献说这个可以提高1%的精度)。

  7. 控制梯度爆炸防止梯度消失

    以sigmoid函数为例,sigmoid函数使得输出在[0,1]之间,实际上当x达到了一定的大小,经过sigmoid函数后输出范围就会变得很小

    梯度消失:在深度神经网络中,如果网络的激活输出很大,其对应的梯度就会很小,导致网络的学习速率就会很慢,假设网络中每层的学习梯度都小于最大值0.25,网络中有n层,因为链式求导的原因,第一层的梯度将会小于0.25的n次方,所以学习速率相对来说会变的很慢,而对于网络的最后一层只需要对自身求导一次,梯度就大,学习速率就会比较快,这就会造成在一个很深的网络中,浅层基本不学习,权值变化小,而后面几层网络一直学习,后面的网络基本可以表征整个网络,这样失去了深度的意义。(使用BN层归一化后,网络的输出就不会很大,梯度就不会很小
    梯度爆炸:第一层偏移量的梯度=激活层斜率1x权值1x激活层斜率2x…激活层斜率(n-1)x权值(n-1)x激活层斜率n,假如激活层斜率均为最大值0.25,所有层的权值为100(W很大!!!),这样梯度就会指数增加。(使用bn层后权值的更新也不会很大

  8. BN算法防止过拟合(也有说没用的):在网络的训练中,BN的使用使得一个minibatch中所有样本都被关联在了一起,因此网络不会从某一个训练样本中生成确定的结果,即同样一个样本的输出不再仅仅取决于样本的本身,也取决于跟这个样本同属一个batch的其他样本,而每次网络都是随机取batch,这样就会使得整个网络不会朝这一个方向使劲学习。一定程度上避免了过拟合(。)

注:以上为学习过程,在测试时,均值和方差(mean/std)不基于小批量进行计算, 可取训练过程中的激活值的均值。

BN测试

实际测试时,我们依然使用下面的公式:

这里的均值和方差已经不是针对某一个Batch了,而是针对整个数据集而言。因此,在训练过程中除了正常的前向传播和反向求导之外,我们还要记录每一个Batch的均值和方差,以便训练完成之后按照下式计算整体的均值和方差:

BN(Batch Normalization)相关推荐

  1. 透彻理解BN(Batch Normalization)层

    什么是BN Batch Normalization是2015年论文<Batch Normalization: Accelerating Deep Network Training by Redu ...

  2. 什么是BN(Batch Normalization)

    什么是BN(Batch Normalization)? 在之前看的深度学习的期刊里,讲到了BN,故对BN做一个详细的了解.在网上查阅了许多资料,终于有一丝明白. 什么是BN? 2015年的论文< ...

  3. 残差结构Residual、BN(Batch Normalization)

    残差结构Residual   初次接触残差结构是在ResNets的网络中,可以随着网络深度的增加,训练误差会越来越多(被称为网络退化)的问题,引入残差结构即使网络再深吗,训练的表现仍表现很好.它有助于 ...

  4. 理解BN(Batch Normalization)

    https://www.cnblogs.com/king-lp 转自:参数优化方法 1. 深度学习流程简介 1)一次性设置(One time setup)           - 激活函数(Activ ...

  5. 卷积神经网络CNN(2)—— BN(Batch Normalization) 原理与使用过程详解

    前言 Batch Normalization是由google提出的一种训练优化方法.参考论文:Batch Normalization Accelerating Deep Network Trainin ...

  6. BN(Batch Normalization) 原理与使用过程详解

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

  7. BN——Batch Normalization:Accelerating Deep Network Training by Reducing Internal Covariate Shift

    原文:https://arxiv.org/pdf/1502.03167.pdf 摘要 训练深度神经网络的复杂性在于,每层输入的分布在训练过程中会发生变化,因为前面的层的参数会发生变化.通过要求较低的学 ...

  8. BN(Batch Normalization):批量归一化

    现在的神经网络通常都特别深,在输出层像输入层传播导数的过程中,梯度很容易被激活函数或是权重以指数级的规模缩小或放大,从而产生"梯度消失"或"梯度爆炸"的现象,造 ...

  9. batch normalization

    20210702 深度学习中的五种归一化(BN.LN.IN.GN和SN)方法简介 https://blog.csdn.net/u013289254/article/details/99690730 h ...

最新文章

  1. 英文论文-word summary
  2. 【ABAP】ALV可编辑数据更新
  3. linux笔记之 raid
  4. 获得变量的名称获得传入参数的参数类型与堆栈中的函数名获得变量的名称
  5. JavaScript 断点调试技巧
  6. Retrofit+RxJava联网工具类
  7. /etc/sysconfig/i18n文件详解
  8. php怎么查询数据库密码,如何验证php中的密码是通过mysql查询手动散列插入到数据库中的?...
  9. 吐血推荐 | 那些提升开发人员工作效率的在线工具
  10. flutter: 根视图、根元素与根渲染
  11. Pytorch:目标检测网络-FPN
  12. 电脑如何清理重复文件,查找电脑重复文件的软件
  13. 现金流量表补充资料的编制公式
  14. python操作word文档
  15. 原装世嘉土星手柄(Sega Saturn)转USB小板,软硬件全开源
  16. 树莓派官方系统(raspbian)安装及使用教程
  17. 在 Mac 上通过“启动转换助理”安装 Windows 10
  18. Revit建模快速剖面操作一键完成!
  19. HNUCM信息科学与工程学院第二届新生赛——正式赛
  20. qemu搭建arm嵌入式linux开发环境

热门文章

  1. AWE的这家展台,为什么让吴晓波流连忘返?
  2. kmalloc使用不当导致内存分配失败问题
  3. 对移动医疗浅陋的理解
  4. 人工智能行业市场分析
  5. 每天小练笔8-模拟进程调度
  6. 基于手机信令数据的动态出行OD以及出行需求估计
  7. 多个PDF怎么合并?赶快看这篇文章学习一下
  8. C#使用iTextSharp合并多个PDF
  9. 带着萌新看springboot源码02
  10. msi微星B350M主板开启VT(Virtualization Technology)