跳到主要内容

记忆与门 — RNN 的困境与 LSTM 的三条门

这一章讲三件事: 为什么处理「顺序敏感」的数据必须给网络加记忆; 普通记忆(RNN 的隐状态)为什么记不长;以及 LSTM 怎么用一条传送带和三扇门 把「记什么、忘什么、说什么」变成可学习的选择。 读完你会拿到全书的第二条架构先验:「上一步影响下一步」

1. 问题:前馈网络没有记性

第 02 章到第 07 章的那些网络都是前馈——数据只朝一个方向流、不带回路——它们有一个共同盲点:每条输入都是独立处理的。 对图像无所谓;对「昨天股价 100、今天 108、明天多少?」这种问题则是致命的—— 不看昨天,凭什么预测明天?原书列举的顺序任务一整版:图像描述、语音合成、音乐生成、 时序预测、视频分析、翻译、对话、机器人控制——共同点是输出依赖输入的先后次序1

RNN(recurrent neural network)——中文叫循环神经网络,即带回路的网络——修法是给隐层加一条从输出绕回输入的环。 每个时间步 t,网络收两路输入:当前数据 x(t) 和上一步的隐状态 h(t−1), 算出新的隐状态 h(t)——h(t) 是「到目前为止看过的内容」的压缩摘要2

x(1) → [h(1)] → x(2) → [h(2)] → x(3) → [h(3)] → …
└──────┘ └──────┘ (h 每步往下一步传)

图说:按时间展开后,RNN 是「同一套参数、复制很多份」的链。
参数共享(同一组权重用在每个时间步)让一条链能处理任意长度。

2. RNN 的病:梯度沿时间消失

第 04 章讲过梯度消失:信号逐层相乘、逐层缩小。RNN 按时间展开后, 「层」变成了「时间步」——同一个病换了件衣服:相隔五十步的两个事件, 误差信号回传五十次,每次乘一个小于 1 的数,到头基本归零。 远处的因果关系,网络学不到——这就是原书列的第一条、也是最要命的一条局限3

原书的局限清单还给了三条值得记的:训练难并行(每步依赖上一步,没法像卷积那样摊开算)、 梯度会爆炸(信号逐层放大,训练发散——解法是梯度裁剪:数值超过上限就掐掉)、 以及没有显式记忆(h 只是个压缩摘要,该记什么、忘什么,网络自己说了不算)4

3. LSTM:一条传送带 + 三扇门

LSTM(long short-term memory,长短期记忆网络)的核心动作: 在隐状态之外,再加一条几乎直通的传送带——cell state(细胞状态)C(t), 专门负责「长期记忆」。梯度沿这条传送带回传时衰减极慢,远距离因果终于能学5

三扇门负责控制传送带的读写。先立主走查的核心公式(全章就这一行要背):

C(t) = (C(t−1) ⊗ f(t)) + (i(t) ⊗ C̃t)

图说:⊗ 是逐元素相乘。
左半边:旧记忆 C(t−1) 先被遗忘门 f(t)「擦除」一遍(每个分量保留 0%~100%);
右半边:新内容 C̃t 经过输入门 i(t)「把关」后写入。
一擦一写,传送带更新完毕。

三扇门各司其职,每扇都是「输入拼接上一步隐状态 → 过 sigmoid → 得到 0 到 1 的开关向量」6:

吃什么吐什么一句话职责
遗忘门 f(t)当前输入 + h(t−1)每个分量 0~1旧记忆该擦几成
输入门 i(t)同上(另配一支 tanh 造候选内容 C̃t)开关向量新内容该写几成
输出门 o(t)当前输入 + h(t−1)开关向量记忆该露出几成:输出 h(t) = o(t) ⊗ tanh(C(t))

为什么有效: 传送带上「被遗忘门放过、又被输入门留着」的信息可以原样躺很多步, 不受中间变换的侵蚀——这就绕开了第 2 节的衰减问题。而且「擦多少、写多少」 本身是权重,可训练:记什么、忘什么,由数据说了算——这正是普通 RNN 「没有显式记忆」那条病的解药。

