深度学习的归一化操作

本文介绍神经网络中规范化操作,其作用是约束网络层的输出,使得网络更加容易收敛,由此延伸出多种规范化的方法,包括:LN、IN、GN、PN,还要重点把握BN训练时、推理时的操作

BN、LN、IN、GN 的区别?

  • Drawing 2023-05-05 14.32.14.excalidraw
  • BN:在 B, W, H 维度求均值方差进行规范化,当前层一共求 C 个,每个通道使用该值进行规范化
  • LN:对 C, W, H 维度求均值方差进行规范化,当前层一共会求 batchsize 个均值和方差,每个 batchsize 分别规范化
  • IN:对 W, H 维度求均值方差进行规范化,当前层一共求 batchsize*C 个
  • PN:针对每个特征点进行规范化,共有 HxW 个均值方差
  • GN:先对通道进行分组,每个组内的所有 C_i, W, H 维度求均值方差进行规范化
  • BGN:将 HWC 三个通道合并为一维,使用这一维的部分数据进行规范化
  • BN是最传统的,如果 batchsize 允许够大的话,用在 CNN 中的效果依然是最好的;LN 适合 RNN;IN 适合图像风格化任务;GN 更适合小 batchsize 的 CNN 训练

什么是归一化/最大最小值归一化(Min-Max Normalization) ?

  • 按照以下公式进行

    x=xmin(x)max(x)min(x)x^{\prime}=\frac{x-\min (x)}{\max (x)-\min (x)}

什么是局部响应归一化(Local Response Normalization, LRN)?

  • LRN是一个非训练层,思想来源于:对局部神经元的活动进行侧抑制, 使得其中响应比较大的值变得相对更大 , 并抑制 其他反馈较小的神经元 ,让不同卷积核产生feature map之间的相关性更小,以实现不同通道上的feature map专注于不同的特征的作用
  • AlexNet 的LRN指的是通道间进行调整,也可进行通道内进行调整,相当于输入图像时的池化(Pooling)
  • VGGNet 认为LRN没有性能提高,反而导致内存消耗和计算时间的增加,GoogleNetv2使用批规范化(Batch Normalization,BN)替代

局部响应归一化(Local Response Normalization, LRN)的原理?

  • bx,yi=ax,yi/(k+αj=max(0,in/2)min(N1,i+n/2)(ax,yj)2)βb_{x, y}^{i}=a_{x, y}^{i} /\left(k+\alpha \sum_{j=\max (0, i-n / 2)}^{\min (N-1, i+n / 2)}\left(a_{x, y}^{j}\right)^{2}\right)^{\beta}

  • a表示卷积层(包括卷积操作和池化操作)后的输出结果,这个输出结果的结构是一个四维数组

  • ax,yia^i_{x,y} 表示在这个输出结构中的一个位置[i, c, x, y],可以理解成在某一张图中的某一个通道下的某个高度和某个宽度位置的点

  • N是该层中的内核总数

  • n/2,k,α,β都是自定义的,特别注意一下∑叠加的方向是沿着通道方向的,即每个点值的平方和是沿着a中的第3维channel方向的,也就是一个点同方向的前面n/2个通道(最小为第0个通道)和后n/2个通道(最大为第d-1个通道)的点的平方和(共n+1个点)

  • 论文使用k=2、n=5、α=10−4和β=0.75,得到公式

    bx,yi=ax,yi/(2+0.0001j=max(0,i2.5)min(N1,i+2.5)(ax,yj)2)0.75b_{x, y}^{i}=a_{x, y}^{i} /\left(2+0.0001* \sum_{j=\max (0, i-2.5)}^{\min (N-1, i+2.5)}\left(a_{x, y}^{j}\right)^{2}\right)^{0.75}

  • 可以理解为:LRN 时,输入矩阵第0通道使用0、1通道对应位置平方和进行归一化,1通道是[0,3],2通道是[0,4],3通道是[1,5],4通道是[2,6]…

如何理解通道内的LRN(Intra-Channel LRN)?

  • AlexNet 的LRN指的是通道间进行调整,也可进行通道内进行调整,相当于输入图像时的池化(Pooling)

    bx,yk=ax,yk/(k+αi=max(0,xn/2)j=max(0,yn/2)min(W,x+n/2)i,jk)2)βb_{x, y}^{k}=a_{x, y}^{k} /\left(k+\alpha \sum_{i=\max (0, x-n / 2)}{\left.\sum_{j=\max (0, y-n / 2)}^{\min (W, x+n / 2)} \sum_{i, j}^{k}\right)^{2}}\right)^{\beta}

  • 通道间LRN和通道内LRN之间的惟一区别是归一化的邻域。在通道内LRN中,一个二维邻域(相对于通道间的一维邻域)是在考虑的像素周围定义的

