Normalization
之前有大概看过Normalization,了解了LN和BN的区别,恰好前段时间在面试中被问到,发现之前了解的还是太模糊了,所以又深入学习了一些,顺便写了个笔记。
什么是Normalization
一种使神经网络特征保持固定分布的运算
Normalization是如何计算的
$$
y = \frac{x - \mathrm{E}[x]}{ \sqrt{\mathrm{Var}[x] + \epsilon}} * \gamma + \beta
$$
以下是自己通过均值和方差做的对比实验,可以看到结果是一样的。但实际上LN在使用时大部分参数会采用默认值,即elementwise_affine=True
以及eps=1e-5
,只是那样我们去对比就过于麻烦,理解就好
1 | import torch |
一些问题
BERT中LN的normalization的是哪一个维度
以下是HF的源码,其中config.hidden_size
在bert-base
中为768
If a single integer is used, it is treated as a singleton list, and this module will normalize over the last dimension which is expected to be of that specific size.
是LN官方的注释,说的是如果传递一个整数,则对最后一个维度进行归一化
可以说,在NLP中,LN将每个token视作一个特征,使得每个特征保持一个固定的均值和方差
1 | # transformers.models.bert.modeling_bert.BertSelfOutput |
引申一个额外的说法,归一化顾名思义有着多变一的意思。但是torch注释中有写到
1 | Shape: |
即保持着输入相同的shape,归一事实上体现在std和mean上,我们展开开头的均值和方差的计算,可以看到在LN normalization的维度,其值是一个标量。
因为面试中面试官在我想不起LN的维度时,有提示我归一化后的结果,但是我记得normalization是不改变输入的shape的,所以对此也多了疑惑,借此学习并记录清楚。
Normalization 需要额外的存储空间吗,是可学习的吗
同样是在面试中被问到的一个问题
LN有参数elementwise_affine
缺省为True
,此时是可学习的
BN有参数affine
缺省为True
,此时是可学习的,并且要保证batch间的mean和std,需要额外存储空间(待验证)
所以Normalization通常用法来说是可学习的,但是可以设置成不可学习的,BN需要额外的存储空间