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.

随机失活

上一章,我们给 GPT 模型加装了层归一化,保证了残差连接后的数值稳定和训练稳定。同时也提到了大规模训练的一个可能问题:过拟合(Overfitting)。

模型在训练集上表现很好,在测试集上却可能很差。模型记住了过多的训练数据的细节,而不是真正地学会了语言规律。就像一个学生只是死记硬背了所有的练习题,考试时遇到新题就傻眼了。


随机失活(Dropout)是防止过拟合的经典技术:训练时,随机丢弃一部分神经元的输出(设为 0),让模型不能过度依赖任何单个神经元:

  • 训练时:随机将一定比例 pp(比如 0.1)的神经元的输出设为 0,剩下的输出除以 1−p1 - p 来保持期望值不变;

  • 推理时:不丢弃任何神经元,使用全部输出。

加入随机失活的 GPT 基础模块示意图:随机失活位于嵌入层之后,以及注意力层和前馈网络层的残差连接之前
图例:加入随机失活的 GPT 基础模块

数据集

字符编码数据集

下三角矩阵层

归一化层

随机失活层

随机失活层(Dropout 层)在训练时随机丢弃一部分神经元的输出:

  • 前向传播:

    • 训练时:生成一个和输入值格式相同的随机掩码,以概率 1−p1 - p 保留(缩放因子为 1/(1−p)1 / (1 - p)),以概率 pp 丢弃(值为 0);

    • 推理时:直接返回输入值;

  • 反向传播:梯度只通过被保留的神经元回传,被丢弃的神经元梯度为 0。

💡 提示:将保留的输入值除以 1−p1 - p,是为了保持输出值的整体期望值不变,这样训练时和推理时的输出尺度一致。

激活函数

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

损失函数

GPT 交叉熵损失函数

模型

GPT 嵌入层

在词向量和位置向量合并以后,添加随机失活。

GPT 注意力层

在注意力层,随机失活添加在残差连接前面。

GPT 前馈网络层

同样的,在前馈网络层,随机失活也添加在残差连接前面。

GPT Transformer 模块

GPT 输出层

GPT 模型

GPT 训练器

超参数

学习率

批大小

轮数

上下文尺寸

嵌入尺寸

头数

Transformer 模块数

建模

训练

评估

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

推理

ROMEO:
O:
O deseep would my lethis this they-anio, you hale should, gentis,
I'll I
Boy, this I have of del mogriess.

Secondself faic, not lifect were Clains; i' be So thour man I complo, and do hand
Mistrue such to which a city his old vice frieunts not man,
An

本章,我们给 GPT 模型添加了随机失活:在训练时随机丢弃一部分神经元的输出,防止过拟合。

至此,预训练的三大工程优化技术就配齐了:

  • 残差连接:让梯度顺畅无阻,防止梯度消失;

  • 层归一化:让数值稳定,训练稳定;

  • 随机失活:防止过拟合。

有了这些工程优化技术,模型可以堆得更高、训练得更稳、泛化更好。

课后练习

  1. 试着把 Dropout 的概率 pp 从 0.1 改成 0.3 甚至 0.5,观察训练效果如何?概率是不是越大越好?