什么是局部对比度归一化(Local contrast normalized)?

  • 一种ZFNet模型使用的执行局部减法和除法归一化方法。具体对输入图像的每一个像素,我们计算其邻域(例如3x3窗口)的均值,然后每个像素先减去这个均值,再除以这个邻域窗口(例如3x3窗口)拉成的9维向量的欧几里德范数 (如果这个范数大于1的时候才除:这个约束是为了保证归一化只作用于减少响应(除以大于1的数值变小),而不会加强响应(除以小于1的数值变大))

    13rci=1rj=1ck=13(Xi,j,kX)2 Where X=13rci=1rj=1ck=13Xi,j,k\sqrt{\frac{1}{3 r c} \sum_{i=1}^{r} \sum_{j=1}^{c} \sum_{k=1}^{3}\left(X_{i, j, k}-\overline{\mathbf{X}}\right)^{2}} \quad \text { Where } \quad \overline{\mathbf{X}}=\frac{1}{3 r c} \sum_{i=1}^{r} \sum_{j=1}^{c} \sum_{k=1}^{3} X_{i, j, k}


什么是批规范化(Batch Normalization, BN)?

  • Drawing 2023-05-05 15.47.08.excalidraw

  • 白化操作 (Whitening) 可以让网络收敛速度变快,但是白化操作只针对输入,如果训练时每层使用该操作,不仅耗时,而且不是处处可微

  • GoogleNetv2 对神经网络层的白化进行2个改进:(1)不联合白化 layer inputs和 outputs,而是独立地归一化每个标量形式的特征(scalar feature),使之均值为0,方差为1,如输入是x=(x(1)x(d))\mathrm{x}=\left(x^{(1)} \ldots x^{(d)}\right) 的layer,按照以下公式进行normalize每一个维度,其中E,Var是在训练集上得到的

    x^(k)=x(k)E[x(k)]Var[x(k)]\widehat{x}^{(k)}=\frac{x^{(k)}-\mathrm{E}\left[x^{(k)}\right]}{\sqrt{\operatorname{Var}\left[x^{(k)}\right]}}

  • 每层神经网络接收输入前,先使用批规范化(Batch Normalization,BN) 进行处理,每个BN层引入2个学习参数γ\gammaβ\beta,分别用来scale(缩放)和shift(平移)变换后的激活值,直观上可以理解为:scale和shift把变换后的激活值从标准正态分布左移或者右移一些并变胖或变瘦一点,这样就等价于将原本落在激活函数中间线性区域的激活值往非线性区域调整了一下

批规范化(Batch Normalization, BN)的原理?

  • 训练深度网络时,神经网络隐层参数更新会导致网络输出层输出数据的分布发生变化,而且随着层数的增加,根据链式规则,这种偏移现象会逐渐被放大。这对于网络参数学习来说是个问题:因为神经网络本质学习的就是数据分布,如果数据分布变化了,神经网络又不得不学习新的分布
  • BN本质上是解决反向传播过程中的梯度问题,通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到接近均值为0方差为1的标准正太分布,即严重偏离的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,使得让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度

训练过程中,如何进行批规范化(Batch Normalization, BN)?

  • 对于[B, C, W, H]这样的训练数据而言,BN 是在 B, W, H 维度求均值方差进行规范化,假设输入:上一层输出结果 $ X = {x_1, x_2, …, x_m}$ ,学习参数γ,β\gamma,\beta

  • 计算上一层的均值

    μbatch=1mi=1mxi\mu_{batch} = \frac{1}{m} \sum_{i=1}^mx_i

  • 计算上一层的标准差

    σbatch2=1mi=1m(xiμbatch)2\sigma_{batch}^2 = \frac{1}{m} \sum_{i=1}^m (x_i - \mu_{batch})^2

  • 归一化处理

    x^i=xi+μbatchσbatch2+ϵ\hat x_i = \frac{x_i + \mu_{batch}}{\sqrt{\sigma_{batch} ^2 + \epsilon}}

  • 重构数据

    yi=γx^i+βy_i = \gamma \hat x_i + \beta

  • 实际上,如果设置γ=Var{x(k)},β=E[x(k)]\gamma=\sqrt{Var\{x^{(k)}\}},\beta=E[x^{(k)}] , 那就可以恢复到变换前的激活值,但是使用随机梯度下降(stochastic gradient descent, SGD) 不太实际,因此这两个值的计算针对一个mini batch

  • 例子

    • 假设某一批次的数据为2个2行2列2深度的张量
    • 第一步:计算每一层深度的均值和方差
    • 第二步:对每一层设置2个参数,γ和β。假设第1深度γ=2、β=3;第2深度γ=5、β=8
    • 第三步:重构数据

