讲讲Transformer的整体Encoder-Decoder架构流程
Transformer 的 Encoder-Decoder(编码器-解码器)架构是现代大语言模型(如 GPT、BERT、T5)的基石。要理解它的流程,我们可以把它想象成一个“阅读理解并翻译”的过程:Encoder 负责通读全文、深度理解并提取上下文特征;Decoder 负责根据 Encoder 提取的特征,结合已经生成的内容,逐字逐句地写出目标输出。
下面我将以机器翻译(例如:中文“我爱你”翻译成英文“I love you”)为例,拆解 Transformer 整体架构的数据流转流程。
第一阶段:输入处理阶段(Input Processing)
在数据真正进入 Encoder 或 Decoder 之前,必须先经过两步处理:
- 词嵌入(Word Embedding):
计算机看不懂文字,所以要把“我”、“爱”、“你”转化成固定维度的数学向量(比如 512 维)。 - 位置编码(Positional Encoding):
RNN 是按顺序一个词一个词处理的,天然知道先后顺序。但 Transformer 是“一眼看全句”(并行处理)的,这就导致它不知道词的先后顺序。为了解决这个问题,加入了位置编码(通常基于正弦/余弦函数),加到词向量上,告诉模型“这个词在句子中的什么位置”。
此时的数据: 带有位置信息的词向量矩阵。
第二阶段:Encoder 编码阶段(“深入理解”源语言)
Encoder 的任务是提取输入句子的全部上下文信息。Transformer 中通常有 个(原论文为 6 个)完全相同的 Encoder 层堆叠而成。每个 Encoder 层内部有两个主要子层:
- 多头自注意力层(Multi-Head Self-Attention):
- 作用: 让句子中的每个词都去“看”句子中的其他词,寻找关联。
- 原理: 计算每个词的 Query(Q)、Key(K)、Value(V)。在处理“爱”这个词时,模型会计算它和“我”、“你”的关联度(Attention Score),从而知道这里的“爱”是一个动词,且主语是“我”,宾语是“你”。
- 残差连接与层归一化(Add & Norm):
- 将注意力层的输入和输出相加(防止网络太深导致梯度消失),然后进行标准化(让数据分布更稳定,加速训练)。
- 前馈神经网络层(Feed Forward Network, FFN):
- 对自注意力层提取到的特征进行非线性变换,进一步增强模型的表达能力。同样,之后也会接一个 Add & Norm。
Encoder 的最终输出: 经过 层处理后,我们得到了一组包含全局上下文信息的特征向量矩阵(我们通常称之为 Memory 或 Context)。这个矩阵将作为后续 Decoder 的重要输入。
第三阶段:Decoder 解码阶段(“逐字生成”目标语言)
Decoder 的任务是根据 Encoder 的输出和当前已经生成的词,预测下一个词。它也是由 层堆叠而成,但比 Encoder 多了一个关键模块。每个 Decoder 层有三个子层:
解码过程是“自回归(Auto-regressive)”的,即预测第 个词时,只能看到前 个词。
掩码多头自注意力层(Masked Multi-Head Self-Attention):
- 作用: 结合已经生成的词,理解当前生成句子的语法和语义。
- “掩码(Masked)”的作用: 因为在训练时,我们会把整个目标句子(如 "I love you")一次性喂给 Decoder,但为了防止模型“偷看”未来的标准答案,我们用一个矩阵把未来的词遮挡住(Mask)。比如在预测 "love" 时,模型只能看到
<起始符>和 "I",看不到 "you"。 - 之后接 Add & Norm。
交叉注意力层(Cross-Attention / Encoder-Decoder Attention):
- 作用: 这是 Encoder 和 Decoder 沟通的唯一桥梁。Decoder 在这里“回头看”源语言句子,寻找翻译当前词需要的关键信息。
- 原理: 此时的 Query (Q) 来自于前一个 Decoder 子层(代表“我现在正在生成的词的特征”);而 Key (K) 和 Value (V) 来自于 Encoder 的最终输出(代表“整个源句子的上下文信息”)。
- 例子: 当 Decoder 准备生成 "love" 时,它的 Q 会去和 Encoder 里的 K 匹配,发现源句子中“爱”这个词的权重最高,于是把“爱”的 V 提取过来。
- 之后接 Add & Norm。
前馈神经网络层(Feed Forward Network):
- 与 Encoder 中一样,进行特征转换。
- 之后接 Add & Norm。
第四阶段:输出预测阶段(Output)
当 Decoder 处理完上述流程后,会输出一个向量,但这还不是最终的词。
- 线性映射层(Linear Layer):
将 Decoder 最后一层的输出向量映射到“词表大小”的维度(比如你的词表有 50,000 个英文单词,就会映射成一个 50,000 维的向量)。 - Softmax 层:
将这个 50,000 维的向量转化为概率分布(所有数值相加等于 1)。 - 选择词语:
概率最高的那个维度对应的单词,就是模型预测的下一个词(比如 "love" 这个词的概率是 0.95,就输出 "love")。
整体动态流程串联(以推理阶段为例)
- 输入源句: 把 "我 爱 你" 喂给 Encoder。
- 提取特征: Encoder 并行计算,输出包含中文完整含义的特征矩阵 。
- 开始解码:
- Step 1: 给 Decoder 输入特殊的起始符号
<SOS>(Start of Sentence)。Decoder 结合 ,输出第一个单词 "I"。 - Step 2: 给 Decoder 输入
<SOS> I。Decoder 结合 ,输出第二个单词 "love"。 - Step 3: 给 Decoder 输入
<SOS> I love。Decoder 结合 ,输出第三个单词 "you"。 - Step 4: 给 Decoder 输入
<SOS> I love you。Decoder 结合 ,输出结束符号<EOS>(End of Sentence)。
- Step 1: 给 Decoder 输入特殊的起始符号
- 生成结束: 流程停止,最终输出 "I love you"。
总结
- Encoder = 阅读全文 -> 提取关键特征 (自注意力)
- Decoder = 看着已写的内容 (掩码自注意力) + 回顾原文特征 (交叉注意力) -> 预测下一个词。
这种架构巧妙地利用了并行计算(训练速度快)和注意力机制(解决长距离依赖问题),彻底淘汰了过去的 RNN 模型,开启了大模型时代。