Transformer架构原理

发布于 2025-09-03
更新于 2025-09-04

词向量

计算机不能直接理解文字,自然语言处理(NLP)任务需要将自然语言数学化,词向量就是用来将语言中的词进行数学化的一种方式,顾名思义,词向量就是把一个自然语言词语表示成一个向量。
常见的自然语言编码有独热值编码(One-Hot Representation)和分布式表示(Distributed Representation)编码方法。

最原始的方法是 One-hot 向量:One-Hot Representation 方法,直观易懂,词典 $D$ 的大小为 $N$ ,用一个大小为 $N$ 的向量来表示一个词,在对应词的位置处值为1,其余位置处值为0。 比如词表里有 10,000 个词, “苹果” 可能表示成 [0, 0, 0, ..., 1, ..., 0](只有一个位置是 1)。假设我们的词汇表只有 ["猫", "狗", "跑", "吃"]。“猫”就可以表示为 [1, 0, 0, 0],“狗”表示为 [0, 1, 0, 0],“跑”表示为 [0, 0, 1, 0],“吃”表示为 [0, 0, 0, 1]

这种方法容易受到维度灾难的影响,且难以刻画词与词之间的相关性。如果词汇表有10万个词,每个向量就是10万维,几乎全是0,计算和存储效率极低。从数学上看,所有向量两两之间的点积(相似度)都是0。这意味着计算机认为“猫”和“狗”的相似度,与“猫”和“吃”的相似度完全一样。这显然不符合我们的常识。

Distributed Representation最早是Hinton于1986年提出,原理为:将语言中的每一个词映射为一个固定长度的向量,所有这些向量构成一个词向量空间,每个向量可以被视为这个空间中的一个点,在这个空间中引入“距离”的概念,则可以表达出词语间的相似性。获取这种表达形式的方法之一是word2vec。词向量的维度一般不高。

词向量旨在将词语映射到一个低维、稠密的向量空间中,并且让语义相似的词,在这个空间中的位置也彼此接近Word2Vec的核心思想:如果两个词经常出现在相似的上下文中,它们的向量表示就应该接近

Word2vec是Google研究团队的Tomas Mikolov等人于2013年的《Distributed Representations ofWords and Phrases and their Compositionality》以及后续的《Efficient Estimation of Word Representations in Vector Space》两篇文章中提出的一种高效训练词向量的模型。

Word2Vec是轻量级的神经网络,其模型仅仅包括输入层、隐藏层和输出层,模型框架根据输入输出的不同,包括两种训练方法:CBOW(Continuous Bag of Words)和Skip-Gram。如果是用一个词语作为输入,来预测它周围的上下文,那这个模型为Skip-gram 模型,而如果是拿一个词语的上下文作为输入,来预测这个词语本身,则是 CBOW 模型。通常 Skip-Gram 效果更好。

假设词表大小为 $V$,词向量维度为 $d$。

  1. 每个词有一个向量表示 $v_w \in \mathbb{R}^d$。
  2. 给定中心词 $w_c$,预测上下文词 $w_o$ 的概率:
$$ P(w_o | w_c) = \frac{\exp(v_{w_o} \cdot v_{w_c})}{\sum_{w=1}^V \exp(v_w \cdot v_{w_c})} $$

但是对整个词表做 Softmax 很慢 → 于是用 负采样(Negative Sampling) 来加速,只挑一部分“负样本”更新参数。
训练完成后,每个词都被映射为一个稠密向量(比如 100 维或 300 维),它有很有趣的性质:

  • 语义相似的词距离近:
$$ cos(\text{苹果}, \text{香蕉}) \approx 1 $$
  • 可以做“词向量运算”:
$$ v(\text{国王}) - v(\text{男人}) + v(\text{女人}) \approx v(\text{王后}) $$

总而言之,Word2Vec是一种高效的无监督学习算法,通过分布假说,利用CBOW或Skip-gram架构,并借助负采样技巧,从大规模文本中为词汇生成低维、稠密、语义化的向量表示。Word2Vec 是 NLP 领域的里程碑,是现代 NLP(包括 Transformer)的基础之一,它奠定了“预训练词向量”这一重要范式,直接启发了后来整个“预训练”时代的到来(如 Transformer、BERT、GPT)。

