归一化方法总结

  • 前言
  • 批量归一化 BN
  • 层归一化LN
  • 实例归一化IN
    • 自适应实例归一化AdaIN
  • 组归一化GN
  • 局部响应归一化LRN
  • 权重归一化WN
  • 总结->各种归一化的统一数学表达形式
  • References

前言

狭义的归一化指对输入特征进行归一化, 这在经典的机器学习中用的比较多,目的是为了消除不同特征量纲的差异。常用的归一化方法包括: Z-score, Min-Max scaler等等。

这里,我们主要总结深度学习中的一些归一化的技巧。深度学习中的归一化已经不仅仅局限于输入数据的归一化,而是网络各个层的归一化,因为每个层相当于一个非线性变换, 随着网络层数的加深,数据分布会发生较大变化(即internal covariate shift)。归一化实际上起到正则化的作用,能够大大促进网络的训练和收敛, 减轻了对参数处置的敏感性, 允许模型以更大的学习率进行训练。

批量归一化 BN

Batch Normalization顾名思义就是对每个min-batch samples进行归一化,

下图为一个BN变换的伪码, 其中mmm为Batchsize的大小,xix_{i}xi​实际上就是就是第i个样本feed forward到某个层的某个神经元节点的input(也就是上一层的输出的加权和)
可以看到:
1.BN操作实在Batch维度上进行的,具体:每个Batch包含m个样本,基于这m个samples为每个feature独立计算均值和方差,然后进行类似于Z-Score的操作,最后通过trainable parameters进行伸缩和平移,目的是为了保证BN变换为恒等变换

实际上BN操作可以看作一个独立的网络层。

下面是BN变换更加抽象的一种写法,增益参数gilg_{i}^{l}gil​, 这里的aila_{i}^{l}ail​表示第l层的第i个节点的输入,它实际上就是由上一层输出hlh_{l}hl​经过Linear projection得到:

那么在网络训练和推断的过程中如何使用BN呢?
以前是每层的输入xxx直接作为该层的Input,有了BN以后,x首先用于计算BN的输出yyy,然后再把y作为该层Input, 这样以来,网络修改完毕 (见下图伪码2-5)。

网络修改完成后就可以再进行训练以同时优化原始模型参数和BN操作的参数(λ,β\lambda, \betaλ,β)了。

训练完成后,就可以将其用于推断了,这里的问题是: 推断时Batch=1, 如何来估计均值和方差呢?
这里使用所有mini-batches的samples来估计均值和方差,其在整个Inference的整个过程中是保持不变的,具体:
E[x]←EB[μB]E[x] \leftarrow E_{B}[\mu_{B}]E[x]←EB​[μB​]
Var[x]←mm−1EB[σB2]Var[x]\leftarrow \frac{m}{m-1}E_{B}[\sigma_{B}^{2}]Var[x]←m−1m​EB​[σB2​]

这样以来,对于测试样本xxx, 它的normalized input可以估计为:
x^=x−E[x]Var[x]+ϵ\hat{x}=\frac{x-E[x]}{\sqrt{Var[x]+\epsilon }}x^=Var[x]+ϵ​x−E[x]​

相应的BN变换可以写为:
y=λx^+β=λvar[x]+ϵx+(β−λE[x]var[x]+ϵ)y=\lambda \hat{x}+\beta=\frac{\lambda}{\sqrt{var[x]+\epsilon}}x+(\beta-\frac{\lambda E[x]}{\sqrt{var[x]+\epsilon}})y=λx^+β=var[x]+ϵ​λ​x+(β−var[x]+ϵ​λE[x]​)

BN如何应用到卷积网络中呢?
原文中有这样的表述: we let B be the set of
all values in a feature map across both the elements of a
mini-batch and spatial locations,可见对于一个尺寸为(B, C, H,W)的Tensor, B,H,W这三个维度是共享归一化参数的,换句话说,BN操作逐Channel独立进行的,更严格的数学定义如下:


归一化参数(μ,σ\mu, \sigmaμ,σ)总共有2C个。