推理过程中,如何进行批规范化(Batch Normalization, BN)?

  • 推理过程使用批归一化 (Batch Normalization, BN)的步骤和训练过程中,如何进行批规范化 (Batch Normalization, BN)? 过程基本一致,差异在于2各地方:第一,如何确定 BN 层的参数γ,β\gamma,\beta ?训练时本来使用整个训练集进行计算,但是为了兼顾优化函数,使用一个 mini batch 进行计算,那么推理时正好用整个训练集计算这2个参数

  • 但是也没必要每层都重新计算,而是在训练过程中,记住每个mimi batch经过BN时的γ,β\gamma,\beta ,使用整个数据集计算这2个参数等于BN在所有mini batch时两个参数的状态的期望,即

    E[x]EB[μB]Var[x]mm1EB[σB2]\begin{aligned} \mathrm{E}[x] & \leftarrow \mathrm{E}_{\mathcal{B}}\left[\mu_{\mathcal{B}}\right] \\ \operatorname{Var}[x] & \leftarrow \frac{m}{m-1} \mathrm{E}_{\mathcal{B}}\left[\sigma_{\mathcal{B}}^{2}\right] \end{aligned}

  • 另一个差异是,推理时使用新的的归一化公式

    y=γVar[x]+εx+(βγE[x]Var[x]+ε)y=\frac{\gamma}{\sqrt{\operatorname{Var}[x]+\varepsilon}} \cdot x+\left(\beta-\frac{\gamma \cdot E[x]}{\sqrt{\operatorname{Var}[x]+\varepsilon}}\right)

批规范化(Batch Normalization, BN)如何进行反向传播?

  • 前向计算:
  • 反向传播:

批规范化(Batch Normalization,BN)算法的作用?

  • 可以用更大学习率,加速模型收敛
  • 可以不用精心设计权值初始化
  • 可以不用dropout或较小的丢弃正则化(Dropout)
  • 可以不用L2或者较小的权重衰减(weight decay)
  • 可以不用LRN

批规范化(Batch Normalization,BN)在激活函数前还是后?

  • BN一般放在激活层之前,新的研究证明, 先激活再进行BN更好,因为ReLU的非负响应会使权重层以次优的方式更新

批规范化(Batch Normalization,BN)使用注意事项?

  • 在CNN中,BN应作用在非线性映射前。在神经网络训练时遇到收敛速度很慢,或梯度爆炸等无法训练的状况时可以尝试BN来解决。另外,在一般使用情况下也可以加入BN来加快训练速度,提高模型精度
  • 每个mini-batch比较大,数据分布比较接近。在进行训练之前,要做好充分的shuffle,否则效果会差很多。另外,由于BN需要在运行过程中统计每个mini-batch的一阶统计量和二阶统计量,因此不适用于动态的网络结构和RNN网络

批规范化(Batch Normalization, BN)为什么训练的时候不用全量训练数据的均值和方差常量呢?

  • 训练的时候为了模型稳定,需要在当前batch数据中维持隐藏层激活值的稳定,因此不用考虑别的数据,而且不同batch数据间的均值和方差可能差别较大,这个差别实际上能够增加模型鲁棒性,一定程度上减少过拟合,如果在训练的时候就用全量训练数据的均值和方差可能会加剧过拟合

批规范化(Batch Normalization, BN)的缺点?

  • BN操作的效果受batchsize影响很大,如果batchsize较小,每次训练计算的均值方差不具有代表性且不稳定,甚至使模型效果恶化
  • 在RNNs网络中,不同的mini-batch可能具有不同的输入序列长度(深度),计算统计信息比较困难,而且测试序列长度不能大于最大训练序列长度,因此效果不好
  • Barch Normalization也很难应用于在线学习模型,以及小mini-batch的分布式模型

