Batch Normalization详解(原理+实验分析)

  • 1. 计算过程
  • 2. 前向传播过程
  • 3. 反向传播过程
  • 4. 实验分析
    • 4.1 实验一:验证有没有BatchNorm下准确率的区别
    • 4.2 实验二:验证有没有BatchNorm+noisy下准确率的区别
    • 4.3 实验三:验证有没有BatchNorm+noisy下准确率的区别
    • 4.4 实验小结
  • 5. BatchNorm的其他细节
    • 5.1 训练和推理阶段时参数的初始化问题
    • 5.2 BatchNorm在哪个位置最好?
    • 5.3 在训练时为什么不直接使用整个训练集的均值/方差?
    • 5.4 在预测时为什么不直接使用整个训练集的均值/方差?
    • 5.5 batch_size的配置
    • 5.6 对学习率有何影响?
    • 5.7 BN是正则化吗?
    • 5.8 与Dropout的有何异同?
    • 5.9 能否和Dropout混合使用?
    • 5.10 BN可以用在哪些类型的网络?
    • 5.11 缺点

注:本文内容和我的另一篇博客:,在内容上有些重合。本文前三节都是一些表面的东西,第四节注重BN本身的意义和问题,即实验分析,建议重点放在第四节。

1. 计算过程

简单地说,就是在batch的维度上计算相同通道上的均值和方差;然后再用相同batch维度上的均值和方差来做标准化。具体计算过程演示图如下:
认真看应该会看明白吧,看不懂的欢迎下面留言提问。

2. 前向传播过程

未加入Normalization之前的神经网络长成这样:

就是简单的两层全连接,中间有一个激活函数,没啥好说的。

加入BN后前向传播长成这样:

就是在激活函数之后,计算均值和方差做标准化,然后使用γ\gammaγ做缩放,β\betaβ做平移(初始化为1、0)。

均值和方差比较好理解,但是缩放系数γ\gammaγ和平移系数β\betaβ具体有什么意义呢?
由标准化公式xi^=xi−μσ2+ϵ\hat{x_{i}}=\frac{x_{i}-\mu}{\sqrt{\sigma^{2}+\epsilon}}xi​^​=σ2+ϵ​xi​−μ​,可变换下得到:
xi=σxi^+μ(1)x_{i}=\sigma \hat{x_{i}}+\mu \tag{1}xi​=σxi​^​+μ(1)
再看下还原公式:
yi=γxi^+β(2)y_{i}=\gamma \hat{x_{i}}+\beta \tag{2}yi​=γxi​^​+β(2)
(2)中γ\gammaγ和β\betaβ都是向量,显然γ\gammaγ是对 xi^\hat{x_{i}}xi​^​的缩放,β\betaβ 是对γxi^\gamma\hat{x_{i}}γxi​^​的平移。可以增加可学习的参数γ\gammaγ、β\betaβ,如果γ=σ\gamma=\sigmaγ=σ, β=μ\beta = \muβ=μ,则yi=xiy_{i}=x_{i}yi​=xi​,即可以完全还原到未normalization之前的输入!

我们可以通过反向传播来训练这两个参数(推导表明这是可以训练的),而至于 γ\gammaγ 多大程度上接近σ\sigmaσ ,β\betaβ 多大程度上接近 μ\muμ ,让损失函数对它们计算出的梯度决定!

另外贴一张别人写的计算BN的例子:

3. 反向传播过程

前向传播很好理解,反向传播就比较复杂,这块要是掰开了揉碎了说的话,又会占用大量的篇幅,所以我在我的另一篇博客:Batch Normalization的反向传播解说详细说明了BN的反向传播,欢迎关注、评论转发。

4. 实验分析

本文中涉及到的实验数据及分析,均来自于论文《How Does Batch Normalization Help Optimization?

4.1 实验一:验证有没有BatchNorm下准确率的区别

实验设置:
· 任务:分类
· 数据集:CIFAR-10
· backbone:VGG
· 对比条件:两个变量,即有没有使用BatchNorm和学习率

分析:

  1. 不同点:
    · a. 图一中表明,在训练时,使用BatchNorm会比不使用更快的进入到收敛状态
    · b. 图二中表明,在测试时,使用BatchNorm会比不使用达到更高的准确率
  2. 相同点:
    · c. 图三中表明,使用和不使用BatchNorm,在特征权重分布上的差异不明显