缺点
1.Batchsize的设置对BN的效果有很大影响;
2.BN主要是应用的前馈神经网络,不适用循环网络, 原因在于:RNN是按timestep展开的深度神经网络,假定RNN中使用BN的话,需要为每个timestep存储相关的统计信息,这本身耗费大量存储,更严重的是,RNNs支持变长输入, 如果test sequence的长度比training sequence的长度还长,这显然会出问题;
3. BN并不适用对噪声敏感(noise-sensitive)的场景、任务,比如强化学习等, 原因在于: 归一化的时候总是用在mini-batch上的统计信息来近似替代全局的统计信息,这引入了Noise。
4.

层归一化LN

Layer Normlaization 顾名思义就是对每个Layer内各个神经元的输入进行归一化,换句话说,Leyer内的各个神经元共享归一化参数,并且这些参数与Batchsize的大小无关,从而克服了BN中对BatchSize的依赖,可以用到Online Scenario (例如RNNs)。

上述参数的计算如下,H为某隐层的神经元节点的数量,

对于RNN, LN的定义如下, 其中ggg和bbb分别代表增益参数和偏置参数:

其中第ttt步的输入ata^{t}at计算如下:

众所周知,标准的RNN极易出现梯度爆炸和梯度消失的问题,加入了LN以后,LN使得对某一层所有的Summed inputs的缩放不会引起average summed input产生变化,这使得隐藏层之间的动态变化、信息流更加稳定;

LN是在RNN背景下提出的,也可以将其应用到全连接前馈神经网络(FFNN)中, 具体上面公式中的H表示隐层节点的数量, 那么如何将其用到卷积网络CNN中呢?

由于每个卷积核用于从Input中提取某种Pattern,因此对于一个尺寸为(B,C, H,W)的Tensor, LN实际上是在C, H, W三个维度上进行的,其数学定义如下:
LN(x)=λ(x−μ(x)σ(x))+βLN(x)=\lambda(\frac{x-\mu(x)}{\sigma(x)}) + \betaLN(x)=λ(σ(x)x−μ(x)​)+β
μb(x)=1HWC∑h=1H∑w=1W∑c=1Cxbchw\mu_{b}(x)=\frac{1}{HWC}\sum_{h=1}^{H}\sum_{w=1}^{W}\sum_{c=1}^{C}x_{bchw}μb​(x)=HWC1​∑h=1H​∑w=1W​∑c=1C​xbchw​
σb(x)=1HWC∑h=1H∑w=1W∑c=1C(xbchw−μb(x))2+ϵ\sigma_{b}(x)=\sqrt{\frac{1}{HWC}\sum_{h=1}^{H}\sum_{w=1}^{W}\sum_{c=1}^{C}(x_{bchw}-\mu_{b}(x))^{2}+\epsilon}σb​(x)=HWC1​∑h=1H​∑w=1W​∑c=1C​(xbchw​−μb​(x))2+ϵ​
LN的归一化参数量为2B。

实例归一化IN

Instance normalization (IN), 顾名思义是在Instance level进行归一化, 实际上它与BN的区别也在于此: BN是在整个samples上进行归一化,Batch维度共享归一化参数,而IN是在逐个Sample内进行归一化。 其数学定义如下:


对于尺寸为(B,C, H,W)的Tensor, 总的归一化参数(μ,σ\mu, \sigmaμ,σ)的数量为:2BC (而BN只有2C个).。

自适应实例归一化AdaIN

提到IN, 有必要提及著名的自适应实例归一化(Adaptive Instance Normalization, AdaIN), AdaIN在很多经典的Style transfer的研究中都有使用。 什么是AdaIN?
AdaIN基于所谓的Conditioned Instance Normalization (CIN)进一步发展而来,主要作用是直接使用Target style的统计信息(对应λ,β\lambda, \betaλ,β)来对Normalized Content image的style进行迁移,其数学与IN操作非常类似,定义如下:

