为什么要归一化?

归一化已成为深度神经网络中的一个重要步骤,它可以弥补ReLU、ELU等激活函数无界性的问题。有了这些激活函数,输出层就不会被限制在一个有限的范围内(比如tanh的[−1,1][-1,1][−1,1]),而是可以根据训练需要尽可能高地增长。为了限制无界激活函数使其不增加输出层的值,需要在激活函数之前进行归一化。在深度神经网络中有两种常用的归一化技术,但常被初学者所误解。在本教程中,将详细解释这两种归一化技术,以突出它们的关键区别。

局部响应归一化(Local Response Normalization,LRN)

局部响应归一化(LRN)最初是在AlexNet架构中引入的,其中使用的激活函数是ReLU,而不是当时更常见的tanh和sigmoid。除了上述原因,使用LRN的原因是为了鼓励横向抑制(lateral inhibition)。这是神经生物学中的一个概念,是指神经元减少其邻居活动的能力[1](注:阻止兴奋神经元向邻近神经元传播其动作趋势,从而减少兴奋神经元的邻近神经元的激活程度)。在深度神经网络(Deep Neural Networks,DNN)中,这种横向抑制的目的是进行局部对比度增强,以便使局部最大像素值用作下一层的激励。

LRN是一个不可训练的层,用于对局部邻域内的特征图中的像素值进行平方归一化。根据所定义的邻域,有两种类型的LRN,如下图所示:

  • 通道间的LRN(Inter-Channel LRN):这最早是在AlexNet论文中使用的。定义的邻域在整个通道上,对于每个(x,y)位置,在深度维度上进行归一化,其公式如下:

其中,iii表示滤波器iii的输出,a(x,y)a(x,y)a(x,y)、 b(x,y)b(x,y)b(x,y)分别为归一化前后(x,y)(x,y)(x,y)处的像素值,N为通道总数。常数(k,α,β,n)(k,\alpha,\beta,n)(k,α,β,n)为超参数。k用于避免奇异点(分母为零的情况),α\alphaα为归一化常数,β\betaβ是对比度常数。常数nnn用于定义邻域长度,即在进行归一化时需要考虑多少个连续像素值。(k,α,β,n)=(0,1,1,n)(k,\alpha,\beta,n)=(0, 1, 1, n)(k,α,β,n)=(0,1,1,n)的情况是标准归一化。在上图中,N=4,n=2。

让我们来看一个通道间LRN的例子。如下图:

不同的颜色表示不同的通道,因此N=4。设置超参数为(k,α,β,n)=(0,1,1,2)(k,\alpha,\beta,n)=(0,1,1,2)(k,α,β,n)=(0,1,1,2)。n=2的值表示在计算位置(i,x,y)(i,x,y)(i,x,y)处的归一化值时,我们考虑上一个滤波器和下一个滤波器在相同位置的值,即(i−1,x,y)(i-1,x,y)(i−1,x,y)和(i+1,x,y)(i+1,x,y)(i+1,x,y)。对于(i,x,y)=(0,0,0)(i,x,y)=(0,0,0)(i,x,y)=(0,0,0)(此处表示位置),我们有值(i,x,y)=1(i,x,y)=1(i,x,y)=1,值(i−1,x,y)(i-1,x,y)(i−1,x,y)不存在,值(i+1,x,y)=1(i+1,x,y)=1(i+1,x,y)=1。因此normalized_value(i(x,y)=112+12=0.5normalized\_value(i (x, y)=\frac{1}{1^2+1^2}=0.5normalized_value(i(x,y)=12+121​=0.5,可以在上图的下部看到。其余归一化值的计算方法类似。

  • 通道内的LRN(Intra-Channel LRN):由上面的图可以看到,在通道内LRN中,邻域仅在同一通道中扩展。公式为:

其中(W,H)为特征图的宽和高(如上面第一幅图中(W,H)=(8,8)(W,H) =(8,8)(W,H)=(8,8))。通道间LRN和通道内LRN之间的惟一区别是归一化的邻域。在通道内LRN中,一个二维邻域(相对于通道间的一维邻域)是在考虑的像素周围定义的。例如,下图显示了在n=2n=2n=2的5x5特征图上的通道内归一化(即以(x,y)(x,y)(x,y)为中心的大小为(n+1)×(n+1)(n+1)\times(n+1)(n+1)×(n+1)的2D邻域)。

批量归一化(Batch Normalization,BN)

批量归一化(BN)是一个可训练的层,通常用于解决内部协变量偏移(Internal Covariate Shift,ICS)[1]的问题。ICS的出现是由于隐藏的神经元或激活的分布发生了变化。考虑下面的二元分类示例,其中我们需要对有玫瑰和无玫瑰进行分类:

假设我们已经训练了一个神经网络,现在我们从数据集中选择两个明显不同的batch进行推断(如上所示)。如果我们对这两个batch进行前向传播,并绘制隐藏层(在网络深处)的特征空间,我们将看到分布的显著变化,如图右侧所示。这叫做输入神经元的协变量偏移。这对训练有什么影响?在训练过程中,如果我们选择属于不同分布的batch,那么它会减慢训练速度,因为对于给定的batch,它会尝试学习某个特定的分布,而对于下一个batch则有所不同。因此它会在分布之间来回跳动直到收敛。通过确保batch中的成员不属于相同或相似的分布,可以缓解这种协变量偏移。这可以通过随机选择batch图像来实现。对于隐藏神经元,也存在类似的协变量偏移。即使这些batch是随机选择的,隐藏的神经元也可能最终具有一定的分布,从而减慢了训练的速度。隐藏层的这种协变量偏移称为内部协变量偏移。问题是我们不能像控制输入神经元那样直接控制隐藏神经元的分布,因为随着训练更新训练参数,它会不断变化。批量归一化有助于缓解这个问题。

在批量归一化中,隐藏神经元的输出按如下方式处理,然后输入激活函数:

  1. 将整个batch B归一化为零均值和单位方差:

    • 计算整个mini-batch输出的平均值:u_Bu\_Bu_B
    • 计算整个mini-batch输出的方差:sigma_Bsigma\_Bsigma_B
    • 通过减去平均值并除以方差来归一化mini-batch
  2. 引入两个可训练的参数(Gamma:尺度变量和Beta:平移变量)以缩放和移动归一化的mini-batch输出;
  3. 将此缩放并移动的归一化mini-batch输入激活函数。

BN算法如下图所示:

对batch中所有激活中的每个像素进行归一化。考虑下图。让我们假设我们有一个大小为3的mini-batch。一个隐藏层产生一个大小为(C,H,W)=(4,4,4)(C,H,W) =(4,4,4)(C,H,W)=(4,4,4)的激活。由于batch-size为3,我们将有3个这样的激活。现在,对于激活中的每个像素(即对于每个4x4x4=64像素),我们将通过找到所有激活中的这个像素位置的平均值和方差对其进行归一化,如下图的左侧所示。一旦找到平均值和方差,我们将从每个激活中减去平均值并将其除以方差。下图的右侧部分对此进行了描述。减法和除法是逐点进行的。

第2步(即缩放和平移)的原因是为了让训练来决定我们是否需要归一化。在某些情况下,不进行归一化可能会产生更好的结果。因此,BN让训练来决定是否包含归一化层,而不是事先就设定好。当Gamma=sigma_BGamma=sigma\_BGamma=sigma_B且Beta=u_BBeta=u\_BBeta=u_B时,不执行任何归一化操作,并且恢复原始激活。在这里可以找到Andrew Ng提供的关于BN的非常好的视频教程。

对比

LRN有多个方向来(内部或内部通道)执行归一化,另一方面,BN只有一种执行方式(针对所有激活中的每个像素位置)。下表比较了这两种归一化技术。

参考:

[1] https://www.learnopencv.com/batch-normalization-in-deep-networks/
[2] Ioffe, Sergey, and Christian Szegedy. “Batch normalization: Accelerating deep network training by reducing internal covariate shift.” arXiv preprint arXiv:1502.03167 (2015).

局部响应归一化(Local Response Normalization,LRN)和批量归一化(Batch Normalization,BN)的区别相关推荐

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

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

  2. 批量正则化Batch Normalization

    1.为什么随着网络深度增加,神经网络训练越来越慢呢? 因为深层神经网络在做非线性变换前的激活输入值,随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动.训练收敛慢,一般是因为整体分布逐渐往非 ...

  3. 深度神经网络中的Batch Normalization介绍及实现

    之前在经典网络DenseNet介绍_fengbingchun的博客-CSDN博客_densenet中介绍DenseNet时,网络中会有BN层,即Batch Normalization,在每个Dense ...

  4. 【学习笔记】Pytorch深度学习—Batch Normalization

    [学习笔记]Pytorch深度学习-Batch Normalization Batch Normalization概念 `Batch Normalization ` `Batch Normalizat ...

  5. Batch Normalization论文笔记

    个人博客:http://www.chenjianqu.com/ 原文链接:http://www.chenjianqu.com/show-70.html 论文:Batch Normalization: ...

  6. 原理解释|直觉与实现:Batch Normalization

    https://www.toutiao.com/a6707566287964340747/ 作者:Harrison Jansma编译:ronghuaiyang 在本文中,我会回顾一下batch nor ...

  7. 论文阅读笔记:看完也许能进一步了解Batch Normalization

    提示:阅读论文时进行相关思想.结构.优缺点,内容进行提炼和记录,论文和相关引用会标明出处. 文章目录 前言 介绍 BN之前的一些减少Covariate Shift的方法 BN算法描述 Batch No ...

  8. 【Pytorch神经网络理论篇】 16 过拟合问题的优化技巧(三):批量归一化

    1 批量归一化理论 1.1 批量归一化原理 1.2 批量归一化定义 将每一层运算出来的数据归一化成均值为0.方差为1的标准高斯分布.这样就会在保留样本的分布特征,又消除了层与层间的分布差异. 在实际应 ...

  9. (pytorch-深度学习)批量归一化

    批量归一化 批量归一化(batch normalization)层能让较深的神经网络的训练变得更加容易 通常来说,数据标准化预处理对于浅层模型就足够有效了.随着模型训练的进行,当每层中参数更新时,靠近 ...

  10. 『Batch Normalization』Batch Normalization一文吃透

    Batch Normalization 协变量偏移 神经网络前向传播 引起的问题 Batch Normalization的登场 为什么存在 β \beta β和 γ \gamma γ? 预测时如何使用 ...

最新文章

  1. jqgrid ajax 请求参数,如何将csrf_令牌传递给jqgrid的editurl的post参数?
  2. ubuntu libapache2-mod-php5,ubuntu安装apache2 mysql5 php5
  3. Python机器学习--KNN归一化、距离的惩罚
  4. 从0到1使用Kubernetes系列(四):搭建第一个应用程序
  5. 20161013 晨报
  6. db2 mysql oracle,五大主流数据库比较 DB2 Oracle MySQL SyBase SQLServer)
  7. CentOS7默认的防火墙不是iptables,而是firewalle.
  8. 我的信念 -居里夫人
  9. 当我们放弃时,我们想些什么
  10. HDU 2079 选课时间(题目已修改,注意读题)(母函数)
  11. 浏览器打开pdf乱码
  12. 微信小程序搜索关键词高亮效果(转)
  13. qiankun+vue项目开发
  14. vb计算机清除菜单代码,用VB编写简单的程序来清空文档菜单 (转)
  15. 团体程序设计天梯赛-练习集 L1-015 跟奥巴马一起画方块
  16. 怎么修复SONY索尼相机摄像机断电死机损坏的MP4视频文件
  17. 如何学习一门新的计算机语言
  18. C语言实现-求m到n之和
  19. 疫情当前,「在家远程办公」可能是最佳选择
  20. 无线路由器设置成无线AP,解决家里设备不在一个网段的尴尬

热门文章

  1. php mysql utf8mb4,MySQL设置utf8mb4编码
  2. 几种相机模型:针孔相机模型、双目相机模型、RGB-D相机——SLAM学习笔记5
  3. 一文搞懂match、match_phrase与match_phrase_prefix的检索过程
  4. 跟着王进老师学开发Python篇:基础入门案例讲解-王进-专题视频课程
  5. 33岁,年薪30万:“幸亏我被裁员了”
  6. 群晖Synology 218+拆机升级内存12GB
  7. RMB一千五百圆西藏行攻略
  8. 俄罗斯套娃(LCS)
  9. php 去除时分秒,php时间如何去掉时分秒
  10. 2021-10-11 学习笔记 什么是D触发器?