针对上述的c点,不禁让我们怀疑了,BatchNorm对分布约束是否有作用?下面用实验二来验证。

4.2 实验二:验证有没有BatchNorm+noisy下准确率的区别

实验设置:
· 任务:分类
· 数据集:CIFAR-10
· backbone:VGG
· 对比条件:两个变量,即有没有使用BatchNorm和随机噪声

分析:

  1. 不同点:
    · a. 图一中表明,在训练时,使用BatchNorm会比不使用更快的进入到收敛状态
    · b. 图一中表明,在训练时,即使存在噪声,使用BatchNorm也会比不使用更快的进入到收敛状态
    · c. 图二中表明,添加噪声后的模型的某一层的分布,会比不使用BatchNorm和没有噪声的BatchNorm的稳定性更差
  2. 相同点:
    · d. 图一中表明,添加的噪声的模型,在有BatchNorm的作用下,噪声对模型的影响十分的小

显然,这些发现很难与BatchNorm带来的性能提升源于层输入分布稳定性增加的说法相一致,所以下面进行实验三。

4.3 实验三:验证有没有BatchNorm+noisy下准确率的区别

根据上图,概括性地说,BatchNorm改善了损失的平滑性,使得损失函数曲面变得平滑,而平滑的损失函数进行梯度下降法变得非常容易。(“平滑性”参考下图)

4.4 实验小结

为什么BatchNorm会好使?从上面的三个实验可以看出,其原因并不主要是因为对分布有了较稳定的约束能力,更主要的原因是BatchNorm改善了损失的平滑性!

5. BatchNorm的其他细节

5.1 训练和推理阶段时参数的初始化问题

在训练阶段, 均值μ\muμ和方差σ\sigmaσ不用初始化,是计算出来的;缩放系数γ\gammaγ和β\betaβ分别初始化为1和0,训练阶段结束,模型会学习出γ\gammaγ和β\betaβ作为推理阶段的初始化。
在推理阶段, 缩放系数γ\gammaγ和β\betaβ分别初始化训练阶段学习到的值;均值μ\muμ和方差σ\sigmaσ利用训练集统计的均值和方差,统计方式一般包括移动平均全局平均。(即在训练的时候实现计算好 mean 和 var 测试的时候直接拿来用就可以了,不用计算均值和方差。)
计算方法见我的另一篇博客:BatchNorm怎样解决训练和推理时batch size 不同的问题?

5.2 BatchNorm在哪个位置最好?

首先,由3中的反向传播可以知道,BatchNorm放在任何位置都能进行求导,所以BatchNorm放在哪里都行。

放在哪里最好?这个问题已经有大量的文论说明了,看论文吧(后续整理)

5.3 在训练时为什么不直接使用整个训练集的均值/方差?

使用 BN 的目的就是为了保证每批数据的分布稳定,使用全局统计量反而违背了这个初衷。

5.4 在预测时为什么不直接使用整个训练集的均值/方差?

完全可以。由于神经网络的训练数据量一般很大,所以内存装不下,因此用指数滑动平均方法去近似值,好处是不占内存,计算方便,但其结果不如整个训练集的均值/方差那么准确。

5.5 batch_size的配置

不适合batch_size较小的学习任务。因为batch_size太小,每一个step里前向计算中所统计的本batch上的方差和均值,噪音声量大,与总体方差和总体均值相差太大。前向计算已经不准了,反向传播的误差就更大了

5.6 对学习率有何影响?

由于BN对损失函数的平滑作用,因此可以采用较大的学习率。

5.7 BN是正则化吗?

在深度学习中,正则化一般是指为避免过拟合而限制模型参数规模的做法。即正则化=简化。BN能够平滑损失函数的曲面,显然属于正则化。不过,除了在过拟合时起正则作用,在欠拟合状况下,BN也能提升收敛速度。

5.8 与Dropout的有何异同?

BN由于平滑了损失函数的梯度函数,不仅使得模型训练精度提升了,而且收敛速度也提升了;Dropout是一种集成策略,只能提升模型训练精度。因此BN更受欢迎。

5.9 能否和Dropout混合使用?

虽然混合使用较麻烦,但是可以。不过现在主流模型已经全面倒戈BN。Dropout之前最常用的场合是全连接层,也被全局池化日渐取代

5.10 BN可以用在哪些类型的网络?

其他的都行,RNN网络不ok,因为无论训练和测试阶段,每个batch上的输入序列的长度都不确定,均值和方差的统计非常困难。

