Batch Normalization(BN)超详细解析

2023-10-27

单层视角

在这里插入图片描述神经网络可以看成是上图形式,对于中间的某一层,其前面的层可以看成是对输入的处理,后面的层可以看成是损失函数。一次反向传播过程会同时更新所有层的权重W1,W2,…,WL,前面层权重的更新会改变当前层输入的分布,而跟据反向传播的计算方式,我们知道,对Wk的更新是在假定其输入不变的情况下进行的。如果假定第k层的输入节点只有2个,对第k层的某个输出节点而言,相当于一个线性模型y=w1x1+w2x2+b,如下图所示,
在这里插入图片描述假定当前输入x1和x2的分布如图中圆点所示,本次更新的方向是将直线H1更新成H2,本以为切分得不错,但是当前面层的权重更新完毕,当前层输入的分布换成了另外一番样子,直线相对输入分布的位置可能变成了H3,下一次更新又要根据新的分布重新调整。直线调整了位置,输入分布又在发生变化,直线再调整位置,就像是直线和分布之间的“追逐游戏”。对于浅层模型,比如SVM,输入特征的分布是固定的,即使拆分成不同的batch,每个batch的统计特性也是相近的,因此只需调整直线位置来适应输入分布,显然要容易得多。而深层模型,每层输入的分布和权重在同时变化,训练相对困难。

多层视角

上面是从网络中单拿出一层分析,下面看一下多层的情况。在反向传播过程中,每层权重的更新是在假定其他权重不变的情况下,向损失函数降低的方向调整自己。问题在于,在一次反向传播过程中,所有的权重会同时更新,导致层间配合“缺乏默契”,每层都在进行上节所说的“追逐游戏”,而且层数越多,相互配合越困难,文中把这个现象称之为 Internal Covariate Shift,示意图如下。为了避免过于震荡,学习率不得不设置得足够小,足够小就意味着学习缓慢。

在这里插入图片描述为此,希望对每层输入的分布有所控制,于是就有了Batch Normalization,其出发点是对每层的输入做Normalization,只有一个数据是谈不上Normalization的,所以是对一个batch的数据进行Normalization。

Batch Normalization原理

Batch Normalization,简称BatchNorm或BN,翻译为“批归一化”,是神经网络中一种特殊的层,如今已是各种流行网络的标配。在原paper中,BN被建议插入在(每个)ReLU激活层前面,如下所示,
在这里插入图片描述如果batch size为m,则在前向传播过程中,网络中每个节点都有m个输出,所谓的Batch Normalization,就是对该层每个节点的这m个输出进行归一化再输出.

我们在图像预处理过程中通常会对图像进行标准化处理,这样能够加速网络的收敛,如下图所示,对于Conv1来说输入的就是满足某一分布的特征矩阵,但对于Conv2而言输入的feature map就不一定满足某一分布规律了**(注意这里所说满足某一分布规律并不是指某一个feature map的数据要满足分布规律,理论上是指整个训练样本集所对应feature map的数据要满足分布规律)**。而我们Batch Normalization的目的就是使我们的feature map满足均值为0,方差为1的分布规律。
在这里插入图片描述
下面是从原论文中截取的原话,注意标黄的部分:
在这里插入图片描述
“对于一个拥有d维的输入x,我们将对它的每一个维度进行标准化处理。” 假设我们输入的x是RGB三通道的彩色图像,那么这里的d就是输入图像的channels即d=3,,其中就代表我们的R通道所对应的特征矩阵,依此类推。标准化处理也就是分别对我们的R通道,G通道,B通道进行处理。上面的公式不用看,原文提供了更加详细的计算公式:
在这里插入图片描述其操作可以分成2步,

  1. Standardization:首先对m个x进行 Standardization,得到 zero mean unit
    variance的分布x^。
  2. scale and shift:然后再对x^进行scale and shift,缩放并平移到新的分布y,具有新的均值β方差γ。

假设BN层有d个输入节点,则x可构成d×m大小的矩阵X,BN层相当于通过行操作将其映射为另一个d×m大小的矩阵Y,如下所示,

在这里插入图片描述
将2个过程写在一个公式里如下
在这里插入图片描述
其中,x(b)i表示输入当前batch的b-th样本时该层i-th输入节点的值,xi为[x(1)i,x(2)i,…,x(m)i]构成的行向量,长度为batch size m,μ和σ为该行的均值和标准差,ϵ为防止除零引入的极小量(可忽略),γ和β为该行的scale和shift参数,可知

  • μ和σ为当前行的统计量,不可学习。
  • γ和β为待学习的scale和shift参数,用于控制yi的方差和均值
  • BN层中,xi和xj之间不存在信息交流(i≠j)

