深度学习中的归一化

一. 归一化解决什么问题?

在训练的时候,输入分布的变化要求较低的学习率和较为严谨的参数初始化,使得训练模型困难。此外,各层输入分布的变化带来了一个问题,因为各层需要不断地适应新的分布,把这个问题称为内部协变量偏移(internal covariate shift)。

二. 归一化的种类

深度学习中有以下四种常用的归一化方法:

  • Batch Normalization
  • Layer Normalization
  • Instance Normalization
  • Group Normalization

1. Batch Normalization

Batch Normalization就是将每个batch之间一一对应的每个channel相加,求均值,和方差之后做归一化处理.最后再加入缩放和平移变量. 均值计算,就是在一个mini-batch 里面,将每个channel中的值累加起来,再除以N×H×WN \times H \times WN×H×W, 最后这个值是个1维度的数值,即有多少个channel,其维度就为:(1, channel, 1, 1).

例子:该批次内有10张图片,每张图片有三个通道RBG,每张图片的高、宽是H、W,那么均值就是计算10张图片R通道的像素数值总和除以 N×H×WN \times H \times WN×H×W,再计算B通道全部像素值总和除以N×H×WN \times H \times WN×H×W,最后计算G通道的像素值总和除以N×H×WN \times H \times WN×H×W。方差的计算类似。

训练网络时候具体算法公式如下:

有两个需要学习的变量γ,β\gamma , \betaγ,β,分别是缩放和平移.这两个参数的维度等于张量的channel维度.

而在推理的时候,上面的均值计算和方差计算则有所差异.

在训练状态下,γ,β\gamma , \betaγ,β是可训练参数,在推理状态下,直接加载训练好的数值。而均值和方差在推理的时候是基于所有批次的期望计算所得. 具体源码可以参考[3]的讲解.

2. Layer Normalization

Layer Normalization是在一个样本里面,对每个channel进行求均值和方差. 不同于BN, LN不依赖于batch size, 因此不需要批训练,在单条数据内部就能归一化. 和BN计算的方法类似, 如下所示:

μ(x)=1CHW∑i=1CHWxi\mu (x) = \frac{1}{CHW} \sum_{i=1}^{CHW} x_i μ(x)=CHW1​i=1∑CHW​xi​

σ(x)=1CHW∑i=1CHW(xi−μ)2\sigma (x) = \sqrt{\frac{1}{CHW} \sum_{i=1}^{CHW} (x_i - \mu)^2} σ(x)=CHW1​i=1∑CHW​(xi​−μ)2​

例子:对于feature mapx∈RN×C×H×Wx \in \R^{N \times C \times H \times W}x∈RN×C×H×W,有C个通道,长、高是W、H,LN对每个样本的C,H,WC, H, WC,H,W维度上计算均值和标准差. 那么均值就是计算在该样本里面所有通道内, 像素数值总和除以 C×H×WC \times H \times WC×H×W。方差的计算类似。

3. Instance Normalization

Instance Normalization是针对于图像像素做归一化,最初用于图像的风格迁移任务中.在图像风格化中,生成结果主要依赖于某个图像实例,feature map 的各个 channel 的均值和方差会影响到最终生成图像的风格。所以对整个batch归一化不适合图像风格化中,因而对H、W做归一化。可以加速模型收敛,并且保持每个图像实例之间的独立。

μ(x)=1HW∑i=1HWxi\mu (x) = \frac{1}{HW} \sum_{i=1}^{HW} x_i μ(x)=HW1​i=1∑HW​xi​

σ(x)=1HW∑i=1HW(xi−μ)2\sigma (x) = \sqrt{\frac{1}{HW} \sum_{i=1}^{HW} (x_i - \mu)^2} σ(x)=HW1​i=1∑HW​(xi​−μ)2​

例子:对于feature mapx∈RN×C×H×Wx \in \R^{N \times C \times H \times W}x∈RN×C×H×W,有C个通道,长、高是W、H。IN对每个样本上的每个通道计算均值和标准差. 那么均值就是计算样本里每个通道内的像素数值总和除以 H×WH \times WH×W。方差的计算类似。

