For the complete documentation index, see llms.txt. This page is also available as Markdown.

39.2 Transformer 数学基础与程序演示

人工智能的数学基础

2017 年,Vaswani 等人提出了一种完全基于注意力机制、舍弃循环和卷积的序列转换模型——Transformer。本节严格依据该论文原文,重构其全部数学基础,并补充必要的背景知识。

许多核心机器学习模型从根本上依靠线性代数(Linear Algebra)原理来表达和求解。实践中,数据很少以简单的单一数值形式出现,通常表现为数据集,即大量数据点的集合。线性代数提供了有效整理、处理和分析这些数据的工具,使从业者得以通过向量(Vector)、矩阵(Matrix)和张量(Tensor)等对象来表示结构化数据(Structured Data),如表格数据,以及非结构化数据,如图像或视频。

不确定性量化(Uncertainty Quantification,UQ)旨在量化并降低物理系统建模与模拟中的不确定性;在系统某些因素未知的情况下,它试图给出研究结果的置信度。

统计学家乔治·博克斯(George Box)曾言:“所有的模型都是错误的,但有些模型是有用的。”

Attention 定义

Vaswani 等人在 2017 年 Transformer 论文中提出的缩放点积注意力(Scaled Dot-Product Attention)的数学定义,其核心是 加权求和(weighted sum),通过查询(Query)、键(Key)和值(Value)矩阵实现。注意力标准定义如下:

Attention(Q,K,V)=softmax(QKdk)V\mathrm{Attention}(Q, K, V) = \mathrm{softmax}\Biggl(\frac{Q K^\top}{\sqrt{d_k}}\Biggr) V

其中:

QRn×dk,查询矩阵KRm×dk,键矩阵VRm×dv,值矩阵dk,键向量的维度,用于缩放softmax(),对每行归一化得到权重计算相似度矩阵: S=QK,缩放: Sscaled=Sdk,权重矩阵: A=softmax(Sscaled),输出: Attention(Q,K,V)=AV\begin{array}{rl} Q \in \mathbb{R}^{n \times d_k}, & \text{查询矩阵} \\ K \in \mathbb{R}^{m \times d_k}, & \text{键矩阵} \\ V \in \mathbb{R}^{m \times d_v}, & \text{值矩阵} \\ d_k, & \text{键向量的维度,用于缩放} \\ \mathrm{softmax}(\cdot), & \text{对每行归一化得到权重} \\ \text{计算相似度矩阵: } S = Q K^\top, & \\ \text{缩放: } S_\mathrm{scaled} = \frac{S}{\sqrt{d_k}}, & \\ \text{权重矩阵: } A = \mathrm{softmax}(S_\mathrm{scaled}), & \\ \text{输出: } \mathrm{Attention}(Q,K,V) = A V & \end{array}

向量的定义

在数学上,向量(vector)是一个 有序数组,表示一个具有大小和方向的量。例如,二维向量可以写作:

v=[v1v2],v1,v2R\mathbf{v} = \begin{bmatrix} v_1 \\ v_2 \end{bmatrix}, \quad v_1, v_2 \in \mathbb{R}

一般来说,长度为 d 的向量:

v=[v1v2vd]Rd\mathbf{v} = \begin{bmatrix} v_1 \\ v_2 \\ \vdots \\ v_d \end{bmatrix} \in \mathbb{R}^d

向量之间有以下基本运算:

  • 加法:逐元素相加

u+v=[u1+v1u2+v2ud+vd]\mathbf{u} + \mathbf{v} = \begin{bmatrix} u_1 + v_1 \\ u_2 + v_2 \\ \vdots \\ u_d + v_d \end{bmatrix}
  • 数乘(标量乘法):向量每个分量乘以一个标量

cv=[cv1cv2cvd]c \mathbf{v} = \begin{bmatrix} c v_1 \\ c v_2 \\ \vdots \\ c v_d \end{bmatrix}
  • 内积(dot product):衡量两个向量的相似度

uv=i=1duivi\mathbf{u} \cdot \mathbf{v} = \sum_{i=1}^{d} u_i v_i

权重加权求和

设有向量 v₁,…,vₘ 和对应权重 α₁,…,αₘ,权重非负且和为 1,则输出向量 o 为它们的加权求和。

o=i=1mαivi,αi0,i=1mαi=1\mathbf{o} = \sum_{i=1}^{m} \alpha_i v_i, \quad \alpha_i \ge 0, \quad \sum_{i=1}^{m} \alpha_i = 1

这就是 从多组向量中选择性地聚合信息 的基本操作。Attention 正是执行这种加权求和,但权重由查询向量决定。

查询、键、值向量

查询向量: qRdk键向量集合: k1,k2,,kmRdk值向量集合: v1,v2,,vmRdv相似度: si=qki,i=1,,m权重: αi=exp(si)j=1mexp(sj),i=1,,m输出向量: output=i=1mαivi\begin{array}{rl} \text{查询向量: } & q \in \mathbb{R}^{d_k} \\ \text{键向量集合: } & k_1, k_2, \dots, k_m \in \mathbb{R}^{d_k} \\ \text{值向量集合: } & v_1, v_2, \dots, v_m \in \mathbb{R}^{d_v} \\ \text{相似度: } & s_i = q \cdot k_i, \quad i = 1, \dots, m \\ \text{权重: } & \alpha_i = \frac{\exp(s_i)}{\sum_{j=1}^{m} \exp(s_j)}, \quad i = 1, \dots, m \\ \text{输出向量: } & \text{output} = \sum_{i=1}^{m} \alpha_i v_i \end{array}