可见,无论xi原本的均值和方差是多少,通过BatchNorm后其均值和方差分别变为待学习的β和γ。

Batch Normalization的反向传播

对于目前的神经网络计算框架,一个层要想加入到网络中,要保证其是可微的,即可以求梯度。BatchNorm的梯度该如何求取?

反向传播求梯度只需抓住一个关键点,如果一个变量对另一个变量有影响,那么他们之间就存在偏导数,找到直接相关的变量,再配合链式法则,公式就很容易写出了。
在这里插入图片描述
根据反向传播的顺序,首先求取损失ℓ对BN层输出yi的偏导∂ℓ / ∂yi,然后是对可学习参数的偏导∂ℓ / ∂γ和∂ℓ / ∂β,用于对参数进行更新,想继续回传的话还需要求对输入 x偏导,于是引出对变量μ、σ2和x^的偏导,根据链式法则再求这些变量对x的偏导。

Batch Normalization的预测阶段

在预测阶段,所有参数的取值是固定的,对BN层而言,意味着μ、σ、γ、β都是固定值。

γ和β比较好理解,随着训练结束,两者最终收敛,预测阶段使用训练结束时的值即可。

对于μ和σ,在训练阶段,它们为当前mini batch的统计量,随着输入batch的不同,μ和σ一直在变化。在预测阶段,输入数据可能只有1条,该使用哪个μ和σ,或者说,每个BN层的μ和σ该如何取值?可以采用训练收敛最后几批mini batch的 μ和σ的期望,作为预测阶段的μ和σ,如下所示,
在这里插入图片描述因为Standardization和scale and shift均为线性变换,在预测阶段所有参数均固定的情况下,参数可以合并成y=kx+b的形式,如上图中行号11所示。

Batch Normalization的作用

使用Batch Normalization,可以获得如下好处,

  • 可以使用更大的学习率,训练过程更加稳定,极大提高了训练速度。
  • 可以将bias置为0,因为Batch Normalization的Standardization过程会移除直流分量,所以不再需要bias。
  • 对权重初始化不再敏感,通常权重采样自0均值某方差的高斯分布,以往对高斯分布的方差设置十分重要,有了Batch
    Normalization后,对与同一个输出节点相连的权重进行放缩,其标准差σ也会放缩同样的倍数,相除抵消。
  • 对权重的尺度不再敏感,理由同上,尺度统一由γ参数控制,在训练中决定。
  • 深层网络可以使用sigmoid和tanh了,理由同上,BN抑制了梯度消失。
  • Batch Normalization具有某种正则作用,不需要太依赖dropout,减少过拟合。

几个常见问题

卷积层如何使用BatchNorm?

For convolutional layers, we additionally want the normalization to obey the convolutional property – so that different elements of the same feature map, at different locations, are normalized in the same way. To achieve this, we jointly normalize all the activations in a mini-batch, over all locations.

...

so for a mini-batch of size m and feature maps of size p × q, we use the effective mini-batch of size m′

= |B| = m · pq. We learn a pair of parameters γ(k) and β(k) per feature map, rather than per activation.

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

1个卷积核产生1个feature map,1个feature map有1对γ和β参数,同一batch同channel的feature map共享同一对γ和β参数,若卷积层有n个卷积核,则有n对γ和β参数。

没有scale and shift过程可不可以?
BatchNorm有两个过程,Standardization和scale and shift,前者是机器学习常用的数据预处理技术,在浅层模型中,只需对数据进行Standardization即可,Batch Normalization可不可以只有Standardization呢?

答案是可以,但网络的表达能力会下降。

直觉上理解,浅层模型中,只需要模型适应数据分布即可。对深度神经网络,每层的输入分布和权重要相互协调,强制把分布限制在zero mean unit variance并不见得是最好的选择,加入参数γ和β,对输入进行scale and shift,有利于分布与权重的相互协调,特别地,令γ=1,β=0等价于只用Standardization,令γ=σ,β=μ等价于没有BN层,scale and shift涵盖了这2种特殊情况,在训练过程中决定什么样的分布是适合的,所以使用scale and shift增强了网络的表达能力。

表达能力更强,在实践中性能就会更好吗?并不见得,就像曾经参数越多不见得性能越好一样。在caffenet-benchmark-batchnorm
中,作者实验发现没有scale and shift性能可能还更好一些。