主走查:用一组股价看门的取舍

原书举的序列:[100, 110, 108, 120, 115],要预测下一天的股价7。 把它放进三扇门(下面的取舍是按该序列特征做的演示推演,门的具体数值由训练决定):

「近五日整体在上行(100→115)」
→ 遗忘门放行、输入门持续写入:上行趋势躺在传送带上,长期保留
「108(第三天的小回落)」
→ 典型的瞬时噪声:输入门接近关闭,写入极少,几步之后被遗忘门淡化
「预测第 6 天」
→ 输出门主要读传送带上的趋势项,而不是最近一天的抖动

图说:普通 RNN 的 h 摘要里,趋势和噪声挤在一间屋;
LSTM 把「趋势」放进传送带长期保存,把「抖动」交给门挡在门外。
「选择性记住」——原书对这个机制的原话。

4. 用例:字符级文本生成

LSTM 最经典的练手项目,原书给的全流程是字符级的「下一字符预测」8:

  1. 拿一个文本(示例用《麦克白》),建立「字符 ↔ 编号」对照表;
  2. 用长度 50 的滑动窗口切样本:前 50 个字符当输入,第 51 个当标准答案;
  3. 模型:两层 LSTM(每层 300 单元)+ dropout 0.2 + softmax 输出;
  4. 训练后生成:喂一段种子文本,预测下一字符,接到尾部、丢掉最老的一个字符,重复 50 次。

注意这套流程和第 01 章 ChatGPT 式「下一个词预测」是同一个范式, 只是单位从字符/词换成了 token(生成模型切碎文本的最小单位)、网络从 LSTM 换成了 Transformer—— 生成模型的骨架在 2015 年前后就已经长成了。原书自己也提醒: 生成质量取决于训练数据的规模与多样性,连贯长文并不容易9

5. 作者的判断与证据

  • 机制讲得完整的: 三门一状态的职责、cell state 更新式、文本生成八步流程, 与主流教材一致;LSTM 的 NumPy 手写实现还提前出现在第 04 章引的 3.2 节里(f/i/o 三门 与 c=f·c+i·c̃ 的更新行都对)10
  • 书里自己承认时代已翻页: 原文写明 Transformer 已「取得可观关注与市场份额, 在部分应用上超过 RNN」——这是全书唯一一处对自身主角的「过时声明」,值得给它信用11
  • 措辞自相矛盾一处: 5.5.1 首句说遗忘门决定「上一状态」中什么该忘, 而它随后的公式明确作用在上一细胞状态上——以公式为准,首句是笔误12
  • 引用堆砌(要如实标): 本章参考文献几乎全是「主题擦边」的应用论文 ——滑坡位移预测、太阳辐照、燃料电池、视频去抖——与正文的机制论述不构成支撑关系; 5.1 把「CNN 能处理变长序列」挂在 AlexNet 论文上,同样驴唇不对马嘴13
  • 聊天腔残留一处: 文本生成代码后面跟着一段「修改建议」,说「epochs=1 可能不够」, 而代码里写的就是 epochs=10——这段建议评的是另一个版本的代码, 「I would suggest」的口吻是聊天机器人的14

判断(我们的,不是书里的): 把第 06、08 章并排看,RNN 与 CNN 的先验是 一对镜像:卷积假设「图案与位置无关」,循环假设「顺序本身就是信息」。 而 LSTM 三门的设计哲学,和第 05 章的优化器进化链是同一招——承认信号会衰减, 于是给重要的信号修一条旁路(优化器修的是梯度流,LSTM 修的是信息流)。 如果错,会错在: 如果某种架构能靠纯注意力同时拿到「平移等价」与「长程记忆」 且不需要旁路结构(Transformer 一定程度上正在如此),那「必须修旁路」就是 特定参数/数据条件下的工程解,不是原理必需——事实上序列建模的主角已经换了人。

