
【深度学习】批归一化(BatchNorm)与层归一化(LayerNorm):技术背景、原理及基于Pytorch的代码详解
批归一化(Batch Normalization)和层归一化(Layer Normalization)是深度学习中广泛应用的两种数据归一化方法,用于改善神经网络的训练性能。本文将从提出这两种技术的原论文出发,详细阐述技术背景、原理及基于Pytorch的实现方式。
1.批归一化(Batch Normalization)
批归一化由谷歌的Sergey Ioffe和Christian Szegedy于2015年在论文“Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift”中提出。
(1)技术背景:深度神经网络的训练十分复杂,因为在训练过程中随着前一层网络参数的变化,下一层网络的输入分布也会发生变化。而更低的学习率和更精细的参数初始化又会减慢模型训练速度,特别是会让具有饱和非线性的模型收敛变得十分困难,如使用Sigmoid激活函数时,容易陷入梯度消失之中。
Ps:饱和非线性是指激活函数在输入值较大或较小时,其输出趋于恒定,导数接近于零的现象,如Sigmoid和Tanh激活函数。
(2)技术原理:批归一化则是通过标准化输入来解决上述问题,将归一化作为模型架构的一部分,对每次训练中的小批量样本执行归一化,使得我们可以使用更高的学习率且能降低对参数初始化的要求。同时,在某些情况下还能充当正则化使用,可以替代Dropout技术。
(3)批归一化详细计算步骤:
需要特别注意的是,批归一化中模型在测试时使用的是训练中累积的全局均值和方差替代小批量样本的统计值,有关全局均值和方差的计算可见下述详细代码的实现,更加清晰明了。
(4)基于Pytorch的实现
Pytorch中提供了nn.BatchNorm1d、nn.BatchNorm2d 和 nn.BatchNorm3d,对应不同输入维度的批归一化层,如下所示:
【参数详解】
(5) 使用Python手动实现批归一化
2.层归一化(Layer Normalization)
层归一化由多伦多大学的Jimmy Lei Ba等人于2016年于论文“Layer Normalization”中提出。
(1)技术背景:批归一化的效果取决于小批量的大小,且在循环神经网络中的应用受到明显的限制。同时,批归一化也不能应用于在线学习任务或小批量必须很小的极大分布式模型。
Ps:循环神经网络中循环神经元的输入总和通常随序列长度的变化而变化,因此对其应该针对不同时间步长进行不同的统计。
(2)技术原理:层归一化则是通过计算单个样本中所有特征值的均值和方差来实现输入数据的归一化,可以直接应用于循环神经网络。与批归一化一样的是在归一化之后也提供了自适应偏差和增益两个可学习参数来增强模型的表达能力。与批归一化不同的是,层归一化在训练和测试的时候执行完全相同的计算。
(3)层归一化详细计算步骤:
(4)基于Pytorch的实现
Pytorch中提供了nn.LayerNorm实现层归一化层,适合处理任何维度的输入,如下所示:
【参数详解】
(5)使用Python手动实现层归一化
本文转载自南夏的算法驿站,作者:赵南夏
