理解多种normalization的意义

normalization 的部分理解

normaliztion是一个线性的操作,其目标是将非标准正态分布的数据数据,转换成为标准的正态分布(这个操作又称为白化),并且添加scale加上shift操作(y=scale*x+shift), 这样将(0 , 1)标准正态分布的输入数据转换成为稍微偏离(0, 1)标准正态分布的数据输入,可以保证输入数据基本维持正态状态,且输入非线性。normaliztion常见的有五种,batch normaliation, layer normaliztion, instance normalztion, group normaliztion,Weight Normalization, 对于每一种normaliztion,必须要知道其内部结构,和不同的normaliztion在什么应用场景下使用是最优的。

所有norm共同点就是:

  1. 机器学习领域有个很重要的假设:IID独立同分布假设,就是假设训练数据和测试数据是满足相同分布的,这是通过训练数据获得的模型能够在测试集获得好的效果的一个基本保障。 所有bn的方法都是基于这个假设设计的。
  2. 使得数据更加符合独立同分布条件,减少internal corvariate shift导致的偏移。
  3. 使数据远离激活函数的饱和区,加快速度。
q1: batch nromaliztion简介
  1. batch norm的背景问题: 2015年Ioffe 和Szegedy提出的论文中首先提出,mini-batch相对于one example的训练方法,梯度更新方向更准确,并行计算速度快,因此训练效果较好。而mini-batch有一个缺点,就是使用SGD的过程中超参数调整困难时常会出现训练效果不佳的情况,时常会出现梯度消失,或者长期loss无法下降,接着引入covariate shift的概念:如果ML系统实例集合<X,Y>中的输入值X的分布老是变,这不符合IID假设,网络模型很难稳定的学规律,这不得引入迁移学习才能搞定吗,我们的ML系统还得去学习怎么迎合这种分布变化啊。对于深度学习这种包含很多隐层的网络结构,在训练过程中,因为各层参数不停在变化,所以每个隐层都会面临covariate shift的问题,也就是在训练过程中,隐层的输入分布老是变来变去,这就是所谓的“Internal Covariate Shift”,Internal指的是深层网络的隐层,是发生在网络内部的事情,而不是covariate shift问题只发生在输入层
  2. batch norm理解: 之前的研究表明如果在图像处理中对输入图像进行白化(Whiten)操作的话——所谓白化,就是对输入数据分布变换到0均值,单位方差的正态分布——那么神经网络会较快收敛,那么BN作者就开始推论了:图像是深度神经网络的输入层,做白化能加快收敛,那么其实对于深度网络来说,其中某个隐层的神经元是下一层的输入,意思是其实深度神经网络的每一个隐层都是输入层,不过是相对下一层来说而已,那么能不能对每个隐层都做白化呢?这就是启发BN产生的原初想法,而BN也确实就是这么做的,可以理解为对深层神经网络每个隐层神经元的激活值做简化版本的白化操作
  3. 使用batch norm的原因: 因为深层神经网络在做非线性变换前的激活输入值(就是那个x=WU+B,U是输入)随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(对于Sigmoid函数来说,意味着激活输入值WU+B是大的负值或正值),所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因,而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。
  4. 算法过程:
    sum
  • 沿着通道计算每个batch的均值u
  • 沿着通道计算每个batch的方差σ^2
  • 对x做归一化,x’=(x-u)/开根号(σ^2+ε)
  • 加入缩放和平移变量γ和β ,归一化后的值,y=γx’+β

  1. batch norm的作用: BatchNorm就是在深度神经网络训练过程中使得每一层神经网络的输入保持相同分布的。
  2. BN的基本思想:因为深层神经网络在做非线性变换前的激活输入值(就是那个x=WU+B,U是输入)随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(对于Sigmoid函数来说,意味着激活输入值WU+B是大的负值或正值),所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因,而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。
    THAT’S IT。其实一句话就是:于每个隐层神经元,把逐渐向非线性函数映射后向取值区间极限饱和区靠拢的输入分布强制拉回到均值为0方差为1的比较标准的正态分布,使得非线性变换函数的输入值落入对输入比较敏感的区域,以此避免梯度消失问题。因为梯度一直都能保持比较大的状态,所以很明显对神经网络的参数调整效率比较高,就是变动大,就是说向损失函数最优值迈动的步子大,也就是说收敛地快。BN说到底就是这么个机制,方法很简单,道理很深刻。


    标准正态分布的图像如下:
    标准正态分布
图1

可以发现,x落在(-2, 2)之间的概率占95%,若使用sigmoid函数进行激活,sigmoid的函数与梯度函数如下:

sigmoid

图2

在这里插入图片描述

图3

如图二所示,若输入激活函数的值在(-2,2)之间,那么sigmoid为非饱和状态,梯度较大,反向传播不会出现梯度消失的情况。

