definition
- input a sequence
- output a sequence
- the model itself determines the output length
application
- speech recognition
- machine translation
- speech translation
- text-to-speech synthesis
- chatbot
- most NLP applications -> QA -> seq2seq
编码器(Encoder)
功能定义
将输入数据(如句子、图像)转换为隐空间表示(Latent Representation)。Encoder的目标是为每个输入位置生成增强表示,因此输出长度自然等于输入长度。
- 在Transformer Encoder中,“隐空间表示”(latent representation / hidden states)是一个宽泛概念,指代编码器每一层处理后的中间状态;而“增强序列表示”(Enhanced Sequence Representation / contextualized embeddings)特指经过所有编码层处理后的最终输出,具备全局上下文信息。
- 隐空间表示包括:
- word embedding:将离散的词语映射为连续向量,用于解决符号鸿沟(Symbolic Gap),将文本转化为数值形式,以及捕捉浅层语义(如相似词向量接近:“dog”与“cat”)。
- 位置编码:添加位置信息(如正弦函数或学习式编码)。
- 自注意力机制:动态关联序列内所有位置的上下文,让每个输入元素(如单词)根据全局关系调整自身表示。例如在句子"他打开了银行账户"中,"银行"会根据上下文决定指向金融机构而非河岸。
- 前馈网络:非线性变换增强特征表达能力。
- 残差连接与层归一化:稳定训练过程。
为什么需要encoder
(1) 解耦输入解析与输出生成
-
任务分工:
- Encoder:专注理解输入(如提取语义、语法、逻辑关系)。
- Decoder:专注生成目标(如遵循目标语言规则、图像生成规律)。
-
类比:
人类翻译时,先理解原文含义(Encoder),再用地道目标语言表达(Decoder)。若直接逐词映射(如“字面翻译”),会丧失流畅性与准确性。
(2) 信息压缩与噪声过滤
-
必要性:
原始输入(如文本、图像)包含大量冗余信息(如背景噪声、语法虚词)。Encoder通过多层变换:- 降维:将高维稀疏输入(如One-Hot编码)压缩为低维稠密向量。
- 去噪:过滤无关细节(如文本中的拼写变体、图像中的光照变化)。
-
示例:
图像描述生成任务中,Encoder需从像素中提取“猫坐在垫子上”的语义,而非保留每个像素的RGB值。
(3) 建模全局依赖关系
-
直接映射的缺陷:
若跳过Encoder,模型需在生成输出的同时实时解析输入,难以捕捉长距离依赖(如指代消解、逻辑推理)。长距离依赖指序列中相隔较远的元素之间的语义或逻辑关联(如代词指代、因果推理),例如:- 指代消解:句子
"The cat sat on the mat because it was tired."
中,"it"
指代"cat"
(距离4个词)。 - 逻辑推理:段落中首句提出观点,末句给出结论,需跨多句关联。
若模型无Encoder,需在生成目标序列的每一步(如逐词生成翻译结果)同时完成以下任务,这种“实时解析+生成”模式会导致注意力分散,难以有效捕捉远距离依赖。
- 解析输入:理解当前输入位置的含义。
- 关联历史:维护已生成输出的状态(如避免重复或矛盾)。
- 预测未来:决定后续生成内容。
- 指代消解:句子
-
Encoder的核心能力:
通过自注意力机制(Self-Attention)显式建模序列内所有位置的关联:# 输入:"The animal didn't cross the street because it was too tired." # Encoder增强表示中,"it"的向量关联到"animal"而非"street"。
(4) 支持多任务与迁移学习
-
统一表示空间:
Encoder输出的增强序列表示可作为跨任务的通用语义接口:- 多任务示例:同一Encoder表示可用于翻译、摘要、情感分析。
- 迁移学习:预训练Encoder(如BERT)的表示可微调适配下游任务,减少数据需求。
-
直接映射的局限:
输入到输出的端到端映射高度任务特定,难以复用(如翻译模型无法直接用于摘要)。
(5) 处理输入与输出的模态/结构差异
-
模态对齐:
Encoder-Decoder架构通过增强表示统一不同模态的语义空间:-
跨模态案例:
- 视觉-语言任务(VQA)中,图像Encoder输出与文本Encoder表示在隐空间对齐。
- 语音识别中,声学Encoder将音频信号映射到与文本Encoder相同的语义空间。
-
-
结构灵活性:
Encoder可处理变长输入,Decoder可生成变长输出,二者通过增强表示解耦长度约束。
Encoder架构详解
1. 输入处理:词嵌入(Word Embedding)与位置编码(Positional Encoding)
设计逻辑:
-
词嵌入:将离散的词语映射为连续向量,解决符号鸿沟问题,捕捉浅层语义关联。
- 示例:
"cat" → [0.2, -0.5, 0.7]
,"dog" → [0.3, -0.4, 0.6]
(语义相近则向量相似)。
- 示例:
-
位置编码:引入词序信息,弥补自注意力机制对位置不敏感的缺陷。
- 方法:使用正弦函数或可学习参数生成位置向量,与词嵌入相加。
- 公式:PE(pos,2i)=sin(100002i/dmodelpos),PE(pos,2i+1)=cos(100002i/dmodelpos)
为什么重要:
- 自注意力机制本身无法区分序列顺序(如
"A→B"
与"B→A"
的差异),位置编码显式注入顺序信息。
2. 多头自注意力机制(Multi-Head Self-Attention)
设计逻辑:
-
核心思想:通过多组注意力头(Attention Heads)从不同子空间捕捉多样化的语义关联。
-
步骤:
- 线性投影:将输入向量分别映射为多组查询(Query)、键(Key)、值(Value)。
- 并行计算:每组头独立计算注意力权重,关注不同粒度的特征(如语法、语义、共现关系)。
- 拼接输出:将多头结果拼接后线性变换为最终输出。
-
公式:MultiHead(Q,K,V)=Concat(head1,...,headh)WOheadi=Attention(QWiQ,KWiK,VWiV)
-
为什么重要:
- 多视角建模:不同头关注不同模式(如一个头捕捉局部依赖,另一个头捕捉长程关联)。
- 扩展容量:多头设计提升模型对不同类型关系的区分能力。
3. 残差连接(Residual Connection)与层归一化(Layer Normalization)
设计逻辑:
-
残差连接:将模块输入直接加到输出上,缓解梯度消失问题,支持深层网络训练。
- 公式:
Output = LayerNorm(x + Sublayer(x))
- 公式:
-
层归一化:对每个样本的特征维度进行归一化,稳定训练过程。
- 与批归一化的区别:不依赖批量大小,更适合变长序列任务。
为什么重要:
- 梯度流动:残差连接确保深层网络中梯度能有效回传(如ResNet的成功经验)。
- 训练稳定性:归一化减少内部协变量偏移(Internal Covariate Shift),加速收敛。
4. 前馈神经网络(Feed-Forward Network, FFN)
设计逻辑:
-
结构:两层全连接层,中间引入非线性激活函数(如ReLU)。
- 公式:FFN(x)=max(0,xW1+b1)W2+b2
- 参数示例:输入维度512 → 扩展为2048 → 压缩回512。
-
作用:对注意力输出进行非线性变换,增强模型表达能力。
为什么重要:
- 特征增强:注意力机制主要建模交互关系,FFN负责提炼高阶语义。
- 跨位置一致性:每个位置的FFN独立应用,保持位置间独立性。
5. 堆叠多层(Layer Stacking)
设计逻辑:
-
深层架构:通过堆叠多个相同层(如BERT-base为12层),逐步抽象特征。
-
层级分工:
- 底层:捕捉局部语法(如词性、短语结构)。
- 中层:建模句法关系(如主谓一致、修饰关系)。
- 高层:提取全局语义(如指代消解、逻辑推理)。
-
解码器(Decoder)
与Encoder的核心目标差异
-
Encoder:
- 目标:将输入序列(如源语言句子、图像像素)转换为上下文感知的中间表示(即增强序列表示)。
- 关键任务:全面理解输入内容,捕捉全局依赖关系(如语法结构、语义关联)。
-
Decoder:
- 目标:基于Encoder的中间表示,逐步生成目标序列(如翻译结果、图像描述)。
- 关键任务:按特定规则(如语言语法、生成逻辑)输出序列,需避免未来信息泄露(自回归生成)。
输入
1. 训练阶段
-
输入内容:
- 目标序列右移一位(Right-Shifted Targets),并添加起始符(如
<SOS>
)。 - 示例:
真实目标序列为["A", "B", "C", "<EOS>"]
→ 输入Decoder的序列为["<SOS>", "A", "B", "C"]
。
- 目标序列右移一位(Right-Shifted Targets),并添加起始符(如
-
设计逻辑:
- Teacher Forcing机制:训练时使用真实目标序列作为输入,强制模型基于历史正确词预测下一个词。一方面,避免模型在早期训练阶段因生成错误词而陷入恶性循环。另一方面,提供稳定的梯度信号,加速收敛。
- 避免信息泄露:右移确保模型在预测位置
t
时,仅能看到位置0
到t-1
的词,模拟推理时的自回归生成过程。
-
输入形式:
- 嵌入向量:将右移后的目标序列转换为词嵌入向量。
- 位置编码:添加位置信息,使模型感知生成顺序。
2. 推理阶段
-
输入内容:
- 自回归生成:从起始符
<SOS>
开始,逐步生成每个词,每一步将新生成的词追加到输入序列。 - 示例:
第1步输入["<SOS>"]
→ 生成"A"
;
第2步输入["<SOS>", "A"]
→ 生成"B"
;
第3步输入["<SOS>", "A", "B"]
→ 生成"C"
,直到输出<EOS>
。
- 自回归生成:从起始符
-
设计逻辑:
- 无真实标签依赖:推理时无法获取未来词,必须基于已生成的历史词逐步预测。
- 掩码机制:通过上三角注意力掩码(
mask_future=True
),确保当前位置仅关注已生成的词。
风险
曝光偏差(Exposure Bias) :
- 问题:训练时Decoder的输入是真实词(Teacher Forcing),而推理时输入是模型自己生成的词,导致训练与推理的输入分布不一致,模型在推理时性能下降。就像学生在考试时遇到的题目类型与练习题完全不同,导致考试成绩远低于练习表现。
- 缓解方法:
- 计划采样(Scheduled Sampling):在训练过程中,逐步从完全使用真实词(Teacher Forcing)过渡到部分使用模型生成词,让模型适应推理时的自回归生成模式。
- 课程学习(Curriculum Learning):模仿人类学习过程,从简单样本(短序列)逐步过渡到复杂样本(长序列),让模型先学会生成短序列,再逐步挑战长序列。
- ...
方法 | 核心优势 | 适用场景 | 挑战 |
---|---|---|---|
计划采样 | 简单易实现,平滑过渡 | 资源有限的中小规模任务 | 需手动设计衰减策略 |
课程学习 | 提升长序列生成能力 | 文本生成、对话系统 | 动态数据管理复杂 |
强化学习 | 直接优化最终目标 | 需定制化评估指标的任务(如聊天机器人) | 高方差,收敛困难 |
对抗训练 | 生成结果更自然 | 艺术文本生成、数据增强 | 模式崩溃,训练不稳定 |
自临界训练 | 降低方差,无需判别器 | 机器翻译、摘要生成 | 依赖奖励函数设计 |
输出
1. 训练阶段
-
输出内容:
- 每个位置的词概率分布:输出形状为
(batch_size, seq_len, vocab_size)
,表示每个位置对词表中所有词的预测概率。 - 示例:
输入["<SOS>", "A", "B"]
→ 输出预测["A", "B", "C"]
的概率分布。
- 每个位置的词概率分布:输出形状为
-
计算方式:
- 并行计算:由于使用Teacher Forcing,所有位置的输入已知,Decoder可一次性计算整个序列的输出。
- Softmax归一化:每个位置的输出通过Softmax转换为概率分布。
2. 推理阶段
-
输出内容:
- 逐步生成词序列:每一步输出当前词的概率分布,通过采样策略(贪心搜索、束搜索等)选择最终词。
- 终止条件:生成
<EOS>
或达到最大长度时停止。
-
计算方式:
- 自回归生成约束: 推理时无法预先知道完整目标序列,必须基于已生成的词逐个预测,形成序列依赖链。
为什么不同
1. 目标不同
-
训练阶段:
- 目标:学习输入到输出的映射规律,最大化正确标签的概率。
- 方法:通过Teacher Forcing提供真实上下文,直接优化所有位置的预测。
-
推理阶段:
- 目标:生成连贯、合理的序列。
- 方法:基于模型自身的历史生成结果逐步预测,模拟真实应用场景。
2. 输入依赖不同
- 训练输入:已知完整目标序列的右移版本,可并行计算。
- 推理输入:依赖模型自身生成的历史词,必须串行处理。
3. 效率与质量的权衡
- 训练效率:
并行计算大幅提升训练速度(如Transformer训练速度比RNN快5-10倍)。 - 推理质量:
逐步生成允许动态调整注意力焦点(如长文本中回溯修正错误)。
与Encoder的架构差异
-
架构区别的本质:
Encoder是理解者,Decoder是生成者,二者通过中间表示(增强序列)解耦输入与输出的模态、长度和任务差异。 -
设计原理的深层逻辑:
- 解耦与协作:Encoder专注抽象输入,Decoder专注规则生成,分工提升模型泛化能力。
- 动态性与适应性:通过注意力机制实现软对齐,避免硬编码规则的限制。
- 效率与稳定性:残差连接、并行计算、掩码机制共同保障训练高效且结果可靠。
维度 | Encoder | Decoder |
---|---|---|
核心目标 | 理解输入序列,提取全局上下文表示 | 基于Encoder表示生成目标序列,避免未来信息泄露 |
输入处理 | 原始输入序列(如文本、图像分块) | 目标序列右移(训练时)或自回归生成(推理时) |
注意力机制 | 自注意力(Self-Attention) | 掩码自注意力 + 交叉注意力(Cross-Attention) |
输出形式 | 与输入等长的增强序列表示 | 目标序列的概率分布 |
层结构 | 多层堆叠的自注意力 + FFN模块 | 多层堆叠的掩码自注意力 + 交叉注意力 + FFN模块 |
其中,cross attention核心目标是:
让 Decoder 在生成目标序列的每一步时,动态聚焦 Encoder 输出的关键信息,从而建立输入(源序列)与输出(目标序列)之间的语义对齐。
输入与输出的语义对应关系复杂多变(如翻译中的词序差异、省略、多义词)。
cross attention使得通过注意力权重自动学习输入与输出的关联,无需预设规则。
架构选型
在自然语言处理中,Encoder-Decoder架构确实在序列到序列任务(如机器翻译、文本摘要)中表现出色,但并非所有任务都需要完整的Encoder-Decoder结构。
- Encoder:专精理解,适合需要深度上下文建模的任务。
- Decoder:专精生成,适合自回归生成连贯序列的任务。
- Encoder-Decoder:平衡理解与生成,适合跨模态/跨语言的复杂转换任务。
架构选择本质是任务需求、计算效率、数据特性的权衡。理解这一点,可以更精准地为不同场景选择合适的模型。
模型类型 | 代表模型 | 核心任务 | 架构特点 |
---|---|---|---|
纯Encoder | BERT | 文本分类、NER | 双向注意力,输出静态表示 |
纯Decoder | GPT | 文本生成、对话 | 单向注意力,自回归生成 |
Encoder-Decoder | T5 | 翻译、摘要、问答 | 分离理解与生成,动态交叉注意力 |