6. 边界与局限

  • 书里没讲、而且今天不该不讲的: GRU 只被提名没展开(门更少的近亲)、 双向 RNN、序列到序列(seq2seq)与注意力机制——最后一项恰恰是通往 Transformer 的桥, 原书一个字没搭。
  • LSTM 没有治好一切: 原书照实记了一条——LSTM 缓解梯度消失,但梯度爆炸仍在, 要靠梯度裁剪;训练依旧难并行15。这两条正是后来 Transformer 用「注意力 + 全并行」 掀桌子的两个抓手。
  • 时代坐标: 本章内容作为「理解 2014-2017 年序列建模」仍然有效 补充(不在书里,来自通用知识):(语音识别——把人说的话转成文字——与早期机器翻译都曾是 LSTM 的天下); 作为「今天该用什么建序列模型」,答案已经不是它。

7. 可带走的

  1. 前馈网络每条输入独立处理;顺序敏感的任务(股价/文本/语音)必须给网络加记忆;
  2. RNN 的记忆 = 隐状态:每步收「当前数据 + 上一步摘要」;参数跨时间步共享,长度不限;
  3. 梯度沿时间消失 = 第 04 章梯度消失换了个轴;远处因果学不到 + 难并行 + 会爆炸;
  4. LSTM = 传送带(cell state)+ 三扇门;主公式 C(t)=(C(t−1)⊗f(t))+(i(t)⊗C̃t);
  5. 门的意义:记什么、忘什么、说什么都变成可训练的选择——数据说了算;
  6. 股价走查:趋势躺传送带,抖动被门挡——「选择性记忆」四个字就是 LSTM;
  7. 文本生成 = 字符级下一字符预测:50 字符窗口、两层 LSTM(300)、训练后滚动续写;
  8. 与 ChatGPT 的「下一个词预测」同一范式,只是零件换了——生成骨架比 Transformer 早;
  9. 书里自己承认 Transformer 已在部分应用上超越 RNN;本章当「上一个时代的主力」读。

8. 原文地图