从上面几个图应该看出来BN在干什么了吧?其实就是把隐层神经元激活输入x=WU+B从变化不拘一格的正态分布通过BN操作拉回到了均值为0,方差为1的正态分布,即原始正态分布中心左移或者右移到以0为均值,拉伸或者缩减形态形成以1为方差的图形。什么意思?就是说经过BN后,目前大部分Activation的值落入非线性函数的线性区内,其对应的导数远离导数饱和区,这样来加速训练收敛过程。

batch norm的推理(验证)阶段理解: 在验证阶段,很显然每次输入的图像为1张图片,那么单张图片无法求解均值与方差,为了解决one-example的推理的bn,bn在验证的过程中单独设计了验证bn操作。

在验证过程中,使用整个训练集的方差以及均值,在训练的过程中,每一层的卷积层分别记录每个batch的均值与方差,在验证的过程中,直接通过n个batch的均值和方差计算其数学期望,即可获得全局的均值与方差,并且隐含层的也有训练好的scale和shift值,通过计算即可获得单个样例的推理效果(深入需要再去看原文链接理解。)


Batch Norm 的优点:关键还是效果好。①不仅仅极大提升了训练速度,收敛过程大大加快;②还能增加分类效果,一种解释是这是类似于Dropout的一种防止过拟合的正则化表达方式,所以不用Dropout也能达到相当的效果;③另外调参过程也简单多了,对于初始化要求没那么高,而且可以使用大的学习率等*


q2: layer nromaliztion简介

layer norm是norm的一种,是为了解决小batch的情况下bn的效果不好的一种方法,同时适用于rnn,在n个神经元输入处求平均。

  1. layer norm出现背景:
    BN虽然带来了很多好处,不过BN的缺点还是有一些的:

    (1) BN特别依赖Batch Size;当Batch size很小的适合,BN的方差和均值不能代表整个数据集的分布。在很多情况下,Batch size大不了,因为你GPU的显存不够。所以,通常会有其他比较麻烦的手段去解决这个问题,比如MegDet的CGBN等。

    (2) BN对处理序列化数据的网络比如RNN是不太适用的,因为rnn 的sequence的长度是不一致的,导致每次输入神经元的深度是不一致的,所以,若出现一个很长的sequence,那么bn的效果会很不好。

    (3) BN只在训练的时候用,验证的时候不会用到,因为验证的输入不是批量输入。这也不一定是BN的缺点,但这是BN的特点。

layer norm的计算公式:
layer norm fx

layer normalization 计算公式

从公式可以看出,H代表隐藏的单元个数,即神经元的个数,使用layer norm后,不同神经元之间享受相同的输入。因此可以得到对比:
  • LN在不同的神经元上有相同的输入,对于不同的feature map,有不同的均值和方差。
  • BN将一个隐含层的一个batch进行了归一化,所以在一个batch层面上数据的输入拥有相同的均值和方差。

q3: Instance nromaliztion简介

Instance norm提出原因: 根据之前的两个介绍,我们知道了常规的bn是为了在mini-batch上模拟allset的均值和方差设计的归一化方法,layer nrom是为了在输入的batch为1-2,或者在深度不一致的rnn中能用上归一化的方法所以提出的两个方法,那么问题来了,instance norm主要是为了风格迁移设计的,那么风格迁移主要有什么特点呢?

风格迁移的每张图的风格比较重要,如果使用bn,那么多张图都会被归一化到同一个数据分布,由此可见,每张图经过bn都会受到其他图片的影响,并且若经过shuffle操作,那么每次经过bn后的单张图片的数据分布都是不一样的,那么问题来了,风格迁移对于图片像素点的稳定性需求很大,如果两次图片的数据分布不同,同一张图片的同一个位置的像素点不同,那么就会生成两张风格不一致的图片,(因为它不是像语义分割一样对像素点分类,是对像素点提取和转换嘛)。所以要在风格迁移上能用上norm,还不能破坏原有的像素规律,那么只能用instance norm了。

instance norm 的公式:
instance norm

图3. instance norm 计算公式

Instance norm 公式中,t代表图片的Index,i代表的是feature map的index。HW代表宽和高度。
q4: Group Normalization简介

看到这里的基本都不太想看了,我们带一张图来研究研究四种norm的异同吧。记住,常规BN设为32

4norm

图4. 4种norm的图结构

众所周知,深度网络中的数据维度一般是[N, C, H, W]或者[N, H, W,C]格式,N是batch size,H/W是feature的高/宽,
C是feature的channel,压缩H/W至一个维度,其三维的表示如上图,假设单个方格的长度是1,那么其表示的是[6, 6,*, * ]

