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.

多头注意力

上一章,我们给自注意力加上了 QQ、KK、VV 角色分离机制。但是还有一个限制:所有词元共用同一套 QQ、KK、VV。

就像一个人只会用一种视角看问题,无法理解同一个词在不同语境下可以有不同的含义。比如“苹果”这个词:

  • 在“吃苹果”中,它是水果;

  • 在“苹果手机”中,它是品牌。

目前的模型只能用同一种方式去理解它,无法同时捕捉这两种不同的含义。

多头注意力

解决办法是多头注意力(Multi-Head Attention):把词元的嵌入向量切分成若干份,称为头(Head);给每份生成单独的一套 QQ、KK、VV 线性投影;然后各自发展出独立的注意力,最后再拼合到一起:

  • 每个头有自己的 QQ、KK、VV 线性投影,关注不同的特征子空间;

  • 每个头独立发展,关注到不同的数据逻辑;

  • 多头并行工作,最后汇总,模型就能从多个角度理解上下文。

切分与合并

假设嵌入尺寸是 64,头数是 2,那么:

  • 每个头的嵌入尺寸是 64 / 2 = 32;

  • 输入格式从 (批大小, 上下文尺寸, 64) 变成 (批大小, 上下文尺寸, 2, 32);

  • 转置成 (批大小, 2, 上下文尺寸, 32),这样每个头可以独立计算注意力;

  • 计算完后转置回来 (批大小, 上下文尺寸, 2, 32),再拼接回 (批大小, 上下文尺寸, 64)。

缩放因子

每个头的嵌入尺寸是 EMBEDDING_SIZE / HEADS,所以缩放因子 1/d1 / \sqrt{d} 里的 dd 现在是 EMBEDDING_SIZE / HEADS。

参数量

多头注意力的参数量和单头注意力完全一样:QQ、KK、VV 三个线性投影的权重矩阵依然是 (嵌入尺寸, 嵌入尺寸)。区别只在于计算时把向量切分成多份,每份独立计算。

💡 提示:计算多头注意力不是多个注意力的堆叠,而是同一个注意力内部扩展维度后的并行计算。

数据集

字符编码数据集

下三角矩阵层

激活函数

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

损失函数

GPT 交叉熵损失函数

模型

GPT 嵌入层

GPT 注意力层

我们在 GPT 注意力层添加多头支持。

前向传播多了切分和合并两个步骤:

  • 生成 QQ、KK、VV:通过三个线性层,分别得到查、键、值;

  • 切分头部:把嵌入向量拆分成若干份;

  • 计算注意力:每个头部独立计算注意力分数矩阵、缩放、掩码、计算权重、加权求和;

  • 合并头部:将多头注意力拼接汇总。

注意力在切分和合并时格式的变化:

切分:(批,上下文,嵌入)→切分(批,上下文,头数,每头嵌入)→转置(批,头数,上下文,每头嵌入)\text{切分}: (\text{批}, \text{上下文}, \text{嵌入}) \xrightarrow{\text{切分}} (\text{批}, \text{上下文}, \text{头数}, \text{每头嵌入}) \xrightarrow{\text{转置}} (\text{批}, \text{头数}, \text{上下文}, \text{每头嵌入})
合并:(批,头数,上下文,每头嵌入)→转置(批,上下文,头数,每头嵌入)→合并(批,上下文,嵌入)\text{合并}: (\text{批}, \text{头数}, \text{上下文}, \text{每头嵌入}) \xrightarrow{\text{转置}} (\text{批}, \text{上下文}, \text{头数}, \text{每头嵌入}) \xrightarrow{\text{合并}} (\text{批}, \text{上下文}, \text{嵌入})

因此,多头机制只在 GPT 注意力层内部处理。输出结果的格式没有变化,后续步骤不需要修改。

GPT 前馈网络层

GPT Transformer 模块

创建时需要传入 heads 参数。

GPT 输出层

GPT 模型

创建时需要传入 heads 参数。

GPT 训练器

超参数

学习率

批大小

轮数

上下文尺寸

嵌入尺寸

头数

这是定义多头注意力中头数的超参数。

Transformer 模块数

建模

建模时,需要额外传入 HEADS 作为模型参数。

训练

评估

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

推理

ROMEO:
Where as her, mise. what I shall bestill tranter is it fate,
Why onot untock: papon you have for you wife?

HORTA:
I what a the know
You will the'll cof Pefier there and which:
Chold we man use to love, thing the mall geread; thou reavedss lovela, by off 

本章,我们给注意力加上了多头机制:把嵌入向量切分成若干份,每份拥有独立的 QQ、KK、VV 线性投影,独立做注意力,最终拼接汇总。模型因此可以从多个角度理解上下文。

至此,我们实现了完整的自注意力机制,一步步搭建出 GPT 模型的核心组件:

  • 自注意力:词元之间看到彼此;

  • 因果注意力:屏蔽未来,防止偷看答案;

  • 加权注意力:QQ、KK、VV 角色分离;

  • 多头注意力:多角度并行理解上下文。

课后练习

  1. 试着把 HEADS 从 2 改成 4 或者 8,观察训练速度和效果有什么变化?头数是不是越多越好?