Learn AI · 模型硬功底(由内而外)
第 4 课 / 经典论文 P03  ·  阶段一:地基(Sutskever, Vinyals & Le, 2014)

Sequence to Sequence Learning:
把「一个序列」翻成「另一个序列」
——你刚修好的那台机器的本体

上一课(P02)立的那个靶——「整句被压进一个固定向量」—— 这一课你正面把那台机器拆开。它叫 encoder–decoder(seq2seq),是 翻译、摘要、语音转写、对话、代码生成的共同祖宗框架,也是你每天用的 GPT「生成」那一半的正源。 P02 是给它装了 attention;这一课你看它没装之前长什么样、为什么必然有那个瓶颈
用两台 LSTM 接力:
第一台读完整句源文,压成一个向量("意思");
第二台拿着这个向量,一个词一个词吐出译文
第一次证明:纯神经网络端到端,能翻得过几十年的统计翻译。

一、立靶:神经网络做不了「变长 → 变长」

2014 年之前,深度网络(DNN)很能打,但有个硬限制:输入和输出都得是定长向量——图片分类(一张图 → 一个标签)、打分(一段特征 → 一个数)都行。

任务形状DNN 能不能
图片分类定长 → 定长
机器翻译变长 → 变长(源句 7 词,译文 10 词,长度还不固定)不能

翻译是序列到序列:长度不定、词序还会重排。DNN 那套「定长进定长出」根本套不上。 论文的问题就一句:怎么用神经网络,把一个不定长序列映射成另一个不定长序列?

二、抽框架:两台 LSTM 接力

角色在干什么
Encoder LSTM逐词读源句,每读一词更新自己的记忆。读到结尾标记 <EOS> 时,把最后那一刻的 hidden state 当成整句的"意思向量" v(业界叫 thought vector)。
Decoder LSTMv 为起点,自回归地一个词一个词生成译文:每生成一个词,再喂回去当下一步的输入,直到自己吐出 <EOS> 才停。

训练目标朴素直接——最大化"给定源句,正确译文的概率"

P(译文 | 源句) = ∏  P(下一个译词 | v, 已生成的译词)
                t
读源句 → 压成 v → 从 v 解出译文,一步步算概率,整条最大化。

这套 encoder–decoder 就此定下来。注意 decoder 那一半——「拿一个向量,自回归吐 token,吐到 <EOS> 停」—— 正是今天每个 GPT 在做的事。GPT 约等于"砍掉 encoder、只留 decoder、把 attention 加满"的 seq2seq。

论文里三个关键点,少一个都会理解偏

① 固定向量瓶颈(承 P02 的靶): 整句压进 v 这一个定长向量。短句够用,长句信息装不下——论文自己就观察到长句翻译质量下滑。这正是 P02 attention 来修的病。先有这台机器的瓶颈,才有 attention 的必然。

② 倒序输入 trick(最反直觉、最有记忆点): 把源句反过来喂进 encoder("a b c" → "c b a")。就这一下,BLEU 大涨约 4~5 分。下一节你亲手玩它为什么有效。

③ 句子变成了空间里一个点: 学出来的 v,意思相近的句子聚在一起,对词序敏感、对主动/被动相对不变。第一次让人看到"一句话 = 一个向量"——这就是今天 sentence embedding 的雏形。

二·五、换个说法:打包成一个 .zip,再解压成另一种语言(通俗版)

嫌上面抽象?把 seq2seq 想成压缩与解压

对应 seq2seq 的
打包:把一整段中文话压成一个固定大小的 .zip 文件Encoder 把源句压成意思向量 v
解压:搭档拿到这个 .zip,照着把内容用英文复述出来Decoder 从 v 自回归生成译文
瓶颈:.zip 大小写死了,话越长越塞不下,解压出来缺斤少两固定向量装不下长句 → P02 attention 来救
倒序 trick:打包时把开头放在离"解压起点"最近的地方,搭档一上手就够得着反转源句,缩短首词到首译词的距离

三、动手玩:倒序输入为什么有效

源句 The · cat · sat,decoder 要先生成第一个译词。点切换正序 / 倒序,看源句首词 The第一个译词之间隔了几步——步数越短,LSTM 越容易把这对词学对齐。

喂进 encoder 的顺序: 

四、对照表:这台机器的三代演化