BN层放在ReLU前面还是后面?
原paper建议将BN层放置在ReLU前,因为ReLU激活函数的输出非负,不能近似为高斯分布。

The goal of Batch Normalization is to achieve a stable distribution of activation values throughout training, and in our experiments we apply it before the nonlinearity since that is where matching the first and second moments is more likely to result in a stable distribution.

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

但是,在caffenet-benchmark-batchnorm中,作者基于caffenet在ImageNet2012上做了如下对比实验,
在这里插入图片描述实验表明,放在前后的差异似乎不大,甚至放在ReLU后还好一些。

放在ReLU后相当于直接对每层的输入进行归一化,如下图所示,这与浅层模型的Standardization是一致的。
在这里插入图片描述caffenet-benchmark-batchnorm中,还有BN层与不同激活函数、不同初始化方法、dropout等排列组合的对比实验,可以看看。

所以,BN究竟应该放在激活的前面还是后面?以及,BN与其他变量,如激活函数、初始化方法、dropout等,如何组合才是最优?可能只有直觉和经验性的指导意见,具体问题的具体答案可能还是得实验说了算(微笑)。

BN层为什么有效?
BN层的有效性已有目共睹,但为什么有效可能还需要进一步研究,这里有一些解释,

  • BN层让损失函数更平滑。论文How Does Batch Normalization Help Optimization中,通过分析训练过程中每步梯度方向上步长变化引起的损失变化范围、梯度幅值的变化范围、光滑度的变化,认为添加BN层后,损失函数的landscape(losssurface)变得更平滑,相比高低不平上下起伏的loss surface,平滑losssurface的梯度预测性更好,可以选取较大的步长。如下图所示,
    在这里插入图片描述
  • BN更有利于梯度下降。论文An empirical analysis of the optimization of deep network loss surfaces中,绘制了VGG和NIN网络在有无BN层的情况下,loss surface的差异,包含初始点位置以及不同优化算法最终收敛到的local minima位置,如下图所示。没有BN层的,其loss surface存在较大的高原,有BN层的则没有高原,而是山峰,因此更容易下降。
    在这里插入图片描述
  • 这里再提供一个直觉上的理解,没有BN层的情况下,网络没办法直接控制每层输入的分布,其分布前面层的权重共同决定,或者说分布的均值和方差“隐藏”在前面层的每个权重中,网络若想调整其分布,需要通过复杂的反向传播过程调整前面的每个权重实现,BN层的存在相当于将分布的均值和方差从权重中剥离了出来,只需调整γ和β两个参数就可以直接调整分布,让分布和权重的配合变得更加容易。

这里多说一句,论文How Does Batch Normalization Help Optimization中对比了标准VGG以及加了BN层的VGG每层分布随训练过程的变化,发现两者并无明显差异,认为BatchNorm并没有改善 Internal Covariate Shift。但这里有个问题是,两者的训练都可以收敛,对于不能收敛或者训练过程十分震荡的模型呢,其分布变化是怎样的?大家可以自己实验看看。

参考自:
日拱一卒

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Batch Normalization(BN)超详细解析 的相关文章

