文章目录
- 为什么要Normalization
- BatchNorm
- LayerNorm
- torch代码示例
学习神经网络归一化时,文章形形色色,但没找到适合小白通俗易懂且全面的。学习过后,特此记录。
为什么要Normalization
当输入数据量级极大或极小时,为保证输出数据有效,参数必需被训练到一个极小或极大的区间,而这对初始化来说非常困难,且多层网络链式法则求导会导致梯度消失或爆炸的问题。
Reference:神经网络为什么要归一化
归一化的具体计算过程:CSDN博客
BatchNorm
BN适用于大多数Dataframe样式的常规数据。
BN对每个特征进行归一化,如下图,分别计算身高归一化后的数据、体重归一化后的数据、年龄归一化后的数据。好理解。
LayerNorm
对于NLP数据,不适用于BN。
BN的逻辑是每个变量来自于某一特定分布,虽然每次只计算一个batch内的数据,但第一个batch(如前64名同学)的身高和第二个batch(后64名同学)的身高,大概率来自同样的分布。
而对文本数据来说,所有句子的第一个词不一定来自同一分布,第二个词也是。每个句子的长度也不同,对句子末尾几个词作BN就相当于对最长句子的最后一个词和一堆padding值作BN,没有意义。
这里就要用到LN,即对每条样本作归一化,即“横着”归一化。
torch代码示例
BatchNorm: 参考pytorch BatchNorm参数详解,计算过程
# BatchNorm
import torch.nn as nn
Class Net:
def __ init__():
self.bn = nn.BatchNorm1d(20,affine=True)
pass
def forward(x):
# x:(N,L),对L个变量分别进行normalization
out = self.ln(x)
# out: (N,L)
LayerNorm: 参考pytorch 层标准化 LayerNorm 的用法
# LayerNorm
import torch.nn as nn
Class Net:
def __ init__():
self.ln = nn.LayerNorm(W,elementwise_affine=True) # 只对最后一个维度
self.ln = nn.LayerNorm([H,W],elementwise_affine = True) # 对最后两个维度,即均值、方差一起求,拉伸成一个维度
pass
def forward(x):
# x: (N, H ,W),对最后几个维度进行normalization
out = self.ln1(x)
out = self.ln2(x)
# out: (N, seq_len, emb_dim),归一化不改变向量维度