维度Seq2Seq
(本篇 P03, 2014)
+ Attention
(P02, 2014)
Transformer
(P01, 2017)
源句怎么表示压成一个 v每个源词留一个 h,按需重算 c每个 token、每层都重算
长句装不下,会掉链子不掉链子受限于 O(n²) 成本
底座两台 LSTM双向 LSTM + 对齐网络无 RNN,纯 attention
decoder 的活都一样:拿向量,自回归吐 token,到 <EOS> 停 ← 今天 GPT 在做的事

五、映射到你的项目

你工作里的东西其实就是这篇论文的什么
你每天用的 LLM「生成」就是 decoder 那一半:拿着上下文向量,自回归一个 token 一个 token 往外吐。GPT = 长满 attention 的 decoder。
你调的 max_tokens / stop本质是在管这台 decoder「什么时候吐 <EOS> / 该不该停」——停止机制就是这篇定的。
语音 agent 里的 ASR / 翻译 / 摘要全是 seq2seq:语音序列 → 文字序列、长文 → 摘要,同一个 encoder-decoder 框架。
RAG 把一段话编码成一个向量做检索就是这篇的 thought vector 直系后代——也继承了它的瓶颈:一个 dense 向量压不下长文档,这正是 RAG 要切块、要聚合的根。

六、检索练习(关掉上文,凭记忆答)

1. seq2seq 出现前,普通 DNN 做不了翻译,卡在哪?
2. seq2seq 留给 P02 attention 去修的「病」是什么?
3. 「把源句倒过来输入」为什么能涨分?

七、常见问题 FAQ

课上被问到、值得单独记一笔的几个点。点开看答。

为什么用 LSTM,不用普通 RNN?

普通 RNN 反向传播靠梯度连乘,序列一长就梯度消失 / 爆炸,实际只记得住三五步。LSTM 多挂一条「记忆传送带」(cell state):信息靠加法近乎无损地流很多步,三个门控制写入 / 遗忘 / 读出——所以扛得住长距离。seq2seq 要把整句信息一路扛到句尾,正需要它。

🔮 现代 Transformer 干脆用 attention 让任意两词一步直连,从根上绕过梯度消失。「为什么用 LSTM」是 2014 年的答案;2017 年起的答案是「都不用,用 attention」

thought vector 和 sentence embedding 是一回事吗?

同源,但训练目标分了家。两者都是「一句话 → 一个定长向量」。但 thought vector 为生成 / 翻译顺带产生(够 decoder 解出译文就行);sentence embedding(RAG 常用的 bge 系列等)为检索专门用对比学习训,目标是「语义相近 = 距离近」。

所以 RAG 里那个向量是 embedding、不是 thought vector,但同一血脉,也继承同一瓶颈:一个定长向量装不下长文——这就是 RAG 要切块、要召回后聚合的根。

decoder 生成时是贪心还是 beam search?

P03 原论文用 beam search(贪心 = beam width 1 的特例)。贪心每步只取概率最高的词,可能一步选错、满盘皆输;beam search 保留 top-k 条候选路径,最后挑整句总概率最高的那条。

🔮 你今天调的 temperature / top-p 是第三条路——不求最高概率,而是随机采样求多样性。有标准答案的任务(翻译 / 摘要)偏 beam,开放生成(聊天 / 写作)偏采样;你 agent 输出不稳定就因为用采样、temperature>0 有随机性。这块 W8「推理与采样」会一次拆透。

本课主源

读原典:Sutskever, Vinyals & Le — Sequence to Sequence Learning with Neural Networks (arXiv:1409.3215)—— 重点读第 2 节(模型)和第 3.3 节(倒序输入那段实验)。

建立直觉可配:Jay Alammar — Visualizing seq2seq(先看没 attention 的纯 seq2seq 部分)。

下一篇 P04 (word2vec, 2013) 往更底走一层:这篇里那个"意思向量",词一级的版本是怎么来的。

我是你的老师,随时提问。 比如:「为什么用 LSTM 不用普通 RNN?」「thought vector 和 sentence embedding 是一回事吗?」 「decoder 生成时是贪心还是 beam search?」——别带着模糊往下走。

参考:
Sutskever, Vinyals & Le, Sequence to Sequence Learning with Neural Networks, NeurIPS 2014;Alammar, Visualizing A Neural Machine Translation Model.