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.

加权注意力

上一章,我们用因果掩码堵上了偷看答案的漏洞。但是目前的因果注意力还有一个隐藏的问题:词元身兼数职,不同的角色在权重里互相干扰。

回顾一下自注意力的计算过程:

Attention(X)=softmax(X⋅XTd)X\text{Attention}(X) = \text{softmax}\left(\frac{X \cdot X^T}{\sqrt{d}}\right) X

同一个输入 XX 同时扮演了三个角色:

  • 提问者:我是哪个词元?我需要什么信息?

  • 回答者:我是哪个词元?我能提供什么信息?

  • 信息本身:我是哪个词元?我实际携带的内容是什么?

同一个词元既要提问、又要回答、还是信息本身。同时充当多个角色,很难都做好。

查、键、值

解决的办法是实施角色分离:使用 3 套不同的权重,给每个词元生成 3 个不同的向量。可以想象为给同一个词元 3 个不同的面具,分别在扮演不同角色时使用:

  • Query(查):充当提问者;

  • Key(键):充当回答者;

  • Value(值):充当信息本身。

这三个向量通过对输入 XX 分别做线性变换得到:

Q=X⋅WQ,K=X⋅WK,V=X⋅WVQ = X \cdot W_Q, \quad K = X \cdot W_K, \quad V = X \cdot W_V

这里 WQW_Q、WKW_K、WVW_V 是三个可训练的权重矩阵,可以通过模型训练,调整到最适合对应角色的方向。有了角色分离,自注意力的公式就变成了:

Attention(Q,K,V)=softmax(Q⋅KTd)V\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{Q \cdot K^T}{\sqrt{d}}\right) V

加权注意力

加入 QQ、KK、VV 线性投影后的注意力,称为加权注意力(Weighted Attention)。

数据集

字符编码数据集

下三角矩阵层

激活函数

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

损失函数

GPT 交叉熵损失函数

模型

GPT 嵌入层

GPT 注意力层

我们在 GPT 注意力层引入 QQ、KK、VV 三个线性投影。前向传播步骤扩展为:

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

  • 计算注意力分数矩阵:scores=Q⋅KT\text{scores} = Q \cdot K^T;

  • 缩放:乘以 1/d1 / \sqrt{d},防止数值过大。这里 dd 是嵌入尺寸 embedding_size;

  • 因果掩码:用下三角矩阵层屏蔽未来位置;

  • 计算注意力权重:用 Softmax 激活函数将每一行转换成概率分布;

  • 加权求和:注意力权重乘以 VV,得到融合上下文的新的注意力向量。

GPT 前馈网络层

GPT Transformer 模块

GPT 输出层

GPT 模型

GPT 训练器

超参数

学习率

批大小

轮数

上下文尺寸

嵌入尺寸

Transformer 模块数

建模

训练

评估

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

推理

ROMEO:
Where as his and andrieus
That end with love will so so be dever onot, as is bideiffutend, go stay.

TRANIO:
That he the lady! elty I'll will thee hom.

ANGELO:
Her davent.

MO' him busio's tis! seest.

PETHA:
Deel he, do mastion; poitrtys love:
Ay, my ye

本章,我们给自注意力机制加上了角色分离机制:用 QQ、KK、VV 三个线性投影,让词元在提问、回答和传递信息时各司其职。

目前的自注意力还有一个局限:所有词元只用同一套 QQ、KK、VV。就像一个人总是只用一种视角看问题,难免片面。比如“苹果”这个词,在“吃苹果”和“苹果手机”中的含义是完全不同,但目前的自注意力只会用同一种方式去理解。

下一章,我们将引入多头机制,让模型学会从不同角度理解上下文。

课后练习

  1. 尝试把 QQ、KK、VV 三个线性投影中的某一个去掉,用 XX 直接代替。观察一下训练效果有什么变化?哪个投影的影响最大?