文章目录
- 1. BatchNorm批量归一化
- 2. LayerNorm层归一化
- 3. BatchNorm 和 LayerNorm 对比
- 4. BatchNorm 和 LayerNorm 怎么选择
- References
今天重看Transformer,发现里面提到了BatchNorm和LayerNorm两种归一化方法,在这儿做一下总结和整理。
1. BatchNorm批量归一化
BatchNorm把 同一个batch中,通一通道的所有特征(红色区域) 视为一个分布(有多少个通道就有多少个分布),并将其标准化。
- 不同图片的同一通道的相对关系是保留的,特征是可以比较的
- 同一图片的不同通道的特征失去了可比性
【用于CV的通俗理解】
有一些可解释性方面的观点认为,feature的每个通道都对应一种特征(如低维特征的颜色,纹理,亮度等,高维特征的人眼,鸟嘴特征等)。
BatchNorm后不同图片的同一通道的特征是可比较的,或者说A图片的纹理特征和B图片的纹理特征是可比较的;而同一图片的不同特征则是失去了可比性,或者说A图片的纹理特征和亮度特征不可比较。
2. LayerNorm层归一化
LayerNorm把 一个样本的所有词向量(如上图红色部分) 视为一个分布(有几个句子就有几个分布),并将其标准化。
- 同一个句子中的词向量(图中的 v 1 v_1 v1, v 2 v_2 v2,…, v L v_L vL)的相对大小是保留的,或者说LayerNorm 不改变词向量的方向,只改变它的模。
- 不同句子的词向量则失去了对比性。
【用于NLP的通俗理解】
考虑两个句子:
- 教练,我想打篮球!
- 老板,我要一打啤酒。
通过比较两个句子中 “打” 的词义我们可以发现,词义并非客观存在的,而是由上下文的语义决定的。
因此进行标准化时不应该破坏同一句子中不同词义向量的可比性,而BatchNorm则是不满足这一点的。且不同句子的词义特征也不应具有可比性,LayerNorm也是能够把不同句子间的可比性消除。
3. BatchNorm 和 LayerNorm 对比
1d Norm:
2d Norm:
Batch Normalization是针对特征feature的某一个具体维度,计算它在seq的所有维度(即全部token)和batch的所有维度(即全部样本)上的均值和方差,即将这个二维平面内的所有元素展平然后计算均值和方差,最后得到的是长度为feature_len的一个一维tensor,一般会进行扩维变成(1,1,feature_len),这样就可以通过广播机制自我复制来对输入x进行归一化处理了。
Layer Normalization是针对batch中的单一样本(即一个句子)中的单一token(t_i),计算它在feature的所有维度(即全部d)上的均值和方差,最后得到的是形为(batch_size, seq_len)的一个二维张量同样会扩维变成(batch_size, seq_len, 1),使得可以通过广播机制自我复制来对输入x进行归一化处理。
【关于LayerNorm:上图基本是基于李沐的讲解,沐神讲的是两种norm都对应一个切面,BatchNorm是纵切面,LayerNorm是横切面,但是LayerNorm的代码实现基本都是dim=-1,这样就不再是一个切面而是一条直线。】
1. 作用方式不同
BatchNorm:对 每个特征 在 mini-batch 数据上进行归一化。
LayerNorm:对 每个样本 的 所有特征 进行归一化。
2. 计算方式不同
BatchNorm:均值和方差是在每个批次上计算的,依赖于批次中的所有样本。BatchNorm会维护每个特征通道的均值和方差,用来归一化每个样本中的每个特征。
LayerNorm:均值和方差是在每个样本上计算的,独立于批次。LayerNorm计算每个样本的每个特征通道的均值和方差,并用来归一化该样本在每一层上的所有特征。
3. 应用场景不同
BatchNorm:更适用于CV领域。比如3维特征的图像在做BN时,相当于对不同样本的同一通道内的特征做标准化。
LayerNorm:更适用于NLP领域。因为NLP或者序列任务来说,一条样本的不同特征,其实就是时序上字符取值的变化,样本内的特征关系是非常紧密的。
4. BatchNorm 和 LayerNorm 怎么选择
1)对于BatchNorm,我们所需要计算均值和方差的是一个[batch_size × seq_len]的平面,在这个平面中,对于batch中的每一个样本,他们的seq_len都是不同的,有的长有的短,只不过最后都用0来补齐了。
这样当我们计算均值和标准差时,就会因为这些存在的许多的0使得均值和标准差不能很好地反映有效数据的真实分布,造成偏差。
2)采用LayerNorm的方式,每个样本单独考虑自己内部的分布,自己样本的seq_len是多少就计算多少个token,padding填充的不需要再考虑,因此更能反映数据的真实分布特性。
比如说对于第一个样本sample 1,他有3个有效token,分别是token 1-3,这三个token每个在底层都由一个长为feature_len的向量表示,LayerNorm就是这3个token每一个token在自己的feature_len上面(类比一下Transformer中一个token用d_model=512维度的向量表示)计算均值和方差,然后做更新。
这样做的本质意义在于,把有效元素的规范化过程限制在有效元素内部,规避掉无效元素的干扰
References
- Batch Norm 与 Layer Norm 比较
- layerNorm和batchNorm
- 关于BatchNorm和LayerNorm的实现细节讨论