5.11 缺点

模型运行时间长

Batch Normalization详解(原理+实验分析)相关推荐

  1. 批归一化(Batch Normalization)详解

    批归一化(Batch Normalization)详解 文章目录 批归一化(Batch Normalization)详解 前言 一.数据归一化 二.BN解决的问题:Internal Covariate ...

  2. Batch Normalization详解以及pytorch实验

    Batch Normalization是google团队在2015年论文<Batch Normalization: Accelerating Deep Network Training by R ...

  3. 【深度学习】Batch Normalization详解

    Batch Normalization 学习笔记 原文地址:http://blog.csdn.net/hjimce/article/details/50866313 作者:hjimce 一.背景意义 ...

  4. batch normalization详解

    1.引入BN的原因 1.加快模型的收敛速度 2.在一定程度上缓解了深度网络中的"梯度弥散"问题,从而使得训练深层网络模型更加容易和稳定. 3.对每一批数据进行归一化.这个数据是可以 ...

  5. Conditional Batch Normalization 详解(SFT思路来源)

    Conditional Batch Normalization 的概念来源于这篇文章:Modulating early visual processing by language .后来又先后被用在  ...

  6. EMD算法之Hilbert-Huang Transform原理详解和案例分析

    目录 Hilbert-Huang Transform 希尔伯特-黄变换 Section I 人物简介 Section II Hilbert-Huang的应用领域 Section III Hilbert ...

  7. 并发编程五:java并发线程池底层原理详解和源码分析

    文章目录 java并发线程池底层原理详解和源码分析 线程和线程池性能对比 Executors创建的三种线程池分析 自定义线程池分析 线程池源码分析 继承关系 ThreadPoolExecutor源码分 ...

  8. 第20节 核心交换机配置热备份详解及实验演示—基于Cisco Packet Tracer

    核心交换机配置热备份详解及实验演示 1 网络规划 1.1 核心交换机的重要性及作用 1.2 对核心交换机做热备份 2 拓扑图分析 2.1 网络环路问题及解决方案 2.1.1 网络环路问题 2.1.2 ...

  9. java list用法_Java List 用法详解及实例分析

    Java List 用法详解及实例分析 Java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中,下文对Java List用法做了详解. List:元素是有序的(怎么存的就怎么取出来,顺 ...

最新文章

  1. ASP.NET中的母版页
  2. 通过Ajax来简单的实现局部刷新(主要为C#中使用的UpdatePanel控件和ScriptManager控件)...
  3. *36.操作系统中磁盘的调度算法
  4. 前后端分离的跨域解决方案
  5. 专门用于微信公众平台的Javascript API
  6. fs react 使用 保存文件_使用FS进行文件同步和备份
  7. [转帖]FPGA--Vivado
  8. 2万字带你攻略掉Selenium
  9. 虚拟化基础架构Windows 2008篇之2-域用户与域用户组管理
  10. 3.Knockout.Js(属性绑定)
  11. 嵌入式系统三级考试终结版2019.3
  12. Gary Marcus:因果熵理论的荒诞和认知科学带给AI的11个启示 | 文末赠书
  13. 使用STM32CubeProgrammer烧录STM32芯片
  14. sharepoint 回收站 java_Sharepoint 2013 回收站知识整理
  15. 炼石喜获“2020中国网络安全产业联盟突出贡献单位奖”
  16. Android 手机遥控器添加模拟鼠标功能
  17. python适合做网页吗_python是否适合网页编程详解
  18. C语言语音朗读小工具
  19. 战地4服务器物理地址,战地4 游戏服务器地址
  20. R语言爬虫豆瓣高评分电影(喝最烈的酒,熬最深的夜,吃最好的胃药,敷最贵的面膜)

热门文章

  1. python基础语法和变量
  2. Kafka bootstrap.servers
  3. 天使的微笑——《天使爱美丽》
  4. 服务器地址错误如何修复,ip地址错误怎么办
  5. System.setOut()重定向输出解释
  6. Local declaration of 'XXX' hides instance variable
  7. DICOM MPPS 的原理及应用(Principle and Application of DICOM MPPS)
  8. flink on yarn使用第三方jars的方法如何查看进程所持有jar包
  9. yii mysql gii_Yii 框架使用Gii生成代码操作示例
  10. Python学习 - 冯诺伊曼体系结构建模与模拟 之TOY模型机