文章目录
- 一、Batch normalization 理论与应用
- 1. 理论解释
- 2. 数值例子
- 二、Layer normalization 理论与应用
- 1. 理论解释
- 2. 数值例子
- 三、Layer Normalization 和 Batch Normalization 的区别
- 四、《Transformers without Normalization》笔记
一、Batch normalization 理论与应用
1. 理论解释
Batch Normalization(批归一化)是一种用于深度学习的优化技术,由Sergey Ioffe和Christian Szegedy在2015年提出。它通过对每一层的输入进行归一化处理,加速训练并提升模型性能。
原理
- 归一化:
- 对每个小批量数据(mini-batch)的每个特征维度进行归一化,使其均值为0,方差为1。
- 公式为:
x ^ i = x i − μ B σ B 2 + ϵ \hat{x}_i = \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}} x^i=σB2+ϵxi−μB
其中, x i x_i xi是输入, μ B \mu_B μB是均值, σ B 2 \sigma_B^2 σB2是方差, ϵ \epsilon ϵ是防止除零的小常数。
- 缩放和平移:
- 归一化后,通过可学习的参数 γ \gamma γ和 β \beta β进行缩放和平移,恢复数据的表达能力。
- 公式为:
y i = γ x ^ i + β y_i = \gamma \hat{x}_i + \beta yi=γx^i+β
其中, y i y_i yi是输出, γ \gamma γ和 β \beta β是可学习参数。
作用
- 加速训练:
- 归一化后的数据分布更稳定,减少了内部协变量偏移,允许使用更高的学习率,加快收敛。
- 防止梯度消失/爆炸:
- 归一化使激活值保持在合理范围内,缓解了梯度消失或爆炸问题。
- 正则化效果:
- 由于使用小批量数据的统计量,引入了噪声,起到轻微的正则化作用,减少过拟合。
- 减少对初始化的依赖:
- 归一化使网络对参数初始化的敏感性降低,简化了调参过程。
实现
在训练时,计算每个小批量的均值和方差;在测试时,使用训练数据的移动平均均值和方差。
代码示例
import torch
import torch.nn as nn
# 定义一个带BatchNorm的层
batch_norm = nn.BatchNorm2d(num_features=64)
# 输入数据
input_data = torch.randn(32, 64, 128, 128)
# 前向传播
output = batch_norm(input_data)
总结
Batch Normalization通过对每层输入进行归一化,加速训练、防止梯度问题、提供正则化效果,并减少对初始化的依赖,是深度学习中的重要技术。
2. 数值例子
通过一个具体的数值例子来说明 Batch Normalization 的计算过程。
假设我们有一个 mini-batch,包含 3 个样本,每个样本有 2 个特征。数据如下:
X
=
[
1
2
3
4
5
6
]
X = \begin{bmatrix} 1 & 2 \\ 3 & 4 \\ 5 & 6 \\ \end{bmatrix}
X=
135246
其中:
- 每一行是一个样本。
- 每一列是一个特征(例如,特征 1 和特征 2)。
Batch Normalization 的计算步骤
-
计算每个特征的均值和方差
Batch Normalization 是对每个特征分别进行归一化的。我们分别计算特征 1 和特征 2 的均值和方差。
- 特征 1(第一列:1, 3, 5):
- 均值: μ 1 = 1 + 3 + 5 3 = 3 \mu_1 = \frac{1 + 3 + 5}{3} = 3 μ1=31+3+5=3
- 方差: σ 1 2 = ( 1 − 3 ) 2 + ( 3 − 3 ) 2 + ( 5 − 3 ) 2 3 = 4 + 0 + 4 3 = 8 3 \sigma_1^2 = \frac{(1-3)^2 + (3-3)^2 + (5-3)^2}{3} = \frac{4 + 0 + 4}{3} = \frac{8}{3} σ12=3(1−3)2+(3−3)2+(5−3)2=34+0+4=38
- 特征 2(第二列:2, 4, 6):
- 均值: μ 2 = 2 + 4 + 6 3 = 4 \mu_2 = \frac{2 + 4 + 6}{3} = 4 μ2=32+4+6=4
- 方差: σ 2 2 = ( 2 − 4 ) 2 + ( 4 − 4 ) 2 + ( 6 − 4 ) 2 3 = 4 + 0 + 4 3 = 8 3 \sigma_2^2 = \frac{(2-4)^2 + (4-4)^2 + (6-4)^2}{3} = \frac{4 + 0 + 4}{3} = \frac{8}{3} σ22=3(2−4)2+(4−4)2+(6−4)2=34+0+4=38
- 归一化
使用均值和方差对每个特征进行归一化。归一化公式为:
x
^
i
=
x
i
−
μ
σ
2
+
ϵ
\hat{x}_i = \frac{x_i - \mu}{\sqrt{\sigma^2 + \epsilon}}
x^i=σ2+ϵxi−μ
假设
ϵ
=
0.0001
\epsilon = 0.0001
ϵ=0.0001(一个很小的常数,防止除零)。
-
特征 1 的归一化:
x ^ 1 = 1 − 3 8 3 + 0.0001 ≈ − 2 1.633 ≈ − 1.225 \hat{x}_1 = \frac{1 - 3}{\sqrt{\frac{8}{3} + 0.0001}} \approx \frac{-2}{1.633} \approx -1.225 x^1=38+0.00011−3≈1.633−2≈−1.225
x ^ 2 = 3 − 3 8 3 + 0.0001 ≈ 0 1.633 ≈ 0 \hat{x}_2 = \frac{3 - 3}{\sqrt{\frac{8}{3} + 0.0001}} \approx \frac{0}{1.633} \approx 0 x^2=38+0.00013−3≈1.6330≈0
x ^ 3 = 5 − 3 8 3 + 0.0001 ≈ 2 1.633 ≈ 1.225 \hat{x}_3 = \frac{5 - 3}{\sqrt{\frac{8}{3} + 0.0001}} \approx \frac{2}{1.633} \approx 1.225 x^3=38+0.00015−3≈1.6332≈1.225 -
特征 2 的归一化:
x ^ 1 = 2 − 4 8 3 + 0.0001 ≈ − 2 1.633 ≈ − 1.225 \hat{x}_1 = \frac{2 - 4}{\sqrt{\frac{8}{3} + 0.0001}} \approx \frac{-2}{1.633} \approx -1.225 x^1=38+0.00012−4≈1.633−2≈−1.225
x ^ 2 = 4 − 4 8 3 + 0.0001 ≈ 0 1.633 ≈ 0 \hat{x}_2 = \frac{4 - 4}{\sqrt{\frac{8}{3} + 0.0001}} \approx \frac{0}{1.633} \approx 0 x^2=38+0.00014−4≈1.6330≈0
x ^ 3 = 6 − 4 8 3 + 0.0001 ≈ 2 1.633 ≈ 1.225 \hat{x}_3 = \frac{6 - 4}{\sqrt{\frac{8}{3} + 0.0001}} \approx \frac{2}{1.633} \approx 1.225 x^3=38+0.00016−4≈1.6332≈1.225
归一化后的数据为:
X ^ = [ − 1.225 − 1.225 0 0 1.225 1.225 ] \hat{X} = \begin{bmatrix} -1.225 & -1.225 \\ 0 & 0 \\ 1.225 & 1.225 \\ \end{bmatrix} X^= −1.22501.225−1.22501.225
- 缩放和平移
Batch Normalization 还会对归一化后的数据进行缩放和平移,引入可学习的参数 γ \gamma γ 和 β \beta β。假设 γ = [ 1 , 1 ] \gamma = [1, 1] γ=[1,1] 和 β = [ 0 , 0 ] \beta = [0, 0] β=[0,0](初始值),则输出为:
y i = γ ⋅ x ^ i + β y_i = \gamma \cdot \hat{x}_i + \beta yi=γ⋅x^i+β
计算后结果与归一化结果相同:
Y = [ − 1.225 − 1.225 0 0 1.225 1.225 ] Y = \begin{bmatrix} -1.225 & -1.225 \\ 0 & 0 \\ 1.225 & 1.225 \\ \end{bmatrix} Y= −1.22501.225−1.22501.225
如果 γ = [ 2 , 2 ] \gamma = [2, 2] γ=[2,2] 和 β = [ 1 , 1 ] \beta = [1, 1] β=[1,1],则输出为:
Y = [ − 1.225 × 2 + 1 − 1.225 × 2 + 1 0 × 2 + 1 0 × 2 + 1 1.225 × 2 + 1 1.225 × 2 + 1 ] = [ − 1.45 − 1.45 1 1 3.45 3.45 ] Y = \begin{bmatrix} -1.225 \times 2 + 1 & -1.225 \times 2 + 1 \\ 0 \times 2 + 1 & 0 \times 2 + 1 \\ 1.225 \times 2 + 1 & 1.225 \times 2 + 1 \\ \end{bmatrix} = \begin{bmatrix} -1.45 & -1.45 \\ 1 & 1 \\ 3.45 & 3.45 \\ \end{bmatrix} Y= −1.225×2+10×2+11.225×2+1−1.225×2+10×2+11.225×2+1 = −1.4513.45−1.4513.45
小结
- 归一化:将数据调整为均值为 0,方差为 1。
- 缩放和平移:通过 γ \gamma γ 和 β \beta β 恢复数据的表达能力。
- 最终输出:归一化后的数据经过缩放和平移,得到最终的输出。
通过这个数值例子,可以清楚地看到 Batch Normalization 的计算过程及其作用。
二、Layer normalization 理论与应用
1. 理论解释
Layer Normalization(层归一化)是另一种归一化技术,由 Jimmy Lei Ba 等人在 2016 年提出。它与 Batch Normalization(批归一化)的目标类似,都是为了加速训练并提高模型性能,但它们的归一化方式和应用场景有所不同。
Layer Normalization 的原理
Layer Normalization 是对单个样本的所有特征进行归一化,而不是像 Batch Normalization 那样对整个 mini-batch 的每个特征进行归一化。具体步骤如下:
- 计算均值和方差:
- 对于每个样本,计算其所有特征的均值和方差。
- 假设输入为
(
x
=
[
x
1
,
x
2
,
…
,
x
d
]
(x = [x_1, x_2, \dots, x_d]
(x=[x1,x2,…,xd](
d
d
d是特征维度),则:
μ = 1 d ∑ i = 1 d x i \mu = \frac{1}{d} \sum_{i=1}^d x_i μ=d1i=1∑dxi
σ 2 = 1 d ∑ i = 1 d ( x i − μ ) 2 \sigma^2 = \frac{1}{d} \sum_{i=1}^d (x_i - \mu)^2 σ2=d1i=1∑d(xi−μ)2
- 归一化:
- 使用均值和方差对每个特征进行归一化:
x ^ i = x i − μ σ 2 + ϵ \hat{x}_i = \frac{x_i - \mu}{\sqrt{\sigma^2 + \epsilon}} x^i=σ2+ϵxi−μ
其中, ϵ \epsilon ϵ 是一个很小的常数,用于防止除零。
- 缩放和平移:
- 引入可学习的参数
γ
\gamma
γ 和
β
\beta
β,对归一化后的数据进行缩放和平移:
y i = γ x ^ i + β y_i = \gamma \hat{x}_i + \beta yi=γx^i+β
Layer Normalization 的特点
- 对单个样本操作:
- Layer Normalization 是对每个样本的所有特征进行归一化,而不是对整个 mini-batch 的每个特征进行归一化。
- 适用于变长数据:
- 由于不依赖于 mini-batch 的大小,Layer Normalization 更适合处理变长数据(如 NLP 中的序列数据)。
- 对 mini-batch 大小不敏感:
- Layer Normalization 的性能不受 mini-batch 大小的影响,即使 batch size 为 1 也能正常工作。
2. 数值例子
通过一个包含多个样本的例子来详细说明 Layer Normalization 的计算过程。
假设我们有一个 mini-batch,包含 2 个样本,每个样本有 3 个特征。数据如下:
X = [ 2 4 6 1 3 5 ] X = \begin{bmatrix} 2 & 4 & 6 \\ 1 & 3 & 5 \\ \end{bmatrix} X=[214365]
其中:
- 每一行是一个样本。
- 每一列是一个特征(例如,特征 1、特征 2 和特征 3)。
Layer Normalization 的计算步骤
Layer Normalization 是对每个样本的所有特征进行归一化。因此,我们需要分别对每个样本计算均值和方差,然后进行归一化。
-
对第一个样本[2, 4, 6]的计算
-
计算均值和方差:
- 均值:
μ 1 = 2 + 4 + 6 3 = 4 \mu_1 = \frac{2 + 4 + 6}{3} = 4 μ1=32+4+6=4 - 方差:
σ 1 2 = ( 2 − 4 ) 2 + ( 4 − 4 ) 2 + ( 6 − 4 ) 2 3 = 4 + 0 + 4 3 = 8 3 \sigma_1^2 = \frac{(2-4)^2 + (4-4)^2 + (6-4)^2}{3} = \frac{4 + 0 + 4}{3} = \frac{8}{3} σ12=3(2−4)2+(4−4)2+(6−4)2=34+0+4=38
- 均值:
-
归一化:
使用公式:
x ^ i = x i − μ σ 2 + ϵ \hat{x}_i = \frac{x_i - \mu}{\sqrt{\sigma^2 + \epsilon}} x^i=σ2+ϵxi−μ
假设 ϵ = 0.0001 \epsilon = 0.0001 ϵ=0.0001。 -
特征 1:
x ^ 1 = 2 − 4 8 3 + 0.0001 ≈ − 2 1.633 ≈ − 1.225 \hat{x}_1 = \frac{2 - 4}{\sqrt{\frac{8}{3} + 0.0001}} \approx \frac{-2}{1.633} \approx -1.225 x^1=38+0.00012−4≈1.633−2≈−1.225
- 特征 2:
x ^ 2 = 4 − 4 8 3 + 0.0001 ≈ 0 1.633 ≈ 0 \hat{x}_2 = \frac{4 - 4}{\sqrt{\frac{8}{3} + 0.0001}} \approx \frac{0}{1.633} \approx 0 x^2=38+0.00014−4≈1.6330≈0 - 特征 3:
x ^ 3 = 6 − 4 8 3 + 0.0001 ≈ 2 1.633 ≈ 1.225 \hat{x}_3 = \frac{6 - 4}{\sqrt{\frac{8}{3} + 0.0001}} \approx \frac{2}{1.633} \approx 1.225 x^3=38+0.00016−4≈1.6332≈1.225
归一化后的第一个样本:
x ^ 1 = [ − 1.225 , 0 , 1.225 ] \hat{x}_1 = [-1.225, 0, 1.225] x^1=[−1.225,0,1.225] -
-
对第二个样本[1, 3, 5]的计算
-
计算均值和方差:
- 均值:
μ 2 = 1 + 3 + 5 3 = 3 \mu_2 = \frac{1 + 3 + 5}{3} = 3 μ2=31+3+5=3 - 方差:
σ 2 2 = ( 1 − 3 ) 2 + ( 3 − 3 ) 2 + ( 5 − 3 ) 2 3 = 4 + 0 + 4 3 = 8 3 \sigma_2^2 = \frac{(1-3)^2 + (3-3)^2 + (5-3)^2}{3} = \frac{4 + 0 + 4}{3} = \frac{8}{3} σ22=3(1−3)2+(3−3)2+(5−3)2=34+0+4=38
- 均值:
-
归一化:
使用公式:
x ^ i = x i − μ σ 2 + ϵ \hat{x}_i = \frac{x_i - \mu}{\sqrt{\sigma^2 + \epsilon}} x^i=σ2+ϵxi−μ
-
特征 1:
x ^ 1 = 1 − 3 8 3 + 0.0001 ≈ − 2 1.633 ≈ − 1.225 \hat{x}_1 = \frac{1 - 3}{\sqrt{\frac{8}{3} + 0.0001}} \approx \frac{-2}{1.633} \approx -1.225 x^1=38+0.00011−3≈1.633−2≈−1.225 -
特征 2:
x ^ 2 = 3 − 3 8 3 + 0.0001 ≈ 0 1.633 ≈ 0 \hat{x}_2 = \frac{3 - 3}{\sqrt{\frac{8}{3} + 0.0001}} \approx \frac{0}{1.633} \approx 0 x^2=38+0.00013−3≈1.6330≈0 -
特征 3:
x ^ 3 = 5 − 3 8 3 + 0.0001 ≈ 2 1.633 ≈ 1.225 \hat{x}_3 = \frac{5 - 3}{\sqrt{\frac{8}{3} + 0.0001}} \approx \frac{2}{1.633} \approx 1.225 x^3=38+0.00015−3≈1.6332≈1.225归一化后的第二个样本:
x ^ 2 = [ − 1.225 , 0 , 1.225 ] \hat{x}_2 = [-1.225, 0, 1.225] x^2=[−1.225,0,1.225]
-
-
归一化后的结果
将所有样本的归一化结果组合起来:
X ^ = [ − 1.225 0 1.225 − 1.225 0 1.225 ] \hat{X} = \begin{bmatrix} -1.225 & 0 & 1.225 \\ -1.225 & 0 & 1.225 \\ \end{bmatrix} X^=[−1.225−1.225001.2251.225] -
缩放和平移
Layer Normalization 还会对归一化后的数据进行缩放和平移,引入可学习的参数 γ \gamma γ 和 β \beta β。假设 γ = [ 1 , 1 , 1 ] \gamma = [1, 1, 1] γ=[1,1,1] 和 β = [ 0 , 0 , 0 ] \beta = [0, 0, 0] β=[0,0,0](初始值),则输出为:y i = γ ⋅ x ^ i + β y_i = \gamma \cdot \hat{x}_i + \beta yi=γ⋅x^i+β
计算结果与归一化结果相同:
Y = [ − 1.225 0 1.225 − 1.225 0 1.225 ] Y = \begin{bmatrix} -1.225 & 0 & 1.225 \\ -1.225 & 0 & 1.225 \\ \end{bmatrix} Y=[−1.225−1.225001.2251.225]
如果 γ = [ 2 , 2 , 2 ] \gamma = [2, 2, 2] γ=[2,2,2] 和 β = [ 1 , 1 , 1 ] \beta = [1, 1, 1] β=[1,1,1],则输出为:
Y = [ − 1.225 × 2 + 1 0 × 2 + 1 1.225 × 2 + 1 − 1.225 × 2 + 1 0 × 2 + 1 1.225 × 2 + 1 ] = [ − 1.45 1 3.45 − 1.45 1 3.45 ] Y = \begin{bmatrix} -1.225 \times 2 + 1 & 0 \times 2 + 1 & 1.225 \times 2 + 1 \\ -1.225 \times 2 + 1 & 0 \times 2 + 1 & 1.225 \times 2 + 1 \\ \end{bmatrix} = \begin{bmatrix} -1.45 & 1 & 3.45 \\ -1.45 & 1 & 3.45 \\ \end{bmatrix} Y=[−1.225×2+1−1.225×2+10×2+10×2+11.225×2+11.225×2+1]=[−1.45−1.45113.453.45]
小结
- Layer Normalization 是对每个样本的所有特征进行归一化。
- 计算步骤包括:
- 计算每个样本的均值和方差。
- 归一化。
- 缩放和平移。
- 与 Batch Normalization 不同,Layer Normalization 不依赖于 mini-batch,适合处理变长数据(如 NLP 中的序列数据)。
通过这个包含多个样本的例子,可以清楚地看到 Layer Normalization 的计算过程及其作用。
三、Layer Normalization 和 Batch Normalization 的区别
代码示例
以下是 PyTorch 中 Layer Normalization 的实现示例:
import torch
import torch.nn as nn
# 定义一个 LayerNorm 层
layer_norm = nn.LayerNorm(normalized_shape=64) # normalized_shape 是特征维度
# 输入数据 (batch_size, sequence_length, feature_dim)
input_data = torch.randn(32, 10, 64) # 假设 batch_size=32, sequence_length=10, feature_dim=64
# 前向传播
output = layer_norm(input_data)
总结
- Layer Normalization 是对单个样本的所有特征进行归一化,适用于变长数据(如 NLP 中的序列数据)。
- Batch Normalization 是对 mini-batch 中每个特征进行归一化,适合固定长度的数据(如图像)。
- 两者的主要区别在于归一化的维度和对 mini-batch 的依赖程度。选择哪种归一化方法取决于具体任务和数据特性。
四、《Transformers without Normalization》笔记
paper:https://arxiv.org/pdf/2503.10622
文章的核心思想是tanh代替了归一化层,这是因为作者做实验发现LN的输入输出曲线,很像tanh函数的“S”型曲线:
tanh(x) 函数可视化:
∼ O n e p e r s o n g o f a s t e r , a g r o u p o f p e o p l e c a n g o f u r t h e r ∼ \sim_{One\ person\ go\ faster,\ a\ group\ of\ people\ can\ go\ further}\sim ∼One person go faster, a group of people can go further∼