主题原书章原文位置
顺序任务清单5 Recurrent Neural Networkstext/42-ch05-5-recurrent-neural-networks.txt:9(搜「Image Captioning」)
Transformer 已超越5 Recurrent Neural Networkstext/42-ch05-5-recurrent-neural-networks.txt:54(搜「transformer」)
循环连接与记忆5 Recurrent Neural Networkstext/42-ch05-5-recurrent-neural-networks.txt:84(搜「recurrent connections」) · text/42-ch05-5-recurrent-neural-networks.txt:88(搜「memory」)
按时间展开5 Recurrent Neural Networkstext/42-ch05-5-recurrent-neural-networks.txt:92(搜「unrolled」)
参数跨步共享5 Recurrent Neural Networkstext/42-ch05-5-recurrent-neural-networks.txt:100(搜「shared parameters」)
h(t) 定义5 Recurrent Neural Networkstext/42-ch05-5-recurrent-neural-networks.txt:168(搜「h(t)」) · text/42-ch05-5-recurrent-neural-networks.txt:170(搜「memory」)
股价输入例5 Recurrent Neural Networkstext/42-ch05-5-recurrent-neural-networks.txt:176(搜「stock volume」)
局限:长期依赖5 Recurrent Neural Networkstext/42-ch05-5-recurrent-neural-networks.txt:196(搜「Long-Term Dependencies」)
局限:难并行/爆炸/无显式记忆5 Recurrent Neural Networkstext/42-ch05-5-recurrent-neural-networks.txt:207(搜「Parallelization」) · text/42-ch05-5-recurrent-neural-networks.txt:211(搜「Exploding」) · text/42-ch05-5-recurrent-neural-networks.txt:221(搜「Explicit Memory」)
LSTM 三门总述5 Recurrent Neural Networkstext/42-ch05-5-recurrent-neural-networks.txt:247(搜「input gate」)
三门职责5 Recurrent Neural Networkstext/42-ch05-5-recurrent-neural-networks.txt:252(搜「Input Gate:」) · text/42-ch05-5-recurrent-neural-networks.txt:256(搜「Forget Gate:」) · text/42-ch05-5-recurrent-neural-networks.txt:261(搜「Output Gate:」)
股价序列 [100,110,108,120,115]5 Recurrent Neural Networkstext/42-ch05-5-recurrent-neural-networks.txt:284(搜「110」)
选择性记住5 Recurrent Neural Networkstext/42-ch05-5-recurrent-neural-networks.txt:290(搜「selectively」)
三个信息流组件5 Recurrent Neural Networkstext/42-ch05-5-recurrent-neural-networks.txt:309(搜「long-term memory」) · text/42-ch05-5-recurrent-neural-networks.txt:314(搜「short-term」)
遗忘门机制5 Recurrent Neural Networkstext/42-ch05-5-recurrent-neural-networks.txt:347(搜「X(t)」) · text/42-ch05-5-recurrent-neural-networks.txt:350(搜「0」)
遗忘门措辞矛盾5 Recurrent Neural Networkstext/42-ch05-5-recurrent-neural-networks.txt:340(搜「previous hidden state」) · text/42-ch05-5-recurrent-neural-networks.txt:245(搜「cell state」)
输入门 sigmoid×tanh5 Recurrent Neural Networkstext/42-ch05-5-recurrent-neural-networks.txt:369(搜「two activation」) · text/42-ch05-5-recurrent-neural-networks.txt:379(搜「multiplied」)
cell state 更新式5 Recurrent Neural Networkstext/42-ch05-5-recurrent-neural-networks.txt:397(搜「Update and Cell State」) · text/42-ch05-5-recurrent-neural-networks.txt:411(搜「C」)
输出门机制5 Recurrent Neural Networkstext/42-ch05-5-recurrent-neural-networks.txt:253(搜「sigmoid」) · text/42-ch05-5-recurrent-neural-networks.txt:429(搜「tanh」)
文本生成八步5 Recurrent Neural Networkstext/42-ch05-5-recurrent-neural-networks.txt:455(搜「Data Preparation」) · text/42-ch05-5-recurrent-neural-networks.txt:476(搜「seed sequence」)
Macbeth 代码(50 窗口)5 Recurrent Neural Networkstext/42-ch05-5-recurrent-neural-networks.txt:503(搜「macbeth」) · text/42-ch05-5-recurrent-neural-networks.txt:516(搜「50」)
LSTM(300)×2 模型5 Recurrent Neural Networkstext/42-ch05-5-recurrent-neural-networks.txt:529(搜「LSTM(300」) · text/42-ch05-5-recurrent-neural-networks.txt:534(搜「softmax」)
聊天腔 epochs 建议5 Recurrent Neural Networkstext/42-ch05-5-recurrent-neural-networks.txt:566(搜「epochs=1」) · text/42-ch05-5-recurrent-neural-networks.txt:539(搜「epochs=10」)
梯度裁剪5 Recurrent Neural Networkstext/42-ch05-5-recurrent-neural-networks.txt:580(搜「clipping」)
引用擦边5 Recurrent Neural Networkstext/42-ch05-5-recurrent-neural-networks.txt:669(搜「Landslide」) · text/42-ch05-5-recurrent-neural-networks.txt:646(搜「solar」)
CNN 变长序列错引5 Recurrent Neural Networkstext/42-ch05-5-recurrent-neural-networks.txt:53(搜「Krizhevsky」)

Footnotes

  1. 出处:「5 Recurrent Neural Networks」第 9 段(text/42-ch05-5-recurrent-neural-networks.txt:9,搜「Image Captioning」)起,八类顺序任务各占一条;第 42 段收束:这些任务的共同点是必须有效处理顺序数据。

  2. 出处:「5 Recurrent Neural Networks」第 168 段(text/42-ch05-5-recurrent-neural-networks.txt:168,搜「h(t)」)与第 170 段(搜「memory」)。原文:h(t) 表示网络在时间步 t 的记忆,编码此前各步的顺序信息。

  3. 出处:「5 Recurrent Neural Networks」第 196 段(text/42-ch05-5-recurrent-neural-networks.txt:196,搜「Long-Term Dependencies」)。原文:梯度随时间反向传播指数式缩减,相距较远时间步的依赖难以建模。

  4. 出处:「5 Recurrent Neural Networks」第 207 段(搜「Parallelization」)、第 211 段(搜「Exploding」)、第 221 段(搜「Explicit Memory」)。三条局限各占一条目。

  5. 出处:「5 Recurrent Neural Networks」第 242 段(搜「improvement over」)与第 245 段(搜「cell states」)。原文:LSTM 为克服长期依赖引入更复杂的记忆机制 cell states。

  6. 出处:「5 Recurrent Neural Networks」第 252 段(搜「Input Gate:」)、第 256 段(搜「Forget Gate:」)、第 261 段(搜「Output Gate:」)。三门均为 sigmoid 开关(0 忽略/1 保留);遗忘门对上一细胞状态逐元素相乘(:356,搜「cell state」);输入门 sigmoid×tanh 逐元素相乘得候选(:379,搜「multiplied」);输出门 sigmoid×tanh(C)(:429,搜「tanh」)。

  7. 出处:「5 Recurrent Neural Networks」第 284 段(text/42-ch05-5-recurrent-neural-networks.txt:284,搜「110」)。原书序列 [100, 110, 108, 120, 115];「selectively remember」在第 290 段。本节走查中各门的取舍判断是我们按序列特征做的演示推演,非原书数值。

  8. 出处:「5 Recurrent Neural Networks」第 455 段(搜「Data Preparation」)、第 476 段(搜「seed sequence」)。流程:清洗→滑窗造样本→字符编号→嵌入+LSTM+softmax→训练→种子续写→解码。

  9. 出处:「5 Recurrent Neural Networks」第 490 段(text/42-ch05-5-recurrent-neural-networks.txt:490,搜「coherent」)。原文:生成连贯有意义的文本很难,质量取决于数据规模与多样性、语言复杂度与模型结构。

  10. 出处:「5 Recurrent Neural Networks」第 246 段(搜「input gate」)起;NumPy 实现见 text/27-ch03-02-3-2-types-of-units-activation-functions-layers.txt:423(搜「self.c」),该实现里 c = f·c + i·c̃、h = o·tanh(c) 与本章公式一致。

  11. 出处:「5 Recurrent Neural Networks」第 54 段(text/42-ch05-5-recurrent-neural-networks.txt:54,搜「transformer」)。原话:Transformer 已获得可观关注与市场份额,在部分应用上超越 RNN;RNN 在复杂序列结构上仍有一席之地。

  12. 出处:「5 Recurrent Neural Networks」第 340 段(text/42-ch05-5-recurrent-neural-networks.txt:340,搜「previous hidden state」)与第 356 段(搜「cell state」)。首句说遗忘门决定上一隐状态中什么被忘;同节其后明确 f(t) 与上一细胞状态逐元素相乘。

  13. 出处:「5 Recurrent Neural Networks」第 669 段(text/42-ch05-5-recurrent-neural-networks.txt:669,搜「Landslide」)与第 645 段(搜「solar」);「CNN 能处理变长序列」挂 AlexNet 在第 50 段(搜「Krizhevsky」)。参考文献多为滑坡/太阳辐照/燃料电池等应用论文。

  14. 出处:「5 Recurrent Neural Networks」第 566 段(text/42-ch05-5-recurrent-neural-networks.txt:566,搜「epochs=1」)与第 539 段(搜「epochs=10」)。建议段说「specifying 'epochs=1' might not be sufficient」,代码实为 model.fit(..., epochs=10, batch_size=128)

  15. 出处:「5 Recurrent Neural Networks」第 580 段(text/42-ch05-5-recurrent-neural-networks.txt:580,搜「clipping」)。原文:LSTM 缓解梯度消失但仍有梯度爆炸,梯度裁剪是应对手段;难并行见第 207 段。