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 模型基本骨架,同时也指出了它的问题。本章,我们着手解决第一个问题:没有位置信息。

嵌入层目前只能告诉模型每个词元是什么,却不能告诉模型每个词元在哪里。对模型来说,“老鼠爱大米”和“大米爱老鼠”是同一句话:无论词元出现在哪个位置,同一个词元算出来的词向量都一模一样。

但是语序恰恰是语言的灵魂。同一个词,出现在句首还是句尾,含义可能完全不同。对比一下:RNN 模型是逐个词元顺序处理的,位置信息天然蕴含在处理顺序里,不需要额外编码。而 GPT 模型一次性并行处理所有词元,效率高,代价就是丢失了语序信息。因此我们必须把语序信息显式地加入编码。

位置编码

如何表示词序信息?最直接的想法是:依次给每个位置一个编号,比如第 1 个词元是 1,第 2 个词元是 2,等等。我们称之为位置编码(Position Encoding)。

是不是很眼熟?和词元的索引编码很像?只不过索引编码是词元在词表中的位置,位置编码是词元在文本中的位置。

位置嵌入

显然,我们可以借鉴词元嵌入的思路:既然我们可以用一个可以训练的词向量来代替索引编码,位置编码为什么不可以?

位置嵌入(Position Embedding)就是用一个可学习的位置向量(Position Vector)来代替位置编码。将每个词元的词向量和位置向量一起提供给 GPT 模型,就可以解决 GPT 模型天然忽略语序的问题。

数据集

字符编码数据集

激活函数

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

损失函数

GPT 交叉熵损失函数

模型

GPT 嵌入层

我们在 GPT 嵌入层加入位置嵌入 positional_embedding,形成“词元嵌入 + 位置嵌入”的组合:

  • embedding(词元嵌入):用词元索引编码查表,产生词向量,格式为 (批大小, 上下文尺寸, 嵌入尺寸);

  • positional_embedding(位置嵌入):用词元位置编码查表,产生位置向量,格式为 (上下文尺寸, 嵌入尺寸)。

嵌入层需要一个新的初始化参数:上下文尺寸 context_size,用于确定位置嵌入权重矩阵的大小。

最终的输出结果是“词向量 + 位置向量”。

这里要注意:这是两个张量的加法,使用了我们的模型训练框架中扩展的张量加法,保证了计算图和反向传播的延续,而不是简单地将两个向量的数值加在一起。

同时,词向量(3 维)和位置向量(2 维)的格式不同,两个向量可以直接相加,用到了张量中支持的广播机制(Broadcasting):位置向量会被自动扩展到和词向量相同的维度,然后相加。

加入位置嵌入的 GPT 基础模块示意图:词向量与位置向量相加后,进入 Transformer 模块
图例:加入位置嵌入的 GPT 基础模块

GPT 前馈网络层

GPT Transformer 模块

GPT 输出层

GPT 模型

创建 GPT 模型也需要增加一个额外的初始化参数:上下文尺寸 context_size,用于创建嵌入层。

GPT 训练器

超参数

学习率

批大小

轮数

上下文尺寸

嵌入尺寸

Transformer 模块数

建模

创建模型时,需要额外传入 CONTEXT_SIZE 作为初始化参数。

训练

评估

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

推理

ROMEO:
PELUCENone iat werachald l d:
ANMyerther, itik he
TIO:
Ife.
DUKayo in, y dld s m f s pllorislds hine try be ou 'te noungeltwiomavear whe
Opld migrarthemaxhayorthe t; llleakash lu aru g d, harenout watllllicinchiowe f s my, boive
I he y a fod, gheltl I her

本章,我们通过位置嵌入,给模型提供“词向量 + 位置向量”,让模型既能分辨“是什么”,也能分辨“在哪里”。

至此,我们完成了 GPT 模型的输入表示部分。

但是我们从推理结果中并不能看到明显的进步,是因为还有一个更根本的问题没有解决:词元之间“互不来往”。每个位置的预测只取决于当前这个词元和它的位置,模型完全不知道上下文还有什么。

下一章,我们将开始引入 GPT 模型最核心的机制:自注意力(Self-Attention),让词元之间真正地“看见彼此”。

课后练习

  1. 尝试统计一下 GPT 模型的参数规模,包括词元嵌入、位置嵌入的权重矩阵,以及其他模块里线性层的权重和偏置等。看看主要和哪些超参数相关?