人工智能/机器学习基础知识——Layer-wise Normalization

Layer-wise Normalization

逐层归一化

  • 尺度不变性

  • 平滑优化地形

BatchNorm(Batch Normalization)

Paper : Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

CSDN

批标准化,相当于一种正则化手段

在这里插入图片描述

随着深度神经网络的训练,输入值的分布会随着前向传播过程而慢慢改变,即“Internal Covariate Shift”问题。例如,我们对输入值做了标准化后,其分布符合标准正态分布,均值为0,方差为1。随着前向传播不断进行,其分布会慢慢发生偏移,而且一般是往无穷大与无穷小的方向偏移。这就造成了在经过激活函数时的数据分布在中心两端较远处,此处梯度很小,在反向传播的过程中会造成底层参数出现梯度消失或训练十分缓慢的现象。

  • 考虑一个深度神经网络,令第 l l l层的净输入为 z ( l ) z^{(l)} z(l),神经元的输出为 a ( l ) a^{(l)} a(l),即

    a ( l ) = f ( z ( l ) ) = f ( W a ( l − 1 ) + b ) \boldsymbol{a}^{(l)}=f\left(\boldsymbol{z}^{(l)}\right)=f\left(\boldsymbol{W} \boldsymbol{a}^{(l-1)}+\boldsymbol{b}\right) a(l)=f(z(l))=f(Wa(l1)+b)
    其中, f ( ⋅ ) f(·) f()为激活函数, W W W b b b为可学习参数

    • 利用标准化将输入(即经过仿射变化的输入,如经过CNN之后的数据)拉回正态分布

    z ^ ( l ) = z ( l ) − E [ z ( l ) ] var ⁡ ( z ( l ) ) + ϵ \hat{z}^{(l)}=\frac{z^{(l)}-\mathbb{E}\left[z^{(l)}\right]}{\sqrt{\operatorname{var}\left(z^{(l)}\right)+\epsilon}} z^(l)=var(z(l))+ϵ z(l)E[z(l)]
    E [ z ( l ) ] \mathbb{E}\left[\boldsymbol{z}^{(l)}\right] E[z(l)] var ⁡ ( z ( l ) ) \operatorname{var}\left(\boldsymbol{z}^{(l)}\right) var(z(l))是指在当前参属下, z ( l ) z^{(l)} z(l)的每一维在整个训练集上的期望和方差。但在梯度下降优化算法下,只能利用小批量样本的期望和方差来代替
    μ B = 1 K ∑ k = 1 K z ( k , l ) \mu_{\mathcal{B}}=\frac{1}{K} \sum_{k=1}^{K} z^{(k, l)} μB=K1k=1Kz(k,l)
    σ R  2 = 1 K ∑ k = 1 K ( z ( k , l ) − μ B ) ⊙ ( z ( k , l ) − μ B ) \sigma_{\text {R }}^{2}=\frac{1}{K} \sum_{k=1}^{K}\left(z^{(k, l)}-\mu_{B}\right) \odot\left(z^{(k, l)}-\mu_{B}\right) σ2=K1k=1K(z(k,l)μB)(z(k,l)μB)

    • 考虑一种使用Sigmoid激活函数的情况,标准化之后的数据取值都分布在0附近,这个取值区间在Sigmoid上接近线性,减弱了非线性的作用。因此,为了使BN不对网络的表示能力造成负面影响,可以引入两个可学习参数,通过一个附加的缩放和平移变换改变取值区间

    z ^ ( l ) = z ( l ) − μ B σ D 2 + ϵ ⊙ γ + β ≜ B N γ , β ( z ( l ) ) , \begin{aligned} \hat{z}^{(l)} &=\frac{z^{(l)}-\mu_{\mathcal{B}}}{\sqrt{\sigma_{\mathcal{D}}^{2}+\epsilon}} \odot \gamma+\beta \\ & \triangleq \mathrm{BN}_{\gamma, \beta}\left(z^{(l)}\right), \end{aligned} z^(l)=σD2+ϵ z(l)μBγ+βBNγ,β(z(l)),
    其中 γ \gamma γ β \beta β分别代表缩放和平移的可学习参数。上式其实可以看做是标准化的逆变换。

    • BN作为一个网络层,加在激活函数之前,仿射变换之后

    a ( l ) = f ( B N γ , β ( z ( l ) ) ) = f ( B N γ , β ( W a ( l − 1 ) ) ) \boldsymbol{a}^{(l)}=f\left(\mathrm{BN}_{\gamma, \beta}\left(\boldsymbol{z}^{(l)}\right)\right)=f\left(\mathrm{BN}_{\gamma, \beta}\left(\boldsymbol{W} \boldsymbol{a}^{(l-1)}\right)\right) a(l)=f(BNγ,β(z(l)))=f(BNγ,β(Wa(l1)))
    由于在BN中本身就加入了平移变换的可学习参数,所以在仿射变换(如CNN)中就无需偏置参数了,这也就是为什么在ResNet的官方实现中不设置CNN的bias的原因

    • 在训练时使用的每个批样本的均值与方差会被保存下来,根据滑动平均或其他算法对这些均值与方差进行计算,最终得到的均值与方差作为训练阶段最终的值被保存下来,作为全局均值与方差用于测试阶段的BN计算。
  • BatchNorm的本质思想就是将数据分布重新标准化为均值为0,标准差为1的标准正态分布,然后再将数据送入激活函数,这样输入值就会落在比较靠近中心的部分,梯度较大,避免梯度消失的同时加快训练收敛速度

  • BatchNorm其实还是一种类似于Dropout的正则化方法,能一定程度上防止过拟合

  • BatchNorm与ReLU的顺序应该为先BatchNorm后ReLU。因为如果先ReLU的话,输入值还未经过标准化,分布相对正态分布偏移较大,直接输入激活函数的话容易造成训练缓慢甚至梯度消失。所以这里需要先对输入值进行BatchNorm,将输入值标准化到靠中心的区间后,再输入激活函数

  • BatchNorm是有可学习权重的,详见Paper