可以看到,括号里面是对Input image进行Normalize操作, 在IN中,λ,β\lambda,\betaλ,β分别对应scale和shift的参数, 也是网络需要去学习的参数。而在AdaIN里面,对应的参数σ,μ)\sigma, \mu)σ,μ)表示的是任意Style Image的统计信息, 不需要通过训练获得。简而言之, AdaIN通过在Feature spapce 迁移Feature statistics进行Style Transfer

组归一化GN

Group Normalization (GN)与Layer Normalization之间的关系就像分组卷积相比于常规卷积。简单来说,就是把Chanel维度分为G(G为预定义的超参数)个组, 然后组内独立进行Layer Normalization。 对于尺寸为(B,C,H,W)的Tensor, GN的归一化参数(μ,σ\mu, \sigmaμ,σ)的数量为2BG (是LN归一化参数的G倍)。

局部响应归一化LRN

Local Response Normalization (LRN)最早在AlexNet中被提出, 与上面几种归一化技术不太一样,LRN实际上仿造了生物学上活跃的神经元对相邻神经元的抑制现象(侧抑制),其数学定义如下:

其中ax,yja_{x,y}^{j}ax,yj​表示将第j个Kernel应用到位置(x,y)后的非线性激活值,bx,yjb_{x,y}^{j}bx,yj​即为其对应的LRN后的值。

可以看到LRN实际上就是在Channel方向上进行局部响应归一化, 具体来说:对于第i个channel的任意位置,基于其前n/2和后n/2对应位置的信息进行局部归一化,示意图如下:

权重归一化WN

上面提到的几个Normalization技术都是对某一层的Input进行Normalization, 而这里的Weight Normalization (WN)顾名思义是对权重进行Normalization。

WN的核心思想就是就是将权重向量的欧式范数与其方向进行了解耦。 其数学定义如下:

其中WWW表示待优化的权重向量,vvv为参数向量,ggg为参数标量。
可以看到:当g=∣∣w∣∣g=||w||g=∣∣w∣∣且v=wv=wv=w时,WN就退化为恒等映射, 因此WN的网络容量要更大,具体来说,1.当把参数g固定时, 只优化www的方向,2.当把v固定时,只优化www的范数。

可以很容易计算Loss-LLL关于参数www和vvv的梯度,如下:



可以得到两个发现:

  1. g∣∣v∣∣\frac{g}{||v||}∣∣v∣∣g​表明在更新vvv时会对梯度进行缩放;
  2. MwM_{w}Mw​表明更新vvv时会将梯度投影到一个远离▽w\bigtriangledown _{w}▽w​的方向;

特点:
WN操作的对象时权重参数,不依赖batchsize, 因此可以用到RNNs 以及其他noise-sensitive的场景(如强化学习, 生成式模型)中。

总结->各种归一化的统一数学表达形式


如上图,不同的归一化方式的区别仅在于共享归一化参数的维度不同,具体来说:
BN是逐Channel进行的,
LN是逐Sample进行的
IN 逐Channel, 逐Sample进行的
GN是逐Sample, 且Channel维度逐Group进行的

上面4中归一化的统一数学表达形式为 (此处忽略Scale和Shift操作):


区别就在于集合SiS_{i}Si​的定义上, 具体:
BN中,

LN中,

IN中,

GN中,

Ok.

References

  1. ImageNet Classification with Deep ConvolutionalNeural Networks;
  2. Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift;
  3. Layer Normalization;
  4. Instance Normalization: The Missing Ingredient for Fast Stylization;
  5. Group Normalization;
  6. Arbitrary Style Transfer in Real-time with Adaptive Instance Normalization;
  7. Weight Normalization: A Simple Reparameterization to Accelerate Training of Deep Neural Networks;

