模型优化|归一化笔记
归一化技术从神经网络发展到今天,已经诞生了众多种类。批归一化,层归一化,组归一化等。这篇文章总结了系统的归一化技术。
批归一化|Batch Normalization
总所周知,神经网络都是通过梯度下降算法来优化训练,而更流行的一种方式是小批量随机梯度下降,介于one-sample随机梯度下降和full-samples随机梯度下降之间。然而,不合适的学习率和参数初始化有可能导致训练坍塌,BN正是为了缓解这一问题而设计。
在提出BN的论文中,作者认为BN有效减弱了内部协变量偏倚(ICS)问题——as the change in the distribution of network activations due to the change in network parameters during training。
具体来说,BN layer对每个Batch做归一化。假设一个Batch有n个样本,每个样本有d个特征,那么对于第k个特征归一化的结果:
\[ \begin{equation} \hat{x}^{(k)} = \frac{x^{(k)} - E[x^{(k)}]}{\sqrt{\mathrm{Var}[x^{(k)}]}} \end{equation} \]
其中E和Var分别表示在第k个特征上这个批量中所有的样本的均值和方差。
这其中也存在一些问题,比如新的Batch分布可能会破坏前面已经学习到的数据分布。所以BN还添加了两个可以学习的变量\(\beta\)和\(\gamma\):
\[ \begin{equation} y^{(k)} = \gamma^{(k)}\hat{x}^{(k)} + \beta^{(k)} \end{equation} \]
当 \(\gamma^{(k)} = \sqrt{\mathrm{Var}[x^{(k)}]}\) 并且 \(\beta^{(k)} = E[x^{(k)}]\) 时,\(y^{(k)} = x^{(k)}\)。
在训练时,BN layer每次使用的均值和方差是从每个batch上单独计算的,同时,BN layer会维护一个全局均值和方差,在推理时,BN layer使用全局均值与方差对每个样本做归一化。
类比:有一堆书,有 N 本,每本有 C 页,每页有 H 行,每行 W 个字符,而每个字符可以看成具有不同信息量或者复杂度的数值。BN 求均值时,相当于把这些书按页码一一对应地加起来(例如第1本书第36页,第2本书第36页......),再除以每个页码下的字符总数:N×H×W,因此可以把 BN 看成求“所有书对应页的平均字符信息量”的操作,求标准差时也是同理。
层归一化|Layer Normalization
批归一化要求每个Batch中的样本长度必须一致,然而在现实情况下,文本等序列数据并不是等长的1,尽管会在数据预处理时统一大小,但很明显填充位置并不代表真实数据的分布,这样的归一化是没有效果的,甚至损害模型的收敛。BN在面对RNN这种网络时显得束手无策;同时,BN在面对小批次数据时,如资源受限的环境中,性能也会大幅下降。
令人惊喜的是,LN完美的解决了这两个问题;BN对同一特征的同一通道所有批次内样本做归一化,而LN则对同一样本的同一通道的所有特征做归一化。本质上LN避开了在多个样本上进行归一化的操作,只在一个样本的不同通道上对所有特征做归一化。
假设某个样本在经过某一层之后a,特征数(神经元数量)为H,均值与方差:
\[ \begin{equation} \mu = \frac{1}{H} \sum_{i = 1}^{H} a_i \quad \sigma = \sqrt{\frac{1}{H} \sum_{i = 1}^{H} (a_i - \mu)^2} \end{equation} \]
归一化之后\(\hat{a}\):
\[ \hat{\mathbf{a}} \frac{\mathbf{a}-\mu}{\sqrt{\left(\sigma\right)^{2}+\epsilon}} \]
与BN类似,LN也加入了增益(gain)\(g\)和偏置(bias)\(b\),对\(\hat{a}\)进行二次缩放:
\[ \begin{equation} y = f(\mathbf{g} \odot \hat{\mathbf{a}}+\mathbf{b}) \end{equation} \]
类比:有一堆书,有 N 本,每本有 C 页,每页有 H 行,每行 W 个字符,而每个字符可以看成具有不同信息量或者复杂度的数值。LN 求均值时,相当于把每本书所有页的字符数相加(例如第1本书第36页,第2本书第40页......),再除以每本书的字符总数:C×H×W,因此可以把 LN 看成求“每本书的平均字符信息量”的操作,求标准差时也是同理。
实例归一化|Instance Normalization
IN最初用于图像的风格迁移,作者认为不同通道的均值与方差会影响最终生成图像的风格,因此将图像在每个通道上做归一化,并使用参考的风格图像的每个通道上的均值和方差做“去归一化”。
类比:有一堆书,有 N 本,每本有 C 页,每页有 H 行,每行 W 个字符,而每个字符可以看成具有不同信息量或者复杂度的数值。IN 求均值时,相当于把每本书每一页的字符数单独统计(例如第1本书第36页,第2本书第40页......),再除以每页的字符总数:H×W,因此可以把 IN 看成求“每本书每页的平均字符信息量”的操作,求标准差时也是同理。
组归一化|Group Normalization
介于LN和IN之间,将通道数分组,主要目的是为了节约显存。
类比:有一堆书,有 N 本,每本有 C 页,每页有 H 行,每行 W 个字符,而每个字符可以看成具有不同信息量或者复杂度的数值。GN 求均值时,相当于把每本书分成很多小册子,每个小册子有很多页,对每个小册子的字符数求和,再除以每个册子的字符总数:(C/G)×H×W,因此可以把 GN 看成求“每个册子的平均字符信息量”的操作,求标准差时也是同理。
总结与回顾
在众多归一化方法中,只有BN多维护一个全局均值和方差(注意均值与方差的全局统计量是通过指数滑动平均实现的),其他方法只维护可学习参数\(\gamma\) 和 \(\beta\),在训练和推理中计算的统计量均值与方差用完就会丢弃。