上图形象的表示了四种norm的工作方式:
BN在batch的维度上norm,归一化维度为[N,H,W],对batch中对应的channel归一化;
LN避开了batch维度,归一化的维度为[C,H,W];
IN 归一化的维度为[H,W];
而GN介于LN和IN之间,其首先将channel分为许多组(group),对每一组做归一化,
及先将feature的维度由[N, C, H, W]reshape为[N, G,C//G , H, W],归一化的维度为[C//G , H, W]

个人理解: 如图4, 四种norm的结构,C代表神经元的个数,N代表batch size, HW代表一个小格子。那么就可以看出,batch norm是不考虑神经元,直接对一个batch的数据做平均,数据平均完之后直接喂给神经元。LN,IN,GN都与batch无关,与神经元有关。对layer norm来说,输入的数据在神经元输入前规范化,因此每个神经元吃到的都是高斯分布的数据, instance norm只对同一张图片的feature map像素点做归一化,当group = 1,只有一组,就是layer norm ,当group norm = C,有C组,则I为Instance norm。在小batch的网络运行中,或者到训练后期,batch size缩小,图片放大的情况下,合适的Group norm较为优秀。(有待商榷,不太理解)


其他会被问到的类Normalization操作

在wgan的使用过程中,数据也被归一化到[-1, 1]之间,在big gan的使用过程中,会用到其独有的norm,简单介绍一下吧。

q5: wgan-GP简介

wgan发现以下几个方法可以让训练非常稳定,不需要再看生成器和判别器是否能力相等,是否程序训练稳定。

  • 判别器最后一层去掉sigmoid
  • 生成器和判别器的loss不取log
  • 每次更新判别器的参数之后把它们的绝对值截断到不超过一个固定常数c
  • 不要用基于动量的优化算法(包括momentum和Adam),推荐RMSProp,SGD也行

wgan-GP这篇论文在wgan中发现,如果你将参数w强制截取到指定的范围,那么它训练中w大多数时间只出现在区间边界上, 如图左:

那么就会出现一个问题,w长期在这两个值固定了,那么梯度的反向传播过程会出现梯度消失(w长时间不变,根据链式反向传播规则,每次dw约为0),或者梯度爆炸(初始在(-1, 1)那么强制截断到(-90,90)那么w就会往90方向飞奔,dw >> 1, 通过链式反向传播,梯度就dw的n次方就炸了),所以不仅要限制原始的w的区间,并且要限制dw的区间!!

梯度惩罚就是既然Lipschitz限制是要求判别器的梯度不超过K,那么可以通过建立一个损失函数来满足这个要求,即先求出判别器的梯度d(D(x)),然后建立与K之间的二范数就可以实现一个简单的损失函数设计。但是注意到D的梯度的数值空间是整个样本空间,对于图片(既包含了真实数据集也包含了生成出的图片集)这样的数据集来说,维度及其高,显然是及其不适合的计算的。作者提出没必要对整个数据集(真的和生成的)做采样,只要从每一批次的样本中采样就可以了,比如可以产生一个随机数,在生成数据和真实数据上做一个插值。如图:
公式
但是论文提出,由于是对每个batch中的每一个样本都做了梯度惩罚(随机数的维度是(batchsize,1)),因此判别器中不能使用batch norm,但是可以使用其他的normalization方法,比如Layer Normalization、Weight Normalization和Instance Normalization,论文中使用了Layer Normalization,weight normalization效果也是可以的。


q6: biggan使用的谱归一化(Spectral Normalization), weight norm

明天再写吧。


batch nromalization原文地址
layer nromalization原文地址
Group nromalization原文地址

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Batch normalization是一种常用的神经网络正则化技术,它的主要思想是对每一层的输入进行归一化,使得网络中每一层的输入分布都具有相似的统计特性。Batch normalization可以在训练过程中减少内部协变量偏移(Internal Covariate Shift)现象的发生,有助于加速网络的训练,并提高网络的泛化能力。 内部协变量偏移是指在训练过程中,每一层的输入分布会发生改变,导致网络中每一层的参数都需要重新适应新的输入分布,从而影响了网络的收敛速度和泛化能力。Batch normalization通过对每一层的输入进行归一化,使得每一层的输入分布都具有相似的统计特性,从而减少了内部协变量偏移现象的发生。 具体来说,Batch normalization的计算公式如下: $$ \hat{x}=\frac{x-\mu}{\sqrt{\sigma^2+\epsilon}} \\ y=\gamma\hat{x}+\beta $$ 其中,$x$是输入,$\mu$和$\sigma^2$是在batch内计算得到的均值和方差,$\epsilon$是一个很小的常数,用于避免分母为0的情况,$\hat{x}$是将输入$x$进行归一化后的结果,$\gamma$和$\beta$是可学习的缩放和偏移参数。 Batch normalization的作用是将每一层的输入归一化到均值为0,方差为1的分布上,从而使得每一层的输入分布具有相似的统计特性,加速了网络的训练,并提高了网络的泛化能力。 总之,Batch normalization通过对每一层的输入进行归一化,减少了内部协变量偏移现象的发生,提高了网络的训练速度和泛化能力,是一种非常实用的神经网络正则化技术。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值