相似度与 softmax

以内积衡量查询与键的相似度:

si=qkis_i = q \cdot k_i

随后将这些相似度转换为概率:

αi=exp(si)j=1mexp(sj)\alpha_i = \frac{\exp(s_i)}{\sum_{j=1}^{m} \exp(s_j)}

由此,最相关的键所对应的值获得更大权重。

向量矩阵形式

将 m 个值向量堆成矩阵 V,键矩阵 K,查询矩阵 Q,可以得到矩阵形式的 Attention:

VRm×dv,KRm×dk,QRn×dkS=QKSscaled=SdkA=softmax(Sscaled)Attention(Q,K,V)=AV\begin{array}{rl} V \in \mathbb{R}^{m \times d_v}, \quad K \in \mathbb{R}^{m \times d_k}, \quad Q \in \mathbb{R}^{n \times d_k} & \\ S = Q K^\top & \\ S_\mathrm{scaled} = \frac{S}{\sqrt{d_k}} & \\ A = \mathrm{softmax}(S_\mathrm{scaled}) & \\ \mathrm{Attention}(Q,K,V) = A V & \end{array}

缩放点积注意力 (Scaled Dot-Product Attention) 计算流程:

计算流程

程序示例

以下示例在连续向量空间中通过注意力机制学习字符序列的动态关联,完成“你好世界”序列的自回归生成。

程序输出结果示例:

上述代码实现了微型 GPT(自回归语言模型):给定“你”预测“好”,给定“你好”预测“世”,以此类推。经过 1000 轮训练,交叉熵损失从 2.033882 降至 0.000001,模型精确习得了序列 ['你', '好', '世', '界']['好', '世', '界', '你'] 的移位关系。

微型 GPT 模型架构如下图所示:

微型 GPT 模型架构

模型严格符合标准 缩放点积注意力(Scaled Dot-Product Attention)的数学定义:

Attention(Q,K,V)=softmax(QKdk)V\mathrm{Attention}(Q,K,V) = \mathrm{softmax}\left( \frac{Q K^\top}{\sqrt{d_k}} \right) V

在代码中的对应关系如下。

Q、K、V 生成

Q=WQx,K=WKx,V=WVxQ = W_Q \, x,\quad K = W_K \, x,\quad V = W_V \, x

源代码中 Q = self.W_Q(x)K = self.W_K(x)V = self.W_V(x) —— 三者从同一输入 x 经线性投影得到,即自注意力。由于:

dmodel=512,nheads=8d_{\mathrm{model}} = 512, \quad n_{\mathrm{heads}} = 8
dk=dhead=dmodelnheads=5128=64d_k = d_{\mathrm{head}} = \frac{d_{\mathrm{model}}}{n_{\mathrm{heads}}} = \frac{512}{8} = 64

投影结果被拆分为 8 头,每头维度

dk=64d_k = 64

(代码 Q.view(B, T, self.n_heads, self.d_head).transpose(1, 2))。

输出仅展示了第一个注意力头(head=0)的 Q、K、V、scores 和 alpha,便于读者追溯完整的计算链路。

相似度与缩放

S=QK,Sscaled=SdkS = Q K^\top, \qquad S_\mathrm{scaled} = \frac{S}{\sqrt{d_k}}

对应源代码 scores = Q @ K.transpose(-2, -1)scores_scaled = scores / math.sqrt(self.d_head)

因果掩码(Causal Mask)

上三角置 -∞,迫使位置 i 只能关注位置 0,…,i:这是自回归模型的根本约束——预测下一个词元时不可预先获取未来信息。scaled 矩阵中的 -inf 正是这一约束的直观体现。

Softmax 归一化

A=softmax(Sscaled)A = \mathrm{softmax}(S_\mathrm{scaled})

对应 alpha = F.softmax(scores_scaled, dim=-1)。由于

e=0e^{-\infty} = 0

mask 位置权重为零;其余位置非负且和为 1,构成合法概率分布:

位置 0(你):[1.000,0,0,0]位置 1(好):[0.073,0.927,0,0]位置 2(世):[0.273,0.475,0.251,0]位置 3(界):[0.069,0.333,0.514,0.084]\begin{array}{rl} \text{位置 0(你)} &: [1.000,\, 0,\, 0,\, 0] \\ \text{位置 1(好)} &: [0.073,\, 0.927,\, 0,\, 0] \\ \text{位置 2(世)} &: [0.273,\, 0.475,\, 0.251,\, 0] \\ \text{位置 3(界)} &: [0.069,\, 0.333,\, 0.514,\, 0.084] \end{array}

加权求和输出

output=AV\mathrm{output} = A V

对应 out = alpha @ V,随后合并多头、经 W_O 投影输出。

前馈网络(FFN)

dff=4×dmodel=2048d_\mathrm{ff} = 4 \times d_\mathrm{model} = 2048

与原始论文一致。

残差连接与层归一化

等同于

x+Sublayer(LayerNorm(x))x + \mathrm{Sublayer}(\mathrm{LayerNorm}(x))

的 Pre-LN 变体。

规模对比

本例仅 4 个词元

dmodel=512,nlayers=6,nheads=8d_\mathrm{model} = 512, \quad n_\mathrm{layers} = 6, \quad n_\mathrm{heads} = 8

与原始 Transformer 论文的 base 配置完全一致,证明即使是极小规模的序列,只要数学结构正确,Transformer 同样能够完美收敛。

课后习题

  1. Transformer 架构中的自注意力机制解决了传统循环神经网络在处理长序列时的什么局限?请用你自己的话解释注意力机制的核心思想。

最后更新于