BN和LN

139次阅读

共计 1880 个字符,预计需要花费 5 分钟才能阅读完成。

Batch Normalization

  1. BN 的参数计算是以一个 mini batch 为组的,每一层的输出 $Z= R^{batch\_size,hidden\_size}$ 在进激活函数之前,针对每一个神经元,即每一个输出 $Z_i = R^{batch\_size,1}$ 做统计归一。统计指标为每个 batch 的输出的一个维度的均值和方差,对应的会有两个 hidden_size 维的向量:
    $$\mu_{Z_i} = \frac{1}{batch\_size} \sum\limits^{batch\_size}_{j=1} Z_{i,j} $$

    $$\sigma_{Z_i}=\sqrt{\frac{1}{batch\_size}\sum\limits_{j=1}^{batch\_size}(\mu_{Z_i} – Z_i)^2} $$

  2. BN 的更新
    BN 得到两个参数向量后会对该层的输出 $Z$ 做变换,即更新该层的输出到一个合理的分布上。更新分两步,1. 变换到一个均值为 0 方差为 1 的分布上(针对的是每一维度)。2. 再做一次平移和缩放操作,这一步是通过一个线性变换得到的,平移参数可学习。两步更新后再过激活函数。
    $$ Z’_i = \frac {Z_i – \mu_{Z_i}}{\sigma_{Z_i}} $$

    $$ Z”_i = gZ’_i+b $$

  3. BN 特点:

    • 所有的操作都是在一个维度上进行的,参数的计算依赖于 batch_size
    • 倾向于认为同一位置的特征的同一维度的信息应该具有相同的分布,也可以认为同一位置的特征具有相同分布。
    • 因为参数和 batch_size 相关,batch_size 太小会带来分布和整体不一致的问题。故 train 的 batch_size 不适宜太小,且需尽量打散,以保证分布和整体接近。
    • 在 infer 阶段和 train 阶段会有不一样的策略。infer 阶段往往只有一个样本,再去求参数,明显不可行,所以一般会在 train 阶段迭代的更新 $\mu 和 \sigma$ 参数,以估计所有训练样本的参数,且存下来,作为 infer 阶段使用的参数。

Layer Normalization

  1. LN 的计算是在单个样本级别上做的 normlize。对每一层的输出 $Z= R^{batch\_size,hidden\_size}$ 在激活之前,针对每一个样本 $Z_j = R^{1,hidden_size}$ 求参数 $\mu 和 \sigma$,求取方式和 BN 类似,只是方向不同。最终 batch_size 个样本得到 batch_size 组参数。
  2. LN 的更新,依据每个样本的参数逐个更新各个样本的每一维度。然后做同样的缩放和平移。平移参数和缩放参数可学习。
  3. LN 特点:

    1. 所有的操作都是在单个样本上计算的,所以不依赖于 batch_size,所以不用存储 $\mu 和 \sigma$ 参数到 infer 阶段。train 和 infer 一致。
    2. 倾向于认为一个样本内部的所有 feature 是相似的,可以直接在样本内各个维度上 norm。这一假设在 nlp 任务中比较得到明显。一个句子的各个特征就是各个字词处理后得到的,基本是相似的。但假如输入特征是类似年龄,性别,身高这种多个不同特征 concat 起来的,再直接求样本内部的 norm,由于各个 feature 的分布不一样,就会存在很大的问题。

对比

  1. BN 不太适合 NLP 任务中的不定长类任务。

    1. 不定长的样本,在靠后位置的有效样本会变少,相当于变相的 batch_size 在变小。
    2. 在 RNN 类的循环网络中,越往后相当于样本越长,有效样本越少,BN 效果会变差。
    3. 在 infer 阶段如果一个很长的样本在 train 阶段没有见过,则会找不到对应的参数。
  2. LN 比较适合 NLP 任务

    1. 变长样本处理起来无问题。
    2. 一个样本的各个特征一般是比较相似的,如一个句子的特征是各个字,concat 后,各个维度的分布也是一致的。
    3. 在 TF,pytoch 等的实现中,LN 一般是针对最内层的向量内部做 norm 参数。如 [batch_size,seq_len,hidden_size] 这样的一个输出,在 LN 时,是针对最内层的 hidden_size 个神经元求参,更是不会和 padding 的 feature 起冲突。而 BN 相当于在一个 [batch_size*seq_len,hidden_size] 的矩阵上做 BN,这时求均值方差时会把 padding 的样本也算进去。
  3. LN 和 BN 都需要两步变换,第一步变换得到一个 $\mu=0 且 \sigma=1$ 的分布, 这一步目的把神经元的输出变换到一个比较均衡的分布上,达到参数稳定的目的。第二部通过两个可学系参数 (tf 中的 $\gamma 和 \beta $) 做缩放和平移,以期恢复原数据的表达的能力。
正文完
 0