Transformer架构看起来可能有点复杂,网上虽然有不少教程,但本文将通过一个完整的数学实例,一步一步拆解其核心原理。话不多说,直接进入主题。

输入数据与位置编码计算
从最基础的部分开始:先确定输入数据,然后计算每个单词的位置编码。这一步是整个处理流程的起点。

第一步:定义数据集
首先构建一个小的语料库(数据集)。

这个数据集包含三个句子,全部来自《权力的游戏》——虽然规模很小,但足以帮助我们理解后面涉及的所有数学公式。
第二步:统计词汇量
要确定词汇量,需要先统计数据集里一共有多少个不重复的单词。这是将文本转换为数字编码的前提步骤。


将所有单词整理成一个列表,每个单词作为一个 token。把数据集拆分为 token 列表,记为 N。


得到 token 列表 N 之后,就可以用公式计算词汇量。原理如下:


通过 set 操作去除重复项,再统计唯一单词的数量。最终词汇量为 23——因为列表里共有 23 个不同的单词。
第三步:编码与嵌入向量
接下来为每个不重复的单词分配一个唯一的整数编号。


完成整个数据集的编码后,选取一个句子作为输入实例。这里从语料库中挑选:“When you play game of thrones”。


每个输入单词用一个编码表示,每个整数对应一个嵌入向量。嵌入向量可以通过 Google Word2vec 等工具生成,不过在本例中,我们直接用 0 到 1 之间的随机数填充。


原始论文中嵌入向量的维度是 512,这里为了计算方便,将维度压缩到 5。


每个单词的嵌入向量都是 5 维的,使用 Excel 的 RAND() 函数填充随机数。
第四步:位置嵌入计算
先看第一个单词 "when",计算它的位置嵌入向量。位置嵌入使用两个公式:

"when" 的 pos 值为 0(序列起始位置)。i 的值决定使用哪个公式(偶数或奇数)。维度为 5,即嵌入向量的长度。


接着给下一个单词 "you" 赋值 pos=1,后续单词依次递增。


算出位置嵌入后,将其与原始单词嵌入相加:


得到的结果向量依次为 e1+p1、e2+p2、e3+p3…… 以此类推。


Transformer 架构第一部分的输出,就是接下来编码器的输入。
编码器详解
在编码器内部,需要执行 Query、Key、Value 矩阵的复杂运算——正是这些操作将输入数据转换为有意义的表示形式。


多头注意力机制内部,单个注意力层由几个关键组件构成:


注意,黄色框代表的是单头注意力。多个黄色框叠加起来就形成了多头注意力。这里为了演示,只考虑单头注意力,如上图所示。
第一步:执行单头注意力
注意力层有三个输入:Query、Key、Value。


上图中的三个粉色输入矩阵,实际上是上一步得到的“单词嵌入+位置嵌入”矩阵的转置。而黄色、蓝色、红色的线性权重矩阵,就是注意力机制中用到的权重。这些矩阵的列数可以任意,但行数必须与输入矩阵的列数一致。这里我们假设这些线性矩阵包含随机权重(实际训练时它们会随机初始化,然后通过反向传播、梯度下降等方法调整)。接下来计算 Query、Key、Value 矩阵:


有了 Query、Key、Value 矩阵之后,继续执行矩阵乘法:






现在,将结果矩阵与之前算出的 Value 矩阵相乘:


如果有多头注意力,每个头都会生成一个 6×3 的矩阵,接下来将它们拼接起来。


最后一步,对拼接后的矩阵再做一次线性变换——与之前生成 Query、Key、Value 矩阵的过程类似。