4. Group Normalization

Group Normalization是为了解决BN对较小的mini-batch size效果差的问题。GN适用于占用显存比较大的任务,例如图像分割。对这类任务,可能 batch size 只能是个位数,再大显存就不够用了。而当 batch size比较小的时候,BN 的表现很差,因为没办法通过几个样本的数据量,来近似总体的均值和标准差。

GN的主要思想就是在channel方向group, 然后每个group内做归一化.计算(C/G)×H×W(C/G) \times H \times W(C/G)×H×W的均值和方差, 与batch size无关.

μ(x)=1(C/G)HW∑C=gC/GC/Gxi\mu (x) = \frac{1}{(C/G) HW} \sum_{C=g C/G}^{C/G} x_i μ(x)=(C/G)HW1​C=gC/G∑C/G​xi​

σ(x)=1(C/G)HW∑C=gC/GC/G(xi−μ)2\sigma (x) = \sqrt{\frac{1}{(C/G) HW} \sum_{C=g C/G}^{C/G} (x_i - \mu)^2} σ(x)=(C/G)HW1​C=gC/G∑C/G​(xi​−μ)2​

例子:对于feature mapx∈RN×C×H×Wx \in \R^{N \times C \times H \times W}x∈RN×C×H×W,有C个通道,长、高是W、H。GN对每个样本上的(C/G)(C/G)(C/G)个通道计算均值和标准差. 那么均值就是计算样本里(C/G)(C/G)(C/G)个通道内的像素数值总和除以 (C/G)×H×W(C/G) \times H \times W(C/G)×H×W。方差的计算类似。

如果我们将组的数量设置为G = 1,则GN变为LN 。LN假设层中的所有通道都做出“类似的贡献”。GN比LN受限制更少,因为假设每组通道(而不是所有通道)都受共享均值和方差的影响; 该模型仍然具有为每个群体学习不同分布的灵活性。这导致GN相对于LN的代表能力提高。如果我们将组的数量设置为G = C(即每组一个通道),则GN变为IN。 但是IN只能依靠空间维度来计算均值和方差,并且错过了利用信道依赖的机会。

三. 总结

  • BN, IN, GN,其γ\gammaγ和β\betaβ都是维度等于通道数CCC的矩阵.而对于LN, 其γ\gammaγ和β\betaβ都是维度等于normalizaed_shape的向量.

  • BN, IN可以设置参数 momentum和track_running_stats来获得在整体数据上更准确的均值和标准差. LN和GN只能计算当前batch内数据的真实均值和标准差.

  • BN是在batch上,对N、H、W做归一化,而保留通道 C 的维度。BN对较小的batch size效果不好。BN适用于固定深度的前向神经网络,如CNN,不适用于RNN。

  • LN在通道方向上,对C、H、W归一化,主要对RNN效果明显。

  • IN在图像像素上,对H、W做归一化,用在风格化迁移。

  • GN将channel分组,然后再做归一化。

Reference:

  1. https://www.cnblogs.com/jiangkejie/p/14291407.html
  2. https://blog.csdn.net/bestrivern/article/details/102871014
  3. https://zhuanlan.zhihu.com/p/93643523
  4. https://zhuanlan.zhihu.com/p/337732517

