跳到主要内容

门控、编码器-解码器与翻译 — LSTM、seq2seq 与束搜索

这一章讲四件事: LSTM 怎么治梯度消失——它给网络加了一条内部传送带, 梯度可以畅通穿行,这条传送带叫记忆单元,读写由三个门控制; GRU 的简化版思路;编码器-解码器架构与 teacher forcing; 以及解码时「每步挑最优词 ≠ 最优序列」的束搜索。 读完你会拿到 2014-2017 年神经机器翻译的完整图纸—— 以及它天花板的精确位置,那是注意力登场的入口。

1. LSTM:给梯度修一条权重为 1 的专用道

第 10 章说 BPTT 的消失来自连乘。 1991 年 Hochreiter 在德语硕士论文里首次阐明这个问题(所以多年鲜为人知); 1997 年他和 Schmidhuber 给出的解法沿用至今:LSTM(长短期记忆)1

名字的含义:普通 RNN 有「长期记忆」(权重,训练慢改,装通用知识) 和「短期记忆」(激活值,逐步传递)。 LSTM 发明了第三种——记忆单元(memory cell): 一个带自环边、权重恒为 1 的节点2。 权重恒 1 意味着:沿着这条边,梯度乘以 1—— 无论跨多少步都不放大不缩小,梯度有了一条无损通道。

但光存着不行,还要学会「何时写、何时清、何时读」。 LSTM 给记忆单元配了三个—— 每个门是一个 sigmoid 全连接层,输出 (0,1) 区间,相当于一个可学的开关3:

输入门 I_t:新输入 C̃_t 要写进多少
遗忘门 F_t:旧状态 C_{t-1} 要保留多少
输出门 O_t:当前状态要露出多少给外界

C_t = F_t ⊙ C_{t-1} + I_t ⊙ C̃_t ← 旧的去衰 + 新的写入
H_t = O_t ⊙ tanh(C_t) ← 露出的部分当隐状态

逐元素乘(⊙)就是「按位开关」:门输出 0.9 就放九成,0.1 就留一成。 看两个极端就懂了:F 恒 1、I 恒 0,状态永远封存; O 恒 0,信息可以积累很多步不外泄,然后某一步 O 突然打开, 一次性影响后续——这正是「长期依赖」想要的行为4。 门的数据来源和 RNN 一样(当前输入 + 上一步隐状态), 所以「开关何时开」本身是学出来的: 第一个词特别重要,就学会看完它之后关上输入门。

GRU 是简化版:两个门。reset 门控制「算候选状态时记起多少旧状态」, update 门控制「新状态里保留多少旧状态」: H_t = Z⊙H_{t-1} + (1−Z)⊙H̃_t——没有独立记忆单元, 把 LSTM 的「读/写/清」压缩成「记/更」两问,参数更少,效果常常相当。

另两个结构变体一句话带过:深层 RNN(多层隐状态堆叠); 双向 RNN(再加一个从后往前读的 RNN,输出拼接—— 适合「标注每个词」这类能看全句的任务,不能用于语言模型,会偷看未来)。

2. 编码器-解码器:变长进,定长过,变长出

机器翻译这类任务,输入输出都是变长序列,而且不对齐 (英文三词可能翻成法文五词)。标准解法是两个 RNN5:

编码器 RNN:逐词读入源句,最终隐状态 → 定长的上下文向量 c
解码器 RNN:拿 c 当初始知识,逐词生成目标句,直到产出 <eos>

「They are watching .」 → c → 「Ils regardent .」

解码器本质是一个条件语言模型:每步预测 P(下一个词 | 已生成的前缀, c)。 两个结构细节6: 输入输出两端各加特殊标记 <bos>(开头)与 <eos>(结束—— 模型自己学会「什么时候停」); 编码器的最终隐状态有两种用法——只作解码器初始状态(Sutskever 式), 或拼到解码每一步的输入里(Cho 式)。 词进入 RNN 前先过 embedding 层:一张「词表大小(词表里词的总数) × 向量维度」的矩阵, 第 i 行就是第 i 个词的向量——把离散的词换成连续的表示(第 17 章专门讲它怎么学)。

teacher forcing:训练时喂标准答案

训练解码器有个别扭处:它每步的输入是「上一步的词」—— 那训练时喂它自己刚预测的词,还是喂真实标签? 喂真实标签,叫 teacher forcing: 输入是 +正确前缀,目标是正确序列错一位7。 这样每步都在「正确轨道」上学,训练稳; 代价是测试时它只能吃自己的预测,一步错步步歪—— 训练与测试的输入分布不一致,这是 teacher forcing 的著名代价。

3. 束搜索:每步最优 ≠ 全局最优

解码时每步挑概率最大的词(贪心搜索),便宜但不一定最优—— 书里的反例很干净8:

贪心:A B C <eos> 联合概率 0.5×0.4×0.4×0.6 = 0.048
另一条:A C B <eos> 联合概率 0.5×0.3×0.6×0.6 = 0.054 ← 更大!

图说:第 2 步选次优的 C(0.3 < 0.4),
反而把后面的路走宽了(0.6 > 0.4)。

穷举所有序列保证最优,但代价是 O(|V|^T): 词表 1 万、长度 10,就是 10⁴⁰ 个候选——任何可预见的计算机都跑不动9束搜索(beam search) 是中间档:每步只保留累计概率最高的 k 个候选前缀 (k 叫束宽),下一步各扩展 |V| 个再留 k 个。 k=1 退化为贪心;k 越大越接近穷举。 它还有个著名偏差:联合概率随长度单调变稀,天然偏好短句—— 所以实际打分常除以长度(长度归一化)。 评估翻译质量的自动指标叫 BLEU(看生成译文与参考答案的 n-gram 重合度)。

4. 作者的判断与证据

