Transformer Encoder 与 Decoder:从结构到功能的深度解析
在自然语言处理(NLP)领域,Transformer 架构自2017年提出以来,彻底改变了序列建模的范式。无论是机器翻译、文本生成,还是情感分析、问答系统,Transformer 都展现出了强大的泛化能力。而 Transformer 的核心设计,正是将模型分为 Encoder(编码器) 和 Decoder(解码器) 两个部分。本文将从结构、功能和实际应用出发,深入解析两者的区别与联系。
一、Transformer 的整体架构:Encoder 与 Decoder 的分工
Transformer 的整体架构由 堆叠的 Encoder 层 和 堆叠的 Decoder 层 组成(通常各包含6层)。输入数据首先经过词嵌入(Embedding)和位置编码(Positional Encoding)后输入 Encoder,Encoder 输出的上下文表示会传递给 Decoder;Decoder 则基于这些表示,逐词生成目标序列的输出。
简单来说:
- Encoder 的核心任务:将输入序列(如一段英文文本)编码为富含语义的“上下文向量”,捕捉输入内部的依赖关系(例如词语间的指代、语法结构)。
- Decoder 的核心任务:根据 Encoder 输出的上下文表示,自回归地生成目标序列(如对应的中文翻译),确保生成的每个 token 符合已生成的前缀和输入信息。
二、结构差异:从层组件看功能分化
1. Encoder 的结构:“双向理解者”
Encoder 由多个相同的层堆叠而成,每层包含两个核心子层:
-
多头自注意力层(Multi-Head Self-Attention):
自注意力机制允许模型在处理每个位置的 token 时,动态关注输入序列中的其他所有位置,从而捕捉全局依赖关系。例如,在句子“猫坐在垫子上,它很舒服”中,“它”会被自动关联到“猫”。
关键特点:双向处理——每个位置的 token 可以同时关注其左侧和右侧的所有信息(因为注意力权重是全局计算的)。 -
前馈神经网络(Feed Forward Network, FFN):
对自注意力层的输出进行非线性变换,增强模型的表达能力。FFN 通常由两层全连接层和激活函数(如 ReLU)组成,作用于每个位置独立计算(即对序列中的每个 token 单独处理)。
此外,每个子层后都会应用 残差连接(Residual Connection) 和 层归一化(Layer Normalization),缓解深层网络的梯度消失问题,加速训练。
2. Decoder 的结构:“自回归生成者”
Decoder 同样由多个相同的层堆叠而成,但每层包含三个核心子层(比 Encoder 多一个):
-
掩码多头自注意力层(Masked Multi-Head Self-Attention):
与 Encoder 的自注意力类似,但增加了 掩码(Mask) 操作。掩码的作用是屏蔽当前位置之后的 token(例如,生成第 t 个 token 时,只能关注前 t-1 个已生成的 token),确保模型“只能看到过去的信息”,符合自回归生成的逻辑(即“未卜先知”是不允许的)。
关键特点:单向处理——注意力权重仅基于已生成的前缀序列计算。 -
编码器-解码器注意力层(Encoder-Decoder Attention):
这是 Decoder 区别于 Encoder 的核心组件。其查询(Query)来自当前 Decoder 层的自注意力输出,而键(Key)和值(Value)来自 Encoder 最终的输出。通过这种注意力机制,Decoder 在生成每个 token 时,可以动态“聚焦”于输入序列中最相关的部分。例如,在机器翻译中,生成目标词的“苹果”时,模型会通过此注意力层定位到输入中的“apple”。 -
前馈神经网络(FFN):
结构与 Encoder 中的 FFN 完全相同,同样作用于每个位置独立计算。
同样,Decoder 的每个子层后也包含残差连接和层归一化。
三、注意力机制:双向 vs 单向的“信息聚焦”
注意力机制是 Transformer 的灵魂,而 Encoder 与 Decoder 在注意力设计上的差异,直接决定了它们的功能边界。
1. Encoder 的自注意力:全局双向的“理解”
Encoder 的自注意力允许每个 token 与输入序列中的所有其他 token 交互(包括自身和前后位置)。这种双向性使得 Encoder 能够充分捕捉输入序列的全局语义,例如长距离依赖(如“他说:‘明天会下雨’,所以……”中的因果关系)。因此,Encoder 更适合处理需要“理解”输入的任务(如文本分类、命名实体识别)。
2. Decoder 的自注意力:单向掩码的“预测”
Decoder 的自注意力通过掩码(通常是下三角矩阵)屏蔽了未来的 token,确保模型在生成第 t 个位置时,只能依赖前 t-1 个位置的信息。这种单向性模拟了人类“逐词生成”的过程(例如写作文时,只能根据已写的内容决定下一句)。因此,Decoder 更适合处理需要“生成”序列的任务(如机器翻译、文本摘要、对话系统)。
3. 编码器-解码器注意力:跨序列的“对齐”
Decoder 中的编码器-解码器注意力是连接 Encoder 和 Decoder 的桥梁。它让 Decoder 在生成每个 token 时,能够“查询”Encoder 输出的输入序列表示,从而动态对齐输入和输出的关键信息。例如,在翻译“我爱你”为“I love you”时,生成“love”时,模型会通过此注意力层聚焦到输入中的“爱”。
四、输入输出:从静态表示到动态生成
1. Encoder 的输入与输出
- 输入:原始序列的词嵌入(Token Embedding) + 位置编码(Positional Encoding)。位置编码的作用是为模型注入序列的顺序信息(因为 Transformer 本身不感知序列顺序)。
- 输出:每个位置的上下文表示(Contextualized Representation),形状通常为
[序列长度, 隐藏层维度]
。这些表示融合了输入序列的全局语义,可直接用于下游任务(如分类)或传递给 Decoder。
2. Decoder 的输入与输出
- 输入(训练阶段):目标序列的前缀(例如,生成“我 爱 你”时,输入可能是“我 爱 [MASK]”),同样需要词嵌入和位置编码。训练时使用“教师强制”(Teacher Forcing),即直接输入完整的目标序列前缀(而非逐步生成)。
- 输入(推理阶段):已生成的目标序列前缀(例如,已生成“我 爱”),需要动态拼接并添加位置编码。
- 输出:每个位置的词汇表概率分布(通过线性层和 Softmax 计算),用于预测下一个 token。
五、应用场景:Encoder 与 Decoder 的典型分工
尽管 Transformer 支持灵活的组合方式(如纯 Encoder、纯 Decoder 或 Encoder-Decoder),但实际应用中,两者的分工依然清晰:
1. Encoder 的主场:理解型任务
- 文本分类(如情感分析):Encoder 提取输入文本的语义表示,通过分类头(全连接层)预测情感倾向。
- 命名实体识别(NER):Encoder 捕捉文本中的实体边界和类型信息,通过序列标注头输出每个 token 的标签。
- 问答系统(QA):Encoder 编码问题和上下文,通过起始-结束位置预测头定位答案区间。
典型模型:BERT、RoBERTa、ALBERT(均为纯 Encoder 架构)。
2. Decoder 的主场:生成型任务
- 机器翻译(如英→中):Decoder 基于 Encoder 编码的源语言序列,逐词生成目标语言序列。
- 文本生成(如故事创作、代码生成):Decoder 基于初始提示(Prompt),自回归生成连贯的文本。
- 对话系统:Decoder 根据对话历史(Encoder 编码)和当前问题,生成符合语境的回复。
典型模型:GPT-3/4、LLaMA(均为纯 Decoder 架构,采用掩码自注意力实现自回归)。
3. Encoder-Decoder 的协同:序列到序列(Seq2Seq)任务
当任务需要同时“理解输入”和“生成输出”时(如机器翻译、摘要生成),Encoder 和 Decoder 会协同工作:
- Encoder 处理输入序列,输出上下文表示;
- Decoder 结合上下文表示和已生成的前缀,逐步生成目标序列。
典型模型:原始 Transformer、T5、BART。
六、总结:差异背后的设计哲学
Encoder 与 Decoder 的核心区别,本质上源于它们的功能目标:
- Encoder 是“理解者”,通过双向自注意力捕捉输入的全局语义,擅长处理需要深度理解的任务;
- Decoder 是“生成者”,通过掩码自注意力和编码器-解码器注意力,实现自回归生成,擅长处理需要序列创造的任务。
这种分工并非绝对——例如,纯 Decoder 模型(如 GPT)通过掩码自注意力和大规模数据预训练,也能间接实现“理解”能力;而 Encoder 模型(如 BERT)通过微调也能完成轻量级生成任务(如填空)。但从原始 Transformer 的设计逻辑看,Encoder 和 Decoder 的结构差异,正是为了高效解决“理解”与“生成”这两大自然语言处理的核心问题。
理解两者的区别,不仅能帮助我们更高效地选择模型(如用 BERT 做分类、用 GPT 写文案),更能深入把握 Transformer 架构的设计精髓——通过模块化的组件分工,将复杂的语言任务拆解为可解释、可扩展的子问题。