深度深度网络设计中各种归一化方法总结相关推荐

  1. 饮水思源--浅析深度学习框架设计中的关键技术

    点击上方"深度学习大讲堂"可订阅哦! 编者按:如果把深度学习比作一座城,框架则是这座城中的水路系统,而基于拓扑图的计算恰似城中水的流动,这种流动赋予了这座城以生命.一个优雅的框架在 ...

  2. 深度学习网络设计原则

    深度学习网络设计原则 输出特征图的大小逐渐减小 在网络较深层应该利用更多的feature map Bottleneck layer的设计 同时增加网络的深度和宽度   翻译及理解自论文Rethinki ...

  3. [每日一问]虚拟化网络设计中为什么建议采用链路聚合

    虚拟化网络设计中为什么建议采用链路聚合?原因如下: 1. 首先,链路聚合技术可以使用多个物理链路进行通信,不用担心STP: 2. 其次,当某物理链路发生故障会不影响虚拟机网络的正常运行,提供了链路冗余 ...

  4. VMware vSAN网络设计中不得不说的事

    VMware vSAN网络设计中不得不说的事 原创 李严省 虚实之路 2018-06-07 VMware vSAN分布式存储我想大家都已经很了解了,我再简单的啰嗦一下.VMware vSAN架构如下图 ...

  5. 深度学习中的归一化方法总结(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 ...

  6. 深度学习中的归一化方法BN,LN,IN,GN

    文章目录 前言 一.BN 二.LN 三.IN 四.GN 前言 归一化层,目前主要有这几个方法, 1.Batch Normalization(2015) 2.Layer Normalization(20 ...

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

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

  8. 用于视觉识别的深度卷积网络空间金字塔池化方法

    摘要 现有的深卷积神经网络(CNN)需要一个固定大小的神经网络(例如224x224)的输入图像.这种要求是"人为的",可能会降低对任意大小/尺度的图像或子图像的识别精度.在这项工作 ...

  9. 深度学习网络训练中出现nan的原因分析

    报错: nan:Not a Number 该错误导致的后果:造成训练准确率的断崖式下跌 错误原因分析: 1)在loss函数中出现nan 出现原因:一般是因为tf中的log函数输入了'负数'或'0'值( ...

  10. 最优化在供应链网络设计中的应用:基于Python

    摘要 本博客旨在提供学生python版本的供应链网络设计的例子.案例研究来自苏尼尔•乔普拉(Sunil Chopra)和彼得•迈德尔(Peter Meindl)合著的<供应链管理>(The ...

最新文章

  1. python3 报错 ‘builtin_function_or_method‘ object has no attribute 解决方法
  2. Git 之fatal: remote origin already exists 错误解决办法(通俗易懂)
  3. java继承类型的用法_详解Java中使用externds关键字继承类的用法
  4. SAP UI5 CreateBindingContext 方法的实现逻辑
  5. Java接口有时有结果 有时没有_《Java程序员面试笔试宝典》之为什么Java中有些接口没有任何方法...
  6. sql卡住php-fpm会cpu大涨,排查PHP-FPM占用CPU过高
  7. 【普通の随笔】3.26
  8. 【题解】(排序) —— POJ 0811:牛的选举
  9. docker build命令详解_Docker镜像与容器常用命令图文详解
  10. vue-music 关于搜索历史本地存储
  11. 第55章、播放视频(从零开始学Android)
  12. 【项目简介】LinkWeChat:基于企业微信开源系统
  13. 新版win10卸载Microsoft Edge
  14. 锐捷长ping_锐捷交换机命令
  15. Win7系统自带 计算器 详细使用方法
  16. 2022面试必刷461道大厂架构面试真题汇总+面经+简历模板
  17. 分布式环境下限流方案的实现
  18. centos Unison+Inotify双向同步
  19. [OCCT] Open CASCADE Technology的编译(包含示例的编译)
  20. 查看电脑的开关机记录

热门文章

  1. 天线接口:SMA、TNC 有什么差别?
  2. 金万维异速联服务器重装,金万维异速联服务器配置说明
  3. xcode ios 怎么导入p12证书
  4. 《Linux程序设计(第4版)》阅读心得
  5. 一图看懂经典面试题——左外连接,右外连接,内连接的区别
  6. matlab模拟静电场边值,静电场边值问题有限差分法的仿真分析
  7. javaShop JAVA版多用户B2B2C商城源码(PC+H5+小程序+APP)
  8. JUnit4单元测试入门教程
  9. 车辆销售系统用例_汽车销售管理系统UML建模分析.doc
  10. OGNL表达式语言详解