Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

归一化

上一章,我们给 Transformer 模块的两个子层加上了残差连接,从而梯度有了快速通道。但是残差连接也带来一个副作用:每一层的输出都是“输入 + 变换”,随着层数增加,数值不断累积,越来越大,训练变得不稳定。

层归一化

解决办法是层归一化(Layer Normalization):把每一层的输出拉回到均值为 0、方差为 1 的标准分布。

计算均值和方差:

μ=1d∑i=1dxi,σ2=1d∑i=1d(xi−μ)2\mu = \frac{1}{d} \sum_{i=1}^{d} x_i, \quad \sigma^2 = \frac{1}{d} \sum_{i=1}^{d} (x_i - \mu)^2

标准化:

x^=x−μσ2+ϵ\hat{x} = \frac{x - \mu}{\sqrt{\sigma^2 + \epsilon}}

缩放和平移:

output=γ⊙x^+β\text{output} = \gamma \odot \hat{x} + \beta

这里:

  • dd:嵌入尺寸;

  • ϵ\epsilon:一个很小的数(比如 10-5),防止除数为 0;

  • γ\gamma(weight):可学习的缩放因子(权重);

  • β\beta(bias):可学习的平移因子(偏置)。

不管数值多大,层归一化都可以把数值拉回标准范围,防止数值爆炸。同时使得数值分布稳定,梯度变化更加平滑,收敛更快。

可学习的缩放因子和平移因子使得归一化的幅度可以自动调节,使得一刀切的归一化公式和数据集更加匹配。

加入归一化的 GPT 基础模块示意图:注意力层、前馈网络层和输出层的输入都先经过归一化层
图例:加入归一化的 GPT 基础模块

数据集

字符编码数据集

下三角矩阵层

归一化层

新增归一化层(LayerNorm 层):

  • 前向传播:对最后一维(特征维度)计算均值和方差。标准化后再缩放和平移;

  • 反向传播:需要分别计算输入 xx、缩放因子 γ\gamma、平移因子 β\beta 的梯度。

激活函数

高斯误差线性单元激活函数(GELU)

损失函数

GPT 交叉熵损失函数

模型

GPT 嵌入层

GPT 注意力层

在 GPT 注意力层首先对输入归一化,然后再做注意力,最后残差连接。

GPT 前馈网络层

同样,在 GPT 前馈网络层也首先对输入归一化,然后再接前馈网络,最后残差连接。

GPT Transformer 模块

GPT 输出层

输出层同样首先对输入归一化,确保进入线性层的数据分布稳定。

GPT 模型

GPT 训练器

超参数

学习率

批大小

轮数

上下文尺寸

嵌入尺寸

头数

Transformer 模块数

建模

训练

评估

prediction:	1742 steps, each (4, 32, 65)
loss:	1.7808665809757263

推理

ROMEO:
Well.

SABELLA:
Therefore thee go by the tranted is is fastely, and is but more him, where's for you wife?

HORFOMIO:
I am as oncove whomostion on holve all me there and when yalk?

DUKE VINCENTIO:
You speech that be, being suppy,
That try love.

SAVINCO:

本章,我们给 GPT 模型的各模块加装了层归一化,确保残差连接后,进入下一层的数据回到标准范围内,保证训练稳定。

至此,我们基本解决了怎样让 GPT 模型可以堆得更深,同时保证训练稳定的问题,扫除了训练大规模 GPT 模型的发展障碍。下一章,我们将关注大规模训练很容易产生的一个问题:过拟合(Overfitting)。模型在训练集上表现很好,在测试集上却可能很差。模型“记住”了过多的训练数据的细节,而不是真正地“学会”了语言规律。

课后练习

  1. 均方根归一化(Root Mean Square Normalization, RMSNorm)是层归一化的一种有效的简化版。RMSNorm 直接假设均值为 0,只计算均方根。并且只保留可学习的缩放因子 γ\gamma,去掉平移因子 β\beta。试试将归一化层改成 RMSNorm,看看训练效果如何?