LayerNorm(Layer Normalization)

层归一化

  • BN对某中间层的单个神经元进行归一化操作,LN对某中间层所有神经元进行归一化

  • 由于RNN的神经元净输入分布动态变化,BN无法用于RNN,但LN可以

GroupNorm(Group Normalization)

Paper : Group Normalization

组标准化

在这里插入图片描述

BatchNorm受batch_size影响,在batch_size较小时,计算出的均值与方差不能够代表整体数据的均值与方差,错误率较高。

  • GroupNorm不依赖于batch_size,它将channels划分为几个Group,计算每个Group上的均值与方差,不受batch_size大小的影响

  • BatchNorm:batch方向做标准化,计算N * H * W的均值方差

  • LayerNorm:channel方向做标准化,计算C * H * W的均值方差

  • InstanceNorm:一个channel内做标准化,计算H * W的均值方差

  • GroupNorm:将channel划分为几个group,在group内做标准化,计算(C // G) * H * W的均值方差

WeightNorm(Weight Normalization)

权重归一化

  • 之前的方式都是对输入数据进行归一化,而WN对神经网络的连接权重进行归一化:通过再参数化(Reparameterization)将连接权重分解为长度和方向两种参数

    • 例如 a ( l ) = f ( W a ( l − 1 ) + b ) \boldsymbol{a}^{(l)}=f\left(\boldsymbol{W} \boldsymbol{a}^{(l-1)}+\boldsymbol{b}\right) a(l)=f(Wa(l1)+b),可将参数 W W W再参数化为

      W i , : = g i ∥ v i ∥ v i , 1 ≤ i ≤ M l \boldsymbol{W}_{i,:}=\frac{g_{i}}{\left\|\boldsymbol{v}_{i}\right\|} \boldsymbol{v}_{i}, \quad 1 \leq i \leq M_{l} Wi,:=vigivi,1iMl
      g i g_i gi v i v_i vi为新引入的参数

  • 由于神经网络权重经常共享,权重往往比神经元数量要少,因此权重归一化的开销比较小

Local Response Normalization(LRN)

局部响应归一化,通常运用在基于卷积的图像处理上

  • 假设一个卷积层的输出特征图为 Y ∈ R M ′ × N ′ × P \boldsymbol{Y} \in \mathbb{R}^{M^{\prime} \times N^{\prime} \times P} YRM×N×P,即长×宽×通道数,令 Y p ∈ R M ′ × N ′ \boldsymbol{Y}^{p} \in \mathbb{R}^{M^{\prime} \times N^{\prime}} YpRM×N 1 ≤ p ≤ P 1 \leq p \leq P 1pP。局部响应归一化是对邻近的特征映射进行局部归一化

    Y ^ p = Y p / ( k + α ∑ j = max ⁡ ( 1 , p − n 2 ) min ⁡ ( P , p + n 2 ) ( Y j ) 2 ) β ≜ LRN ⁡ n , k , α , β ( Y p ) , \begin{aligned} \hat{\boldsymbol{Y}}^{p} &=\boldsymbol{Y}^{p} /\left(k+\alpha \sum_{j=\max \left(1, p-\frac{n}{2}\right)}^{\min \left(P, p+\frac{n}{2}\right)}\left(\boldsymbol{Y}^{j}\right)^{2}\right)^{\beta} \\ & \triangleq \operatorname{LRN}_{n, k, \alpha, \beta}\left(\boldsymbol{Y}^{p}\right), \end{aligned} Y^p=Yp/ k+αj=max(1,p2n)min(P,p+2n)(Yj)2 βLRNn,k,α,β(Yp),
    上述运算按逐元素计算, n , k , α , β n, k, \alpha, \beta n,k,α,β为超参数, n n n为局部归一化的特征窗口大小。在AlexNet中,这些超参的取值为 n = 5 , k = 2 , α = 10 e − 4 , β = 0.75 n=5, k=2, \alpha=10 \mathrm{e}^{-4}, \beta=0.75 n=5,k=2,α=10e4,β=0.75

  • LRN应用在激活函数之后,只对邻近的神经元进行局部归一化

  • LRN可以用侧抑制(lateral inhibition)来理解,即活跃神经元对相邻神经元具有抑制作用

  • 与Pooling相比,LRN作用于Tensor中同一位置的邻近特征通道神经元,而Pooling作用于Tensor某一个特征通道内部邻近位置的神经元

以张量坐标角度理解Normalization

Understanding Normalization from the Perspective of the Coordinates of Tensor

  • 以二维张量下的Batch Normalization为例

    X ∈ R N × D \mathbf{X} \in \mathbb{R}^{N \times D} XRN×D

    γ , β ∈ R D \boldsymbol{\gamma}, \boldsymbol{\beta} \in \mathbb{R}^{D} γ,βRD

    μ j = 1 N ∑ i = 1 N X i , j σ j 2 = 1 N ∑ i = 1 N ( X i , j − μ j ) 2 \begin{aligned} &\boldsymbol{\mu}_{j}=\frac{1}{N} \sum_{i=1}^{N} \mathbf{X}_{i, j} \\ &\boldsymbol{\sigma}_{j}^{2}=\frac{1}{N} \sum_{i=1}^{N}\left(\mathbf{X}_{i, j}-\boldsymbol{\mu}_{j}\right)^{2} \end{aligned} μj=N1i=1NXi,jσj2=N1i=1N(Xi,jμj)2

    X ^ i , j = X i , j − μ j σ j 2 + ϵ Y i , j = γ j X ^ i , j + β j \begin{aligned} \widehat{\mathbf{X}}_{i, j} &=\frac{\mathbf{X}_{i, j}-\boldsymbol{\mu}_{j}}{\sqrt{\boldsymbol{\sigma}_{j}^{2}+\epsilon}} \\ \mathbf{Y}_{i, j} &=\boldsymbol{\gamma}_{j} \widehat{\mathbf{X}}_{i, j}+\boldsymbol{\beta}_{j} \end{aligned} X i,jYi,j=σj2+ϵ Xi,jμj=γjX i,j+βj

    • 二维输入张量 X X X具有两个坐标 i , j i, j i,j,对每个 j j j都在 i i i(即batch维度)上进行Normalization

    • 对于一个方阵,分别对每一列的数据计算均值与方差并分别对每一列进行Normalization

    • 可学习参数 γ , β \gamma, \beta γ,β是每一个坐标 j j j独有的(毕竟拉回正态分布用的都是各自的均值方差,所以这里也是有各自每一列独享的权重)

  • 多维张量的情况也类似,例如三维张量有三个坐标 i , j , k i, j, k i,j,k,对每个 j j j k k k的组合都在 i i i上进行Normalization。甚至可以直接把多维张量当成二维张量来处理,把 j , k j, k j,k维度展平成一个维度,变成二维计算,本质上是一样的

  • 由于BN的参数是对每一列向量独有的,所以RNN这种序列模型就没法用BN,至少从参数角度来考虑, [ 16 , 100 , 32 ] [16, 100, 32] [16,100,32] [ 16 , 200 , 32 ] [16, 200, 32] [16,200,32],Sequence Length不一样,参数shape都没法统一(展成二维张量,第二个维度的shape由于Sequence Length不固定所以也不固定,又因为可学习参数是对每一列独享的,所以参数shape也没法固定)。假设训练最多只有500 Sequence Length,测试出了个600的,那就没参数给他做变换了(虽然可以拉回正态分布,但后续的操作没法完成了)

  • 对于其他的Normalization,如Layer Normalization等,本质上和Batch Normalization一样,只不过从坐标角度理解就是针对不同的坐标进行Normalization

    以输入张量 [ B , C , H , W ] [B, C, H, W] [B,C,H,W]为例

    • Batch Normalization就是对B这个维度下的坐标进行Normalization

    • Layer Normalization对C这个维度下的坐标进行Normalization。与BN一样,可以将其余三个维度BHW展平处理

      • 其实本质上就是Normalization是针对shape不固定的维度进行的(其余维度需固定),例如LSTM的输入第二维不固定,所以不能用BN,但能用LN去Nomalization第二维,因为其他两维都是固定的
  • 17
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值