BN 和 LN

归一化目的是将具有 相同性质的数据 转化成 标准正态分布 ,其结果不会破坏 数据之间的可比较性
LN 的操作可以类比于从一个句子中找到一个中心词,计算所以词和中心词的关系。

为什么处理不定长序列场景需要 LN ? #card

  • 使用 BN padding 部分特征 pooling, 会扰乱正常非 padding 部分特征

BN 和 LN 有哪些区别? #card

  • 做 norm 的维度不同

    • 在哪个维度做 norm,就在其他维度不动的情况下,基于该维度下的所有元素计算均值和方差,然后再做 norm

    • BN 在 batch 维度,LN 一般在最后一维

  • BN 计算代码 :-> for i in range(seq_len): for j in range(hidden_size): Norm([bert_tensor[k][i][j] for k in range(batch_size)])

  • LN 计算代码 :-> for i in range(batch_size): for j in range(seq_len): Norm([bert_tensor[i][j][k] for k in range(hidden_size)])
    [[Ref]]

  • RNN为什么不适合做BN? - 知乎

    • BN 需要记录均值和方差

Post Norm 和 Pre Norm 区别

image.png

  • [[Pre Norm]] :<-> xn+1=xn+f(norm(xn))x_{n+1}=x_{n}+f\left(\operatorname{norm}\left(x_{n}\right)\right)

    • 第二项的方差由于有 norm 不会随层数变化,x 的方差在主干上随层数累积。到达深层后,单层对主干的影响很小,不同层在统计上类似。

    • xn+2=xn+1+f(norm(xn+1))=xn+f(norm(xn))+f(norm(xn+1))xn+2f(norm(xn))x_{n+2}=x_{n+1}+f\left(\operatorname{norm}\left(x_{n+1}\right)\right)=x_{n}+f\left(\operatorname{norm}\left(x_{n}\right)\right)+f\left(\operatorname{norm}\left(x_{n+1}\right)\right) \approx x_{n}+2 f\left(\operatorname{norm}\left(x_{n}\right)\right)

    • 这样训练的深层模型更像是扩展模型宽度,相对好训练。

  • [[Post Norm]] :<-> xn+1=norm(xn+f(xn))x_{n+1}=\operatorname{norm}\left(x_{n}+f\left(x_{n}\right)\right)

    • 主干方差恒定,每层对 x 都有较大影响,没有从头到尾的恒等路径,梯度难以控制,更难收敛,训练出来效果好。

    • 突出残差分支

    • [[BERT]]训练时,需要 warmup

      • 输出层的期望梯度非常大,不稳定
      • [[Adam]] 和 [[SGD]] 都需要

pre 和 post 具体含义 #card

  • 先 norm 再残差 [[Pre Norm]] :<-> xn+1=xn+f(norm(xn))x_{n+1}=x_{n}+f\left(\operatorname{norm}\left(x_{n}\right)\right)

  • 先残差再 norm [[Post Norm]] :<-> xn+1=norm(xn+f(xn))x_{n+1}=\operatorname{norm}\left(x_{n}+f\left(x_{n}\right)\right)

[[DeepNet]]

Ref