深度学习中的常用的归一化方法汇总相关推荐

  1. 深度学习中防止过拟合的方法

    在深度学习中,当数据量不够大时候,常常采用下面4中方法: 1. 人工增加训练集的大小. 通过平移, 翻转, 加噪声等方法从已有数据中创造出一批"新"的数据.也就是Data Augm ...

  2. 深度学习之四:常用模型和方法

     九.Deep Learning的常用模型或者方法 9.1.AutoEncoder自动编码器 Deep Learning最简单的一种方法是利用人工神经网络的特点,人工神经网络(ANN)本身就是具有 ...

  3. 吴恩达深度学习编程作业报错解决方法汇总

    概述及资源分享 大二结束后的暑假,学习吴恩达深度学习([双语字幕]吴恩达深度学习deeplearning.ai_哔哩哔哩_bilibili)的课程,在做编程作业的时候总是遇到一些报错,尤其是导入所需要 ...

  4. 机器学习/深度学习中的常用损失函数公式、原理与代码实践(持续更新ing...)

    诸神缄默不语-个人CSDN博文目录 最近更新时间:2023.5.8 最早更新时间:2022.6.12 本文的结构是首先介绍一些常见的损失函数,然后介绍一些个性化的损失函数实例. 文章目录 1. 分类 ...

  5. python命令大全-深度学习中python常用命令

    1. print大法 test = Hello World print ("test:" + test) 2. math和numpy的区别:math只对单个元素,numpy会bro ...

  6. python的基础命令_深度学习中python常用命令

    1. print大法 test = Hello World print ("test:" + test) 2. math和numpy的区别:math只对单个元素,numpy会bro ...

  7. python 代码命令大全-深度学习中python常用命令

    1. print大法 test = Hello World print ("test:" + test) 2. math和numpy的区别:math只对单个元素,numpy会bro ...

  8. 深度学习中的常用的损失函数(PyTorch)

    目录 定义 分类问题(Classification) Cross-Entropy Loss Dice Loss Focal Loss Jaccard/Intersection over Union ( ...

  9. 深度学习中的归一化方法总结(BN、LN、IN、GN、SN、PN、BGN、CBN、FRN、SaBN)

    目录 概要 Batch Normalization(BN) (1)提出BN的原因 (2)BN的原理 (3)BN优点 (4)BN缺点 Instance Normalization(IN) (1)提出IN ...

  10. 深度学习中的归一化方法简介(BN、LN、IN、GN)

    文章目录 1. 协方差偏移 1.1 协方差偏移的概念 1.2 协方差偏移的影响 2. 归一化的通用框架与基本思想 3. 常见的归一化方法 3.1 Batch Nomalization 3.1.1 什么 ...

最新文章

  1. javascript的call()方法与apply()方法的理解
  2. 压缩 20M 文件从 30 秒到 1 秒的优化过程!
  3. 使用JScript设置SVN客户端hook
  4. Kafka 入门之集群部署遇到问题
  5. mvc html validator,ASP.NET MVC实现Validation验证器扩展
  6. 多字段回溯 mysql_回溯算法 | 追忆那些年曾难倒我们的八皇后问题
  7. C++ static关键字作用讲解
  8. 单片机c语言二进制转10进制,51单片机用C语言怎么样把八位二进制转换成十进制...
  9. 【概率论】标准正态分布及概率表
  10. Online Adaptation of Convolutional Neural Networks for Video Object Segmentation论文阅读
  11. JavaScript编程入门
  12. python爬虫微信刷票_Python爬虫教程:你还在苦苦拉票吗?刷票小程序案例原理剖析!...
  13. Hadoop,Spark错误:Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
  14. 性能优化检测Instruments-time profile的使用
  15. 随时随地掌上邮,飞邮Android版邮件客户端正式提供试用
  16. 以IM为例看58同城典型技术架构演变
  17. Bayesian Convolution Neural Networks with Bernoulli Approximate Variational Inference
  18. 进销存系统--ERP软件常用货物计量单位汇总
  19. 完全用css代码实现二维码扫描图标
  20. 熵编码算法Range encoding工程原理和实现

热门文章

  1. 阅读YYKit之YYImage实现gif展示
  2. mysql查找数据库文件位置
  3. VS2015密钥 VS2017密钥
  4. ZendStudio
  5. STM32F103基于固件库创建工程模板
  6. 单片机怎么通过按键控制计时器的开始和停止_单片机新手入门系列视频集锦
  7. 偏相关分析在python上的实现(支持栅格数据)
  8. 设置网页默认浏览IE版本
  9. WIFI快连协议层原理
  10. Struts2 面试题