Seq2Seq 与 Encoder-Decoder:从翻译任务到最小可运行 PyTorch 实现

副标题 / 摘要 这篇文章不把 seq2seq 和 encoder-decoder 当成术语表来讲,而是从一个最小翻译任务出发,解释为什么“输入一段序列、输出另一段序列”会自然逼出编码器和解码器的分工,最后收束成一份最小可运行的 PyTorch GRU 实现。 从一个最小翻译任务开始 假设源序列是: <bos> I love apples <eos> 目标序列是: <bos> 我 喜欢 苹果 <eos> 当模型要生成“苹果”时,它至少要解决三件事: 它必须知道整句英文大意,而不只是当前一个词 它必须记住自己前面已经生成了“我 喜欢” 它必须按顺序一个词一个词地产生输出,而不是一次吐出整个目标序列 如果你只用一个普通分类器把源句子映射成一个类别,这个任务做不成。 因为这里的输出不是一个固定标签,而是长度可变的目标序列。 所以这里天然会逼出一个更具体的数据流: 先把源序列读完,压成可传递的状态 再从 <bos> 开始,逐步生成目标序列 每生成一步,都要同时依赖“源侧信息”和“目标侧历史” 这就是 sequence-to-sequence 的最小问题形态。 seq2seq 说的是任务:输入一段序列,输出另一段序列。 encoder-decoder 说的是实现:先编码输入,再逐步解码输出。 下面不先堆名词,直接按这个压力把代码一步一步长出来。 快速掌握地图 问题形态:src -> encoder -> hidden/context -> decoder -> logits 核心目标:学习条件概率 p(y_t | y_{<t}, x) 最小实现:Embedding + GRU Encoder + GRU Decoder + output projection 何时适用:翻译、摘要、改写、问答这类“输入序列 -> 输出序列”任务 明显局限:如果所有源信息都被压进一个固定长度向量,长句子会吃力 这篇文章重点深挖的两个概念 隐藏状态交接:encoder 到底把什么交给 decoder 右移目标序列与 teacher forcing:训练时 decoder 为什么不能直接喂完整真实答案 大师级心智模型 这类模型的核心抽象不是“两个 RNN 拼起来”,而是: ...

2026年4月23日 · 7 分钟 · map[name:Jeanphilo]

为什么 GPT 是 Decoder-Only:自回归生成的最佳形态

副标题 / 摘要 GPT 采用 decoder-only 结构是为了极致匹配自回归生成任务:因果注意力保证顺序一致性,结构简化降低训练与推理成本。本文对比 encoder-only 与 encoder-decoder,并给出最小 PyTorch 示例。 预计阅读时长:14~18 分钟 标签:gpt、decoder-only、autoregressive SEO 关键词:GPT, Decoder-Only, 自回归, Causal Attention 元描述:从任务目标到工程成本,解释 GPT 为什么选择 decoder-only 结构。 目标读者 想理解 GPT 架构选择的入门读者 需要做生成模型选型的工程实践者 想对比不同 Transformer 结构的开发者 背景 / 动机 在文本生成任务中,模型必须严格遵循“从左到右”的因果顺序。 GPT 的 decoder-only 结构天然满足这一目标,同时简化了模型设计。 但它与 encoder-only、encoder-decoder 的差异常被混淆,需要系统梳理。 核心概念 Decoder-only:仅使用解码器堆叠 + 因果自注意力。 Encoder-only:双向自注意力,擅长理解任务。 Encoder-decoder:编码输入再解码输出,擅长序列到序列任务。 Causal Mask:确保 token 只能看见左侧历史。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 GPT 的任务是“预测下一个词”,所以只需要解码器并遵守因果顺序。 Encoder-only(如 BERT)不适合生成,因为它能看到未来词。 Encoder-decoder(如 T5)适合翻译/摘要,但结构更复杂。 基础示例(1) 输入:“今天是” → 模型预测“周五”。 这要求模型只能看到“今天是”,不能看到未来词。 基础示例(2) 机器翻译需要“源序列 → 目标序列”,更适合 encoder-decoder。 实践指南 / 步骤 任务为生成/续写 → 优先 decoder-only。 任务为理解/分类 → 优先 encoder-only。 任务为序列到序列 → 优先 encoder-decoder。 可运行示例(最小因果注意力) import torch import torch.nn.functional as F def causal_attention(x): # x: (batch, seq, dim) scores = x @ x.transpose(-2, -1) seq = x.size(1) mask = torch.tril(torch.ones(seq, seq)).bool() scores = scores.masked_fill(~mask, float("-inf")) weights = F.softmax(scores, dim=-1) return weights @ x x = torch.randn(1, 4, 8) out = causal_attention(x) print(out.shape) 解释与原理 因果 mask 保证 token 只依赖左侧历史。 这与自回归目标完全一致,避免信息泄露。 Decoder-only 结构也更容易并行化与扩展模型规模。 C — Concepts(核心思想) 方法类型 GPT 属于自回归生成模型,采用 decoder-only 结构 + 因果自注意力。 ...

2026年1月24日 · 2 分钟 · map[name:Jeanphilo]