Embedding嵌入表示

在Transformer中,输入文本词token,首先经过embedding(嵌入表示),将文本映射到稠密的低维向量空间。此时通常有两种做法,一种是提前用Word2Vec等方法初始化,获得词向量。另一种方案是随机初始化一个embedding表,然后随同Transformer一起训练,在大语言模型 GPT、BERT 等中,embedding 层参数(词向量矩阵)通常是和 Transformer 一起训练的,这样embedding 会自动学到最适合该任务的表示。

Embedding 就是把离散的词、字符或 token 映射到稠密的低维向量空间。

在 Transformer 中,文本处理的第一步就是 embedding 层

  1. 输入文本先被分词(tokenize),得到词 ID(整数)
  2. 每个 ID 在 embedding 表中查找对应向量。
  3. 形成输入矩阵 $X \in \mathbb{R}^{n \times d_{model}}$,再加上位置编码 (Positional Encoding),送进 Transformer。
$$ X = EmbeddingLookup(\text{token\_ids}) $$

embedding 层本质上是一个 可学习的查找表(词嵌入矩阵)

  • 假设词表大小是 $V$,embedding 维度是 $d_{model}$。
  • embedding 表就是一个 $V \times d_{model}$ 的矩阵。
  • 每个词对应矩阵中的一行。
  • embedding 表在训练开始时会随机初始化,然后和 Transformer 一起训练,不是提前准备好的(除非特意用 Word2Vec/GloVe 来初始化)。在训练过程中,这个矩阵会像普通神经网络参数一样被更新,逐渐学习到词之间的语义关系。

Transformer 中除了单词的Embedding,还需要使用位置Embedding 表示单词出现在句子中的位置。因为 Transformer没有循环或卷积结构,无法直接捕捉序列的顺序信息,而这部分信息对于NLP来说非常重要。所以Transformer中使用位置Embedding保存单词在序列中的相对或绝对位置。

位置Embedding用$PE$表示(Positional Encoding),位置编码的维度与单词Embedding相同,通常由公式计算得到。原论文采用固定正弦/余弦函数生成位置编码(也可采用可学习的位置嵌入):
对于位置 $pos$(从 0 到 $n-1$)和维度 $i$(从 0 到 $d_{\text{model}}/2-1$):

$$ PE(pos, 2i) = \sin\left( \frac{pos}{10000^{2i/d_{\text{model}}}} \right) $$
$$ PE(pos, 2i+1) = \cos\left( \frac{pos}{10000^{2i/d_{\text{model}}}} \right) $$

($d_{\text{model}}$ 是模型总维度,通常为 512)

常见的将输入矩阵 $X$和位置编码$PE$组合起来的方式有两种:直接相加和拼接方法。直接相加是最常见的方法,计算公式为:

$$ Z = X + PE $$

其中$X$是embedding 矩阵(每个词的向量),$PE$是位置编码矩阵(每个位置一个向量),将它们逐元素相加,得到带位置信息的输入。 少数案例中会使用拼接法,把 embedding 和位置编码拼接在一起,比如:

$$ Z = [X \| PE] $$

然后再投影到 $d_{model}$ 维度。

这个 $Z$ 就是 Transformer 第一层的输入。

注意力机制

这个世界并不均衡,有轻、重、缓、急,高、低、贵、贱之分,注意力机制(Attention Mechanism)就是对信息的不同部分进行加权,动态地调整对不同信息部分的关注程度。注意力机制的本质就是对输入的不同部分赋予不同的权重。

缩放点积注意力

注意力机制通常以 Query(查询)、Key(键)和 Value(值)三组向量作为输入,计算出一个加权求和结果作为输出。注意力公式形式有多种,Transformer中常用的缩放点积(Scaled Dot Product Attention)注意力计算公式为:

$$ Attention(Q, K, V) = softmax\left(\frac{QK^T}{\sqrt{d_k}}\right)V $$

该方法通过缩放操作防止内积结果过大,提升数值稳定性,是 Transformer 模型中的默认选择。
Transformer 里,Q、K、V 都是 通过线性变换(矩阵乘法) 从从输入 $X \in \mathbb{R}^{n \times d_{model}}$ 中计算得到的:

$$ X = [x_1, x_2, x_3, ...] \quad (\text{形状:} n \times d_{model}) \\ Q = XW^Q, \quad K = XW^K, \quad V = XW^V $$
  • $W^Q, W^K, W^V$ 是三组 可学习参数矩阵(类似神经网络的权重)。
  • 输入 $X$ 一样,但通过不同的参数矩阵,得到三个不同的表示。

$W^Q, W^K, W^V \in \mathbb{R}^{d_{model} \times d_k}$ 是三组可学习的参数矩阵,类似于神经网络中的权重概念,随同整个网络一起被训练,从而获得最合适的值。开始训练时,参数会被随机初始化,训练过程中通过损失函数来调整这些矩阵。

多头注意力

Transformer中使用的注意力机制为多头注意力 (Multi-Head Attention, MHA)机制,“多头” 的本质是将 Q、K、V 拆分为 h 组(论文中 h=8),每组独立计算 “单头注意力”,最后将 h 组结果拼接并通过线性层输出。具体步骤为:

  1. 线性投影:将 Q、K、V 分别通过 3 个线性层,拆分为 h 组(每组维度从 d_model=512 降至 d_k=64,即 512=8×64);
  2. 并行计算:h 组 Q、K、V 分别计算 “单头注意力”;
  3. 拼接(Concat):将 h 组注意力结果拼接成一个大矩阵(维度回到 512); 线性输出:通过一个线性层,得到多头注意力的最终结果。
  4. 单头注意力只能捕捉一种依赖关系,而多头可以并行捕捉 “语法依赖”(如主谓宾)、“语义依赖”(如同义词)等多维度关联,让上下文向量更全面。

多头注意力的数学描述为:
输入矩阵 $X \in \mathbb{R}^{L \times d_{model}}$,其中$L$为序列长度,$d_{model}$为模型维度(比如 512, 768 等)原论文中多头注意力头数:$h = 8$,首先做线性投影

$$ Q_i = X W_i^Q, \quad K_i = X W_i^K, \quad V_i = X W_i^V $$

其中$W_i^Q, W_i^K, W_i^V \in \mathbb{R}^{d_{model} \times d_k}$,一般情况下 $d_k = d_{model} / h$,每个头的输入维度为$L \times d_k$,对每个头计算点积注意力,、Softmax、加权 V ,输出 $L \times d_k$

每组 Q、K、V 独立计算自注意力,得到 $h$ 个输出矩阵 $Z_i \in \mathbb{R}^{n \times d_k}$:

$$ \text{head}_i = \text{Attention}(Q_i, K_i, V_i) \\ \text{Attention}(Q_i, K_i, V_i) = \text{Softmax}\left( \frac{Q_i K_i^T}{\sqrt{d_k}} \right) V_i \\ H_{Concat} = \text{Concat}(\text{head}_1, \text{head}_2, \dots, \text{head}_h) \\ \text{MultiHead}(Q,K,V) = H_{Concat} W^O, W^O \in \mathbb{R}^{(h \cdot d_k) \times d_{\text{model}}} $$

经过线性层投影的目的是融合各维度信息,这里的线性层投影矩阵 $W^O \in \mathbb{R}^{(h \cdot d_k) \times d_{\text{model}}}$也是先随机初始化,再随同网络一起训练得到的。

Transformer架构

架构原理

Transformer 模型由 Vaswani 等人于 2017 年在论文《Attention is All You Need》中提出,开创了完全基于注意力机制进行序列建模的新时代。与传统基于循环神经网络(RNN)或卷积神经网络(CNN)的方法不同,Transformer 完全摒弃了递归结构,而是通过多层堆叠的自注意力机制来捕捉序列中任意位置之间的依赖关系,极大提高了模型的训练效率和性能。

Transformer是一种Encoder-Decoder(编码器 - 解码器)架构(部分衍生模型如 GPT 仅用 Decoder,BERT 仅用 Encoder),整体结构围绕 “如何让模型捕捉序列中元素的依赖关系” 展开。Transformer 的基本结构包括两个主要模块:编码器(Encoder)和解码器(Decoder),整个模型由多个编码器和解码器堆叠形成,每个编码器包含的子结构为:

输入 → 多头自注意力(残差+层归一化) → 前馈网络(残差+层归一化) → 输出(传递给下一个编码器层)

  • 多头自注意力机制(Multi-Head Self-Attention)
  • 前馈神经网络(Feed Forward Network, FFN)
  • 残差连接(Residual Connection)与层归一化(Layer Normalization)

解码器包含的结构为:

输入(目标前缀) → 掩蔽多头自注意力(残差+层归一化) → 编码器-解码器注意力(残差+层归一化) → 前馈网络(残差+层归一化) → 输出(传递给下一个解码器层,最终生成完整目标序列)

  • Masked 多头自注意力(Masked Multi-Head Self-Attention):防止模型在生成下一个词时看到未来的信息;
    *交叉注意力(Cross-Attention):将当前解码器的 Query 与编码器的 Key 和 Value 进行注意力计算;
  • 前馈神经网络 + 残差连接 + 层归一化

前馈神经网络

编码器中前馈神经网络(FFN)是对多头注意力的输出进行非线性变换,在原论文中使用的结构为:

$$ \text{FFN}(X) = \max(0, X W_1 + b_1) W_2 + b_2 $$

前馈神经网络的输入为多头自注意力的输出(维度 $d_{\text{model}}$),隐藏层维度通常为 $4d_{\text{model}}$(原论文设置),使用 ReLU 激活函数,输出映射回 $d_{\text{model}}$ 维度,与输入维度一致,保证残差连接可行。

残差连接与层归一化

前馈神经网络的输出会被添加残差连接 + 层归一化(Residual Connection + LayerNorm)。残差连接是将子层的输入X与子层的输出sub_layer(x) 相加,($x + sub_layer(x)$),用以缓解深度模型的 “梯度消失” 问题(让梯度能直接通过残差路径回传,梯度消失问题可以参考梯度消失与梯度爆炸问题),层归一化是对相加后的向量进行归一化,使得均值接近0,方差接近1,使得训练更加稳定,更容易收敛:

$$ \text{Output}_{\text{sublayer}} = \text{LayerNorm}(X + \text{Sublayer}(X)) $$

原始论文是 “后归一化”(子层输出 + 残差 → 层归一化),但后续实践中 “预归一化”(层归一化 → 子层 → 残差)更常用。

掩码多头自注意力

在解码器中,掩码多头注意力(Masked Multi-Head Attention)是 Decoder 特有的 “自注意力”,核心是添加了 “未来掩码(Future Mask)”——遮挡当前位置之后的所有元素,避免模型在生成第 i 个元素时 “偷看” 到第 i+1、i+2... 个元素(作弊)。掩码的实现方式:在 “缩放点积” 后,对 “未来位置” 的元素赋值为 -∞,Softmax 后这些位置的概率会趋近于 0,相当于被忽略。

解码器层的输入是上一层的输出(初始为目标序列的前缀嵌入+位置编码),假设输入为$Y \in \mathbb{R}^{m \times d_{\text{model}}}$($m$ 为目标序列当前长度),构造一个下三角矩阵 $M \in \mathbb{R}^{m \times m}$,其中对角线及以下元素为 0,上方元素为 $-\infty$(Softmax 后权重趋近于 0):

$$ M_{i,j} = \begin{cases} 0 & \text{若 } i \geq j \\ -\infty & \text{若 } i < j \end{cases} $$

计算多头自注意力时,与编码器的自注意力类似,但对 Q、K、V 计算注意力分数后,先与掩码相加,再 Softmax:

$$ \text{Masked Attention}(Q,K,V) = \text{Softmax}\left( \frac{Q K^T}{\sqrt{d_k}} + M \right) V $$

这样就能强制模型在生成当前词时,屏蔽未来信息,仅关注已生成的前缀,避免“未卜先知”。

编码器-解码器注意力

编码器-解码器注意力(Encoder-Decoder Attention),注意力计算​方式与编码器的自注意力逻辑相同,但 Q 来自解码器,K、V 来自编码器。
其中Query(Q)来自解码器上一层的输出(掩蔽自注意力的输出),Key(K)和 Value(V)来自编码器的最终输出(编码器所有层的输出拼接后)

$$ \text{Attention}(Q,K,V) = \text{Softmax}\left( \frac{Q K^T}{\sqrt{d_k}} \right) V $$

下面的数据流图清晰展示了Transformer的架构

数据流图数据流图