批规范化(Batch Normalization, BN)参数量及计算量(FLOPs)?

  • 参数量:参考训练过程中,如何进行批规范化(Batch Normalization, BN)? 可知,BN层针对每个输入/输出通道(BN层不改变通道数)设置4个参数,即βγμσ2\beta、\gamma、\mu、\sigma^2 ,分别表示层的移动量、缩放量、输入平均值、输入方差$$\operatorname{Param}{b n 2 d}=4 * C{\text {out }}$$
  • 计算量:每个通道需要计算均值(每个元素1次加法),计算方差(每元素1次加法、1次乘法),归一化(每元素1次减法、1次除法),所以是5倍的输入或输出矩阵大小计算量

    FLOPbn2d =5×(Batchsize×H×W)×CF L O P_{\text {bn2d }}=5 \times (Batchsize \times H \times W) \times C


什么是实例规范化(Instance Normalization,IN)?

  • Drawing 2023-10-30-19.17.42.excalidraw
  • BN 注重对 batchsize 数据归一化,但是在图像风格化任务中,生成的风格结果主要依赖于某个图像实例,所以对整个 batchsize 数据进行归一化是不合适的,因而提出了 IN 只对 HW 维度进行归一化

什么是层规范化(Layer Normalization, LN)?

  • Drawing 2023-10-30-19.18.20.excalidraw
  • 对于[B, C, W, H]这样的训练数据而言,批规范化 (Batch Normalization, BN)是在 B, W, H 维度求均值方差进行规范化,而 LN 是对 C, W, H 维度求均值方差进行规范化(当前层一共会求 batchsize 个均值和方差,每个 batchsize 分别规范化),LN 就与 batchsize 无关了,小的 batchsize 也可以进行归一化训练,LN 也可以很轻松地用到 RNN 中
  • 对于RNNs序列x=shape(batch_size, seq_len, hidden_size),

什么是位置归一化 (Positional Normalization, PN) ?

  • Drawing 2023-10-30-19.19.09.excalidraw
  • 直接将两个矩信息 (均值和标准差) 注入到网络的后续层中, 作者称之为矩捷径 (Moment Shortcut, MS) 连接。根据不同的规范化方案, 计算出其对应的 μ 和 σ, 对 X 进行标准化, 然后再应用仿射变换 (其参数为 γ , β ) 得到后规范化 (post-normalized) 特征。仿射变换的目的是保证每一次数据经过标准化后还保留原有学习来的特征, 同时又能完成规范化操作, 加速训练, 并且这两个参数也是需要学习的

什么是组规范化 (Group Normalization, GN)?

  • Drawing 2023-10-30-19.19.42.excalidraw
  • GN 先对通道进行分组,每个组内的所有 C_i, W, H 维度求均值方差进行规范化,也与 batchsize 无关

什么是批量组规范化 (Batch Group Normalization, BGN)?

  • Drawing-2023-10-30-19.20.57.excalidraw
  • 深度学习网络中,BN在大、中批处理中表现良好,对多个视觉任务具有很好的通用性,但在小批量处理中,其性能下降明显。作者通过实验发现超大的Batch下BN会出现饱和状态
  • 作者认为BN的退化/饱和是由于噪声/混淆的统计计算引起的。因此,在不增加新训练参数和引入额外的计算情况下,通过引入通道、高度和宽度维度来补偿,解决了批量标准化(BGN)在小/超大Batch下BN的噪声/混淆统计计算问题
  • BGN 将通道通道、高度和宽度维度重新组合为一个维度,然后于 batch 维度重组特征组,计算各个特征组的均值和方差统计量,利用计算出的特征统计量对各特征组进行归一化,最后对归一化特征图进行重新缩放和位移,保持原来的特征形式

什么是权重规范化(Weight Normalization, WN)?

  • BN LN IN GN 都是对神经元状态(输入数据)的规范化,而 WN 提出对权重进行规范化,其实本质上都是对数据的规范化

什么是Switchable Normalization, SN?

  • 将 BN、LN、IN 结合,赋予权重,让网络自己去学习归一化层应该使用什么方法
  • SN 是一种覆盖特征图张量各个维度来计算统计信息的归一化方法,不依赖 minibatch size 的同时对各个维度统计有很好的鲁棒性。 SN 是一种能够有效适应不同任务地归一化方式。因此它同样适用于图像风格迁移、RNN、对抗生成网路

