简介
Layer Normalization 是一种用于归一化神经网络内部激活的技术,旨在提高训练稳定性和速度。与 Batch Normalization 不同,Layer Normalization 对每个样本的特征维度进行归一化,而不是对整个 mini-batch 进行归一化。它特别适用于处理序列数据,如自然语言处理中的模型。
原理
Layer Normalization 的目标是对每个样本的特征维度进行归一化,确保每个特征的均值为零,方差为一。这是通过以下步骤实现的:
-
计算均值和方差:
对每个样本在特征维度上计算均值和方差。mean i , s = 1 L ∑ l = 1 L x i , s , l \text{mean}_{i, s} = \frac{1}{L} \sum_{l=1}^{L} x_{i, s, l} meani,s=L1l=1∑Lxi,s,l
variance i , s = 1 L ∑ l = 1 L ( x i , s , l − mean i , s ) 2 \text{variance}_{i, s} = \frac{1}{L} \sum_{l=1}^{L} (x_{i, s, l} - \text{mean}_{i, s})^2 variancei,s=L1l=1∑L(xi,s,l−meani,s)2
-
归一化:
使用计算出的均值和方差对每个特征进行归一化。x ^ i , s , l = x i , s , l − mean i , s variance i , s + ϵ \hat{x}_{i, s, l} = \frac{x_{i, s, l} - \text{mean}_{i, s}}{\sqrt{\text{variance}_{i, s} + \epsilon}} x^i,s,l=variancei,s+ϵxi,s,l−meani,s
-
缩放和平移:
使用可学习的参数 γ \gamma γ 和 β \beta β 对归一化后的数据进行缩放和平移。y i , s , l = γ s ⋅ x ^ i , s , l + β s y_{i, s, l} = \gamma_s \cdot \hat{x}_{i, s, l} + \beta_s yi,s,l=γs⋅x^i,s,l+βs
公式
Layer Normalization 的公式如下:
x ^ i , s , l = x i , s , l − mean i , s variance i , s + ϵ \hat{x}_{i, s, l} = \frac{x_{i, s, l} - \text{mean}_{i, s}}{\sqrt{\text{variance}_{i, s} + \epsilon}} x^i,s,l=variancei,s+ϵxi,s,l−meani,s
y i , s , l = γ s ⋅ x ^ i , s , l + β s y_{i, s, l} = \gamma_s \cdot \hat{x}_{i, s, l} + \beta_s yi,s,l=γs⋅x^i,s,l+βs
其中:
- mean i , s \text{mean}_{i, s} meani,s 是每个样本在序列维度上计算的均值。
- variance i , s \text{variance}_{i, s} variancei,s 是每个样本在序列维度上计算的方差。
- ϵ \epsilon ϵ 是一个小常数,用于避免除零错误。
- γ s \gamma_s γs 和 β s \beta_s βs 是可学习的参数,用于缩放和平移归一化后的值。
实现
Layer Normalization 类实现:
import numpy as np
class LayerNorm3D:
def __init__(self, num_features, epsilon=1e-5):
self.num_features = num_features
self.epsilon = epsilon
self.gamma = np.ones((1, num_features))
self.beta = np.zeros((1, num_features))
def forward(self, x):
# 计算每个样本每个序列的均值和方差
mean = np.mean(x, axis=2, keepdims=True)
variance = np.var(x, axis=2, keepdims=True)
# 归一化输入
x_normalized = (x - mean) / np.sqrt(variance + self.epsilon)
# 应用 gamma 和 beta
out = self.gamma * x_normalized + self.beta
return out
参数量
对于输入张量形状为 ([N, S, L]) 的 3D 张量:
- 缩放参数 γ \gamma γ 和 偏移参数 β \beta β 的数量都是 2 × L 2 \times L 2×L,其中 L L L 是特征维度长度。
例如,对于特征维度 L = 6 L = 6 L=6,参数量是:
参数量 = 2 × 6 = 12 \text{参数量} = 2 \times 6 = 12 参数量=2×6=12
应用
Layer Normalization 被广泛应用于各种深度学习任务,尤其是在处理序列数据和生成任务中,如 Transformer 和 RNN 等模型中。它有助于提高训练稳定性,并加速收敛。
Code
代码已上传至:AI_With_NumPy
此项目汇集了更多AI相关的算法实现,供大家学习参考使用,欢迎点赞收藏👏🏻
备注
个人水平有限,有问题随时交流~