随机推荐

  • Hbase学习笔记(二)——安装与部署

    Hbase 安装与部署 一 安装包 二 修改配置文件 三 分发给其他机器 四 配置环境变量 五 Hbase的启动 一 安装包 hbase 1 2 0 cdh5 14 0 tar gz 二 修改配置文件 配置文件所在位置 cd export
  • 2020美赛MCM/ICM参赛及获奖分析

    文章目录 一 美赛简介 二 参赛队伍数分析 三 选题及获奖情况 四 完整获奖名单pdf 一 美赛简介 美赛 是美国大学生数学建模竞赛的缩写 包括MCM The Mathematical Contest in Modeling数学建模竞赛 和
  • PhpStorm内置的REST客户端 使用方法

    http confluence jetbrains com display PhpStorm Built in REST Client in PhpStorm 跳到元数据结束 由Maarten Balliauw创建 最后由米哈伊尔 温克于2
  • Android之团队开发时高德/百度地图出现INVALID_USER_SCODE

    初次集成前端地图 高德 百度 的同志都可能会遇到INVALID USER SCODE提示 虽然基础地图功能没有影响 但是这个提示直接Toas给用户的 真是够了 如果集成地图导航时可能因为该原因无法打开导航页面 那么我们就研究下为啥出现这个I
  • jQuery实现静态html+ajax请求访问MySQL数据库并显示

    文章目录 静态html ajax与jsp ajax访问流程图 前期准备 配置jQuery 准备index html 准备dao 准备servlet jQuery实现ajax 附 关于Maven项目引入js无法使用的问题 静态html aja
  • Java并发编程与高并发解决方案(精选)

    Java并发编程与高并发面试 一 课程准备 1 1 课程导学 本课程主要是围绕并发编程和高并发解决方案两个核心来进行讲解 希望这门课程能够带领大家攻克并发编程与高并发的难题 课程特点 大量的图示及代码演示 全面覆盖并发知识点 建立完整的知识
  • 计算机操作系统的启动与加载过程

    注 uboot 嵌入式系统的bootloader 包含了BIOS的功能 相当于PC机的BIOS 引导程序
  • MFC的使用——在共享DLL中使用MFC、在静态库中使用MFC

    前言 我们在使用Microsoft Visual Studio软件 也就是我们常常说的VS 时 其中项目属性中有一项叫做 MFC的使用 里面包含有不同的设置 会影响我们所编写的程序的使用 今天我就遇到了这个情况 我们一起来总结一下 避免犯下
  • 数据结构——队列的C语言代码实现

    系列文章目录 数据结构 顺序表的C语言代码实现 数据结构 八种链表的C语言代码实现 数据结构 栈的C语言代码实现 数据结构 队列的C语言代码实现 数据结构 堆的C语言代码实现 文章目录 系列文章目录 前言 一 基础知识 队列的概念 queu
  • pandas时间序列

    目录 1 pandas中6个时间相关的类 2 Timestamp类 1 查看时间列 是str字符串列 还是时间格式列 2 使用pd to datetime 将字符串 转换为日期格式 3 Timestamp类只能表示1677年 2262年的时
  • js 数组移动函数

  • 使用Cloudflare和notion搭建自己的博客

    欢迎访问我的个人博客ximikang icu 使用Cloudflare和notion搭建自己的博客 使用过Nation的小伙伴一定在某个时刻冒出过这样子的想法 这个笔记应用这么好用 而且是基于Web端开发的 那为什么不可以用他来作为我自己的
  • 443. 压缩字符串_38. 外观数列

    总结 双指针统计字符串 数组中相邻字符出现的个数 统计字符串中连续数 双指针 一个i 一个j j i 1 i是所有不同的数 j记录不同数的个数 443 压缩字符串 给定一组字符 使用原地算法将其压缩 压缩后的长度必须始终小于或等于原数组长度
  • vue动态增删dom元素,实现题目选项增、删、上移、下移

  • gitee如何添加SSH公钥

    下载安装git 本文重在讲解如何添加公钥 如何安装git请自行Google 使用下列命令在命令行中生成sshkey ssh keygen t rsa C xxxxx xxxxx com 按照提示完成三次回车 即可生成 ssh key 通过查
  • Keil 进入调试之后程序不运行

    keil 进入调试之后一直不运行 但是原来工程是好的 没有变过 生产了新的板子调试不了 最后发现工程的 reset 选项放在 reset pin 上 只要改为 Normal 就可以正常调试了 目录 原来 改为 根源 原来 改为 根源 官方网
  • 搭建Flink的Scala开发环境

    搭建Flink编程开发平台 1 Flink实时处理平台是基于Scala和Java的语言来开发的 安装Java语言开发环境 1 到Oracle官网下载Java Window平台安装包 或者到学习通的资料中找Window开发工具包 在这里去下载
  • 探索精彩世界,畅享短视频直播平台

    在这个充满创意和多样化的数字时代 我们为您带来了一款引人入胜的短视频直播平台 让您尽情畅享全新的娱乐体验 我们的平台凭借丰富多样的功能和吸引人的特色 为用户呈现了一个无限可能的娱乐世界 无论您是寻找灵感 追逐潮流还是寻求纯粹的娱乐 我们的平
  • 做一个程序媛是一种什么体验?

    做一个程序媛是一种什么体验 可能很多人都觉得 身为程序媛只要有颜值就够了 或者自己颜值不行 可以介绍颜值高的女性朋友们啊 秉着 男女搭配 干活不累 的原则 一个程序媛肯定是超级吃香的 至于技术嘛 没关系 不会的话撒个娇 就会有一堆程序猿们来
  • Batch Normalization(BN)超详细解析

    单层视角 神经网络可以看成是上图形式 对于中间的某一层 其前面的层可以看成是对输入的处理 后面的层可以看成是损失函数 一次反向传播过程会同时更新所有层的权重W1 W2 WL 前面层权重的更新会改变当前层输入的分布 而跟据反向传播的计算方式