书里给了证据的: LSTM 的门控公式与自环边机制;编码器-解码器的两种上下文用法; teacher forcing 的错位构造;贪心反例(0.048 < 0.054)与穷举的 10⁴⁰ 账。

作者的立场: 「门控缓解消失梯度」是实践结论加机制直觉, 不是严格证明(作者措辞是「this design alleviates」); 束宽 k 的选择、长度归一化是工程惯例。

判断(我们的,不是书里的): 这一章的编码器-解码器 有一个结构性软肋,作者自己也点到了:全部源句信息必须装进定长向量 c。 句子越长,这个瓶子越塞不下——c 是整个流水线上唯一的传话人。 下一章的注意力,本质就是「废掉这个瓶颈:不让 c 传话, 让解码器每一步直接回头查源句」。先记住这堵墙。 如果错,会错在: 「装不下」不是严格的容量证明—— 定长向量理论上可以是无损压缩;真实瓶颈是「可训练性」: 长句下梯度与信息都难以保真地穿过这一个点。

5. 边界与局限

  • LSTM/GRU 缓解而非根治长依赖;超序列(上千步)仍吃力,且逐步串行、训练慢;
  • teacher forcing 的训练-测试不一致是已知代价(scheduled sampling 等缓解法原书未展开);
  • 束搜索不保证全局最优;BLEU 与人类判断只是相关;
  • 双向 RNN 不适用于需要严格因果的任务。

6. 可带走的

  1. LSTM = 权重恒 1 的自环通道(梯度无损)+ 三个可学的门(写/清/读);
  2. 门 = sigmoid 全连接层,输出 (0,1),逐元素乘当开关;
  3. GRU:reset/update 两门,参数更省;
  4. 编码器-解码器:变长→定长 c→变长;解码器是条件语言模型;
  5. teacher forcing:训练喂真实前缀,测试喂自己的预测——分布不一致;
  6. 贪心 ≠ 最优序列(0.048<0.054);束搜索每步留 k 个候选,记得长度归一化;
  7. 定长 c 是全部信息的唯一传话人——长句瓶颈,注意力的入口。

7. 原文地图

主题原书章原文位置
德语论文、自环权重 1LSTMtext/61-long-short-term-memory-lstm.txt:13(搜「German」) · text/61-long-short-term-memory-lstm.txt:25(搜「fixed weight 1」)
三个门LSTMtext/61-long-short-term-memory-lstm.txt:81(搜「input gate」) · text/61-long-short-term-memory-lstm.txt:82(搜「forget gate」)
缓解消失梯度LSTMtext/61-long-short-term-memory-lstm.txt:196(搜「alleviates the vanishing gradient problem」)
GRU 两门GRUtext/62-gated-recurrent-units-gru.txt:52(搜「reset gate」)
编码器-解码器例句Encoder--Decodertext/66-the-encoder-decoder-architecture.txt:29(搜「watching」)
context variable、两种用法Seq2Seqtext/67-sequence-to-sequence-learning-for-machine-transl.txt:157(搜「context variable」) · text/67-sequence-to-sequence-learning-for-machine-transl.txt:65(搜「final hidden state」)
teacher forcingSeq2Seqtext/67-sequence-to-sequence-learning-for-machine-transl.txt:121(搜「teacher forcing」)
embedding 层Seq2Seqtext/67-sequence-to-sequence-learning-for-machine-transl.txt:195(搜「embedding layer」)
贪心反例Beam Searchtext/68-beam-search.txt:101(搜「0.048」) · text/68-beam-search.txt:131(搜「0.054」)
穷举 10⁴⁰、束宽Beam Searchtext/68-beam-search.txt:143(搜「exhaustive search」) · text/68-beam-search.txt:172(搜「beam size」)

Footnotes

  1. 出处:「Long Short-Term Memory (LSTM)」第 13 段(text/61-long-short-term-memory-lstm.txt:13,搜「German」)与第 21 段(Hochreiter & Schmidhuber 1997 引文)。

  2. 出处:「Long Short-Term Memory (LSTM)」第 25 段(text/61-long-short-term-memory-lstm.txt:25,搜「fixed weight 1」)。「ensuring that the gradient can pass across many time steps without vanishing or exploding」。

  3. 出处:「Long Short-Term Memory (LSTM)」第 81 段(text/61-long-short-term-memory-lstm.txt:81,搜「input gate」)与第 82 段(text/61-long-short-term-memory-lstm.txt:82,搜「forget gate」)。

  4. 出处:「Long Short-Term Memory (LSTM)」第 229 段(text/61-long-short-term-memory-lstm.txt:229,搜「suddenly impact the network」)。

  5. 出处:「The Encoder--Decoder Architecture」第 29 段(text/66-the-encoder-decoder-architecture.txt:29,搜「watching」)。Sutskever et al. 2014 与 Cho et al. 2014 同年在各自实现。

  6. 出处:「Sequence-to-Sequence Learning for Machine Translation」第 56 段(text/67-sequence-to-sequence-learning-for-machine-transl.txt:56,搜「eos」)与第 65 段(text/67-sequence-to-sequence-learning-for-machine-transl.txt:65,搜「final hidden state」)。

  7. 出处:「Sequence-to-Sequence Learning for Machine Translation」第 121 段(text/67-sequence-to-sequence-learning-for-machine-transl.txt:121,搜「teacher forcing」)与第 132 段(错位示例)。

  8. 出处:「Beam Search」第 101 段(text/68-beam-search.txt:101,搜「0.048」)与第 131 段(text/68-beam-search.txt:131,搜「0.054」)。

  9. 出处:「Beam Search」第 143 段(text/68-beam-search.txt:143,搜「exhaustive search」)与第 172 段(text/68-beam-search.txt:172,搜「beam size」)。