深度深度网络设计中各种归一化方法总结
归一化方法总结
- 前言
- 批量归一化 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−1mEB[σ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=1Cxbchw
σ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的梯度,如下:
可以得到两个发现:
- g∣∣v∣∣\frac{g}{||v||}∣∣v∣∣g表明在更新vvv时会对梯度进行缩放;
- 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
- ImageNet Classification with Deep ConvolutionalNeural Networks;
- Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift;
- Layer Normalization;
- Instance Normalization: The Missing Ingredient for Fast Stylization;
- Group Normalization;
- Arbitrary Style Transfer in Real-time with Adaptive Instance Normalization;
- Weight Normalization: A Simple Reparameterization to Accelerate Training of Deep Neural Networks;
深度深度网络设计中各种归一化方法总结相关推荐
- 饮水思源--浅析深度学习框架设计中的关键技术
点击上方"深度学习大讲堂"可订阅哦! 编者按:如果把深度学习比作一座城,框架则是这座城中的水路系统,而基于拓扑图的计算恰似城中水的流动,这种流动赋予了这座城以生命.一个优雅的框架在 ...
- 深度学习网络设计原则
深度学习网络设计原则 输出特征图的大小逐渐减小 在网络较深层应该利用更多的feature map Bottleneck layer的设计 同时增加网络的深度和宽度 翻译及理解自论文Rethinki ...
- [每日一问]虚拟化网络设计中为什么建议采用链路聚合
虚拟化网络设计中为什么建议采用链路聚合?原因如下: 1. 首先,链路聚合技术可以使用多个物理链路进行通信,不用担心STP: 2. 其次,当某物理链路发生故障会不影响虚拟机网络的正常运行,提供了链路冗余 ...
- VMware vSAN网络设计中不得不说的事
VMware vSAN网络设计中不得不说的事 原创 李严省 虚实之路 2018-06-07 VMware vSAN分布式存储我想大家都已经很了解了,我再简单的啰嗦一下.VMware vSAN架构如下图 ...
- 深度学习中的归一化方法总结(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 ...
- 深度学习中的归一化方法BN,LN,IN,GN
文章目录 前言 一.BN 二.LN 三.IN 四.GN 前言 归一化层,目前主要有这几个方法, 1.Batch Normalization(2015) 2.Layer Normalization(20 ...
- 深度学习中的归一化方法简介(BN、LN、IN、GN)
文章目录 1. 协方差偏移 1.1 协方差偏移的概念 1.2 协方差偏移的影响 2. 归一化的通用框架与基本思想 3. 常见的归一化方法 3.1 Batch Nomalization 3.1.1 什么 ...
- 用于视觉识别的深度卷积网络空间金字塔池化方法
摘要 现有的深卷积神经网络(CNN)需要一个固定大小的神经网络(例如224x224)的输入图像.这种要求是"人为的",可能会降低对任意大小/尺度的图像或子图像的识别精度.在这项工作 ...
- 深度学习网络训练中出现nan的原因分析
报错: nan:Not a Number 该错误导致的后果:造成训练准确率的断崖式下跌 错误原因分析: 1)在loss函数中出现nan 出现原因:一般是因为tf中的log函数输入了'负数'或'0'值( ...
- 最优化在供应链网络设计中的应用:基于Python
摘要 本博客旨在提供学生python版本的供应链网络设计的例子.案例研究来自苏尼尔•乔普拉(Sunil Chopra)和彼得•迈德尔(Peter Meindl)合著的<供应链管理>(The ...
最新文章
- python3 报错 ‘builtin_function_or_method‘ object has no attribute 解决方法
- Git 之fatal: remote origin already exists 错误解决办法(通俗易懂)
- java继承类型的用法_详解Java中使用externds关键字继承类的用法
- SAP UI5 CreateBindingContext 方法的实现逻辑
- Java接口有时有结果 有时没有_《Java程序员面试笔试宝典》之为什么Java中有些接口没有任何方法...
- sql卡住php-fpm会cpu大涨,排查PHP-FPM占用CPU过高
- 【普通の随笔】3.26
- 【题解】(排序) —— POJ 0811:牛的选举
- docker build命令详解_Docker镜像与容器常用命令图文详解
- vue-music 关于搜索历史本地存储
- 第55章、播放视频(从零开始学Android)
- 【项目简介】LinkWeChat:基于企业微信开源系统
- 新版win10卸载Microsoft Edge
- 锐捷长ping_锐捷交换机命令
- Win7系统自带 计算器 详细使用方法
- 2022面试必刷461道大厂架构面试真题汇总+面经+简历模板
- 分布式环境下限流方案的实现
- centos Unison+Inotify双向同步
- [OCCT] Open CASCADE Technology的编译(包含示例的编译)
- 查看电脑的开关机记录