什么是Filter Response Normalization, FRN?

  • BN层在训练过程中需要在batch上计算中间统计量,这使得BN层严重依赖batch,造成训练和测试的不一致性,当训练batch size较小,往往会恶化性能。GN(Group Normalization)通过将特征在channel维度分组来解决这一问题,GN在batch size不同时性能是一致的,但对于大batch size,GN仍然难以匹敌BN
  • FRN旨在于消除batch_size对于归一化的影响,但是不能牺牲BN在大的batch_size上所获得性能。谷歌的提出的FRN层包括归一化层FRN(Filter Response Normalization)和激活层TLU(Thresholded Linear Unit)。FRN层不仅消除了模型训练过程中对batch的依赖,而且当batch size较大时性能优于BN 深度学习的归一化操作-20230704213036-1
  • 其中FRN的操作是(H, W)维度上的,即对每个样例的每个channel单独进行归一化,这里 x 就是一个N维度(HxW)的向量,所以FRN没有BN层对batch依赖的问题。BN层采用归一化方法是减去均值然后除以标准差,而FRN却不同,这里没有减去均值操作,公式中的 是x 的二次范数的平均值。这种归一化方式类似BN可以用来消除中间操作(卷积和非线性激活)带来的尺度问题,有助于模型训练。 公式里的epsilon是一个很小的正常量,以防止除0
  • 归一化之后同样需要进行缩放和平移变换,这里的 gama 和 beta 也是可学习的参数(参数大小为 C)。FRN 缺少去均值的操作,这可能使得归一化的结果任意地偏移0,如果 FRN 之后是 ReLU 激活层,可能产生很多0值,这对于模型训练和性能是不利的。为了解决这个问题,FRN 之后采用的阈值化的 ReLU,即 TLU

什么是Sandwich Batch Normalization,SaBN?

  • 在 BN 的基础上加入分类的条件信息。对 BN 后的每个特征层通过多层感知机进行放射变换。其变换因子是由输入特征决定的,不同 BN 学习到的

什么是 CBN?

  • 深度学习的归一化操作-20230704213037
  • 为了解决BN在小batchsize时效果不好的问题
  • 将前几次iteration的BN参数保存起来,当前iteration的BN参数由当前batch数据求出的BN参数和保存的前几次的BN参数共同推算得出
  • 训练前期 BN 参数记忆长度短一些,后期训练稳定了可以保存更长时间的 BN 参数来参与推算,效果更好

什么是 CmBN (Cross mini-Batch Normalization)?

  • 深度学习的归一化操作-20230704213038
  • 基于CBN ,YOLOv4 提出CmBN,把大batch内部的4个mini batch当做一个整体,对外隔离。CBN在第t时刻,也会考虑前3个时刻的统计量进行汇合,而CmBN操作不会,不再滑动cross,其仅仅在mini batch内部进行汇合操作,保持BN一个batch更新一次可训练参数

Batch Normalization和Dropout均有正则化,他们有什么区别?

  • 批规范化(Batch Normalization,BN)具有提升模型优化的作用,这点是丢弃正则化(Dropout)不具备的。所以BN更适合用于数据量比较大的场景

Batch Normalization和Group Normalization比较?

  • 批规范化(Batch Normalization,BN):可让各种网络并行训练。但是,批量维度进行归一化会带来一些问题——批量统计估算不准确导致批量变小时,BN 的误差会迅速增加。在训练大型网络和将特征转移到计算机视觉任务中(包括检测、分割和视频),内存消耗限制了只能使用小批量的 BN
  • 组规范化(Group Normalization, GN):GN 将通道分成组,并在每组内计算归一化的均值和方差。GN 的计算与批量大小无关,并且其准确度在各种批量大小下都很稳定
  • 在 ImageNet 上训练的 ResNet-50上,GN 使用批量大小为 2 时的错误率比 BN 的错误率低 10.6% ;当使用典型的批量时,GN 与 BN 相当,并且优于其他标归一化变体。而且,GN 可以自然地从预训练迁移到微调。在进行 COCO 中的目标检测和分割以及 Kinetics 中的视频分类比赛中,GN 可以胜过其竞争对手,表明 GN 可以在各种任务中有效地取代强大的 BN

Batch Normalization和Weight Normalization比较?

  • 权重规范化(Weight Normalization, WN) 是对网络权值W进行 normalization,因此也称为 Weight Normalization
  • 批规范化(Batch Normalization,BN)是对网络某一层输入数据进行 normalization

深度学习中,批规范化BN,标准化Standardization,正则化Regularization的区别?

  • 批规范化(Batch Normalization,BN):在minibatch维度上在每次训练iteration时对隐藏层进行归一化
  • 标准化(Standardization):对输入数据进行归一化处理
  • 正则化(Regularization):通常是指对参数在量级和尺度上做约束,缓和过拟合情况,L1、L2正则化

参考:

  1. 【科普】神经网络中的随机失活方法 - 知乎