跳到主要内容

循环神经网络 — 网络的记忆

这一章讲三件事: 「把上一步的输出喂回下一步」这一步为什么就是记忆; 简单 RNN 为什么记不长、门控(用 0~1 的开关决定记多少、忘多少;GRU/LSTM 的机关)怎么修; 以及 seq2seq:把一个序列压成一个向量再展开成另一个序列。 主走查是一条方波穿过梳状滤波器——全部循环网络的祖先形态。

1. 顶层全景

普通网络: x → [网络] → y 每个样本独立,互相不认识

循环网络: x(t) ──▶ [网络] ──▶ y(t)
▲ │
└── h(t) ┘ h = 隐藏状态:网络对"过去"的全部记忆
每一步更新一次,边看新输入边改写

图说:与前三章的差别只有一处——网络多了一根"回自己"的线。
展开成时间轴看,它其实就是"同一个网络被复制成很多份,依次相连"[^1]。

2. 核心原理

2.1 主走查:方波穿过梳状滤波器

循环的最简形态不是神经网络,是信号处理里用了几十年的梳状滤波器: 每一步的输出 = 当前输入的一半 + 上一步输出的一半1。拿书里的方波走一遍:

输入: 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
规则: h = 0.5×x + 0.5×h (h 初始为 0)
输出: 0.00 0.00 0.00 0.00 0.50 0.75 0.88 0.94 0.97 0.98 0.99 1.00
(输入变 0 后对称地降回 0)

每个输出都是书里的实测值2。看数字怎么动:输入跳到 1 的那一刻,输出只到 0.50; 但 0.50 留在了 h 里,下一步变成 0.5+0.25=0.75,再下一步 0.875…… 输入早就不在了,h 里的余温还在。h 就是记忆:它把整个过去的输入,压成「当前这一格」的状态。 混响、镶边这类声音效果,底层都是这个回送结构3

给它加上两样东西——sigmoid 非线性、独立的输出权重——就是最简循环神经网络: h(t) = sigmoid(U·x + V·h(t−1) + b),y(t) = sigmoid(W·h(t))。 U 管新输入的分量,V 管旧记忆的分量4。原书代码里 U、V、W 随机初始化,输出当然是乱的—— 「随机初始化、训练见」仍是全书的节奏。

2.2 走查第二站:预测明天中午的气温

任务数据:Jena 气候数据集——德国耶拿马克斯·普朗克研究所的气象站记录, 2009–2016 年共 8 年,14 项测量,每 10 分钟一条5。 任务:用过去两天(288 步)的 14 项指标(气温、气压、湿度这类天气量),预测明天中午(滞后 72 步)的气温。 整理出来是 2,918 条「288 步 × 14 特征」的输入序列6

训练前把所有特征按训练集的均值和标准差(数的典型散开幅度)归一;原书同时提醒:归一化会抹掉数年尺度的缓变趋势, 要紧的任务应考虑先去趋势7

先立一个基准,再谈网络:原书先算了最土的预测—— 「明天中午 = 今天中午」,平均绝对误差 2.67 °C(归一化后 0.32)。 没有这个基准,后面每个网络都「看着还行」;有了它,才有资格谈「真的好」8

网络关键参数验证 MAE(归一化)对比基准 0.32
简单 RNN2 个隐藏单元,仅 39 个参数0.36(训练 0.36 / 验证 0.38)输给基准
堆叠 RNN两层、每层 10 单元,约 1,600 参数接近基准没赢
GRU门控 + dropout(训练时随机关闭一部分神经元)0.20.27明显赢了
LSTM4 门 + dropout 0.3约 0.27平 GRU,更复杂任务上潜力更大

简单 RNN 输给「明天=今天」这件事值得原样记住:模型没赢过一句常识, 就谈不上模型有用——这是全书反复出现的「先立基准」纪律的第一次实弹演习9

2.3 记不住与忘不掉:门怎么修

堆两层就露出 RNN 的病根:梯度要在时间轴上连乘很多次,要么消失(乘出零,记不住远处的输入), 要么爆炸(乘出无穷,训练崩盘);参数一多还容易过拟合10。 门控单元是结构层的解药。是一个输出 0 到 1 的开关(还是 sigmoid,不过是当阀门用): 乘 0 = 全关,乘 1 = 全通,乘 0.5 = 放一半11

GRU(门控循环单元)有两条门12:

管什么拧到 0 / 拧到 1
更新门旧记忆有多少进入新状态1=旧记忆全保留;0=大换血
重置门旧记忆有多少参与当前计算0=把新输入当新序列开头;1=续着旧记忆算

LSTM(长短期记忆网络)更豪华:四条门——输入门(来什么该收)、遗忘门(旧状态留多少)、 细胞门(生成新的候选内容)、输出门(内部状态暴露多少给输出)13。 门越多参数越多,建模能力更强、过拟合风险也更高——LSTM 项目里 dropout 因此从 0.2 加到 0.3。 结果上两者打平(0.27),原书的口径是:复杂任务、长程依赖场景,LSTM 通常更有后劲14

dropout 顺带讲清(它在 GRU 一节引入):训练时每一步随机关掉一部分神经元, 逼其他神经元分担它们的工作;预测时全员上岗。这解释了本项目一个反直觉现象: 验证损失持续低于训练损失——因为训练时网络是「缺员上阵」,验证时全员到齐15

2.4 走查第三站:seq2seq,把英文压成一句「话」再展开成西语

翻译这类「让机器处理人类语言」的任务有个行话,叫 NLP——自然语言处理(用计算机处理人类语言的那支技术)的缩写;它用编码器-解码器骨架(序列进、序列出),但里面装的是 RNN:

"The cat sits on the mat."
│ 逐词读入(每词一个时间步)

编码器 RNN ──▶ 最后一步的隐藏状态 = 上下文向量
│ (整句话的意思,压成一个向量)

解码器 RNN ──▶ 逐词吐出 "El gato se sienta en la alfombra"
每吐一个词,把它接回输入,再吐下一个

2.5 先把句子变成数字

流程五件事,全部是工程决策16。前三件把句子变成网络认得的数字:

  1. 分词:把句子切成词(用正则过滤掉噪音符号);

  2. 词表:每个词配一个整数编号,网络只认整数;

  3. 嵌入:整数再变成向量——嵌入层是一张可学习的查找表。

查找表的行数 = 词表大小——全部用到的词的清单。

2.6 再从数字生成翻译

后两件把数字变回句子:

  1. 编码器读完整句,交出上下文(它通读全句后记在隐藏状态里的内容)向量;

  2. 解码器从上下文向量起步,自回归(把自己上一步的输出,当作下一步的输入)地生成目标句。

训练里有一个著名技巧——teacher forcing(教师强制): 解码器每一步的输入,按概率用真值里的上一个词,否则用它自己上一步的预测17。 真值喂得越多,训练越快越稳;但代价是模型习惯了「上一步永远正确」, 推理时没有真值可喂,一步走错步步错——这叫曝光偏差18。 probability 调多少,又是「快而脆 vs 慢而稳」的平衡,原书原话:要靠实验找。

3. 作者的判断与证据

  • 有证据的:梳状滤波器的数值输出、四代网络的气温预测曲线、 翻译例句(「This book is very interesting.」译对,复杂长句出错)。
  • 作者的经验值:学习率、dropout 比例、teacher 概率全靠实验调; 简单 RNN 输给常识基准——这个「失败」本身是原书刻意保留的教学设计。
  • 历史脉络:Elman 1990 把 RNN 引入时序建模;Hochreiter 与 Schmidhuber 1997 发明 LSTM, 动机直指梯度消失;Cho 2014 的 RNN 编码器-解码器与 Sutskever 2014 的 seq2seq 是本章项目的直接底本——也是下一章注意力的改造对象19

4. 边界与局限

边界说明
顺序计算,快不起来每一步依赖上一步,无法并行——这是第 10 章 Transformer 起义的直接原因
上下文向量是瓶颈整句压成一个向量,长句必丢信息(下一章开篇的例证)20
简单 RNN 的记忆半径很短梯度连乘的宿命;门控缓解但不消灭
策略脆弱训出来的翻译模型对训练分布外的句式泛化有限(teacher forcing 的双刃剑)
dropout 是训练期专属验证/测试时全开——忘了这一点,评估数字会莫名其妙地变差

5. 可带走的

  1. 记忆 = 把上一步的状态接回下一步:梳状滤波器五分钟讲完循环网络的全部思想;
  2. 隐藏状态 h 是网络对过去的全部账本——账本多长,记忆就多长;
  3. 先立常识基准再谈模型:「明天=今天」这个 2.67 °C 是全章最有价值的一个数;
  4. 门 = 0 到 1 的阀门:GRU 两门,LSTM 四门;门越多越强也越容易过拟合;
  5. 验证损失低于训练损失不是 bug,是 dropout 的签名;
  6. seq2seq = 压缩(编码器)→ 向量 → 展开(解码器);上下文向量是它的阿喀琉斯之踵;
  7. teacher forcing 换速度、欠曝光偏差——训练条件和部署条件不一致,迟早要还;
  8. 嵌入层 = 可学习的「整数→向量」查找表,下一章的注意力就建立在它之上。

6. 原文地图

主题原书章原文位置
RNN 动机与记忆Understanding Recurrent Neural Networkstext/52-fm-understanding-recurrent-neural-networks.txt:5(搜「form of memory」)
梳状滤波器与回送Understanding Recurrent Neural Networkstext/52-fm-understanding-recurrent-neural-networks.txt:9(搜「feedback loop」) · text/52-fm-understanding-recurrent-neural-networks.txt:11(搜「reverb」)
方波走查数值Understanding Recurrent Neural Networkstext/52-fm-understanding-recurrent-neural-networks.txt:35(搜「Output Series」)
时间展开Understanding Recurrent Neural Networkstext/52-fm-understanding-recurrent-neural-networks.txt:47(搜「unfolded in time」)
最简 RNN 公式Understanding Recurrent Neural Networkstext/52-fm-understanding-recurrent-neural-networks.txt:65(搜「sigmoid(U * input_data」)
Jena 数据集Predicting Temperature with Recurrent Neural Networkstext/53-fm-predicting-temperature-with-recurrent-neural-net.txt:7(搜「Max Planck Institute」)
滞后 72 步、2918 条序列Predicting Temperature with Recurrent Neural Networkstext/53-fm-predicting-temperature-with-recurrent-neural-net.txt:78(搜「prediction lag」) · text/53-fm-predicting-temperature-with-recurrent-neural-net.txt:80(搜「2918」)
归一化与去趋势提醒Predicting Temperature with Recurrent Neural Networkstext/53-fm-predicting-temperature-with-recurrent-neural-net.txt:96(搜「detrending」)
常识基准 2.67 °CPredicting Temperature with Recurrent Neural Networkstext/53-fm-predicting-temperature-with-recurrent-neural-net.txt:148(搜「2.67」)
简单 RNN 输给基准Predicting Temperature with Recurrent Neural Networkstext/53-fm-predicting-temperature-with-recurrent-neural-net.txt:286(搜「worse than the 0.32」)
梯度消失/爆炸Predicting Temperature with Recurrent Neural Networkstext/53-fm-predicting-temperature-with-recurrent-neural-net.txt:331(搜「vanishing gradient problem」)
堆叠 1600 参数Predicting Temperature with Recurrent Neural Networkstext/53-fm-predicting-temperature-with-recurrent-neural-net.txt:350(搜「1,600 trainable parameters」)
GRU 两门Predicting Temperature with Recurrent Neural Networkstext/53-fm-predicting-temperature-with-recurrent-neural-net.txt:360(搜「update gate」) · text/53-fm-predicting-temperature-with-recurrent-neural-net.txt:362(搜「reset gate」)
dropoutPredicting Temperature with Recurrent Neural Networkstext/53-fm-predicting-temperature-with-recurrent-neural-net.txt:364(搜「randomly deactivates」)
GRU 0.27 与验证更低Predicting Temperature with Recurrent Neural Networkstext/53-fm-predicting-temperature-with-recurrent-neural-net.txt:388(搜「validation loss of 0.27」)
LSTM 四门Predicting Temperature with Recurrent Neural Networkstext/53-fm-predicting-temperature-with-recurrent-neural-net.txt:396(搜「four gates」)
LSTM ≈0.27、长期依赖更强Predicting Temperature with Recurrent Neural Networkstext/53-fm-predicting-temperature-with-recurrent-neural-net.txt:417(搜「validation loss of about 0.27」)
seq2seq 与上下文向量Project 7A: Translating with Recurrent Neural Networkstext/54-fm-project-7a-translating-with-recurrent-neural-net.txt:5(搜「context vector」)
分词与词表Project 7A: Translating with Recurrent Neural Networkstext/54-fm-project-7a-translating-with-recurrent-neural-net.txt:31(搜「tokenization」) · text/54-fm-project-7a-translating-with-recurrent-neural-net.txt:124(搜「vocabulary」)
嵌入层Project 7A: Translating with Recurrent Neural Networkstext/54-fm-project-7a-translating-with-recurrent-neural-net.txt:361(搜「embedding layer」)
teacher forcingProject 7A: Translating with Recurrent Neural Networkstext/54-fm-project-7a-translating-with-recurrent-neural-net.txt:454(搜「teacher forcing」)
曝光偏差Project 7A: Translating with Recurrent Neural Networkstext/54-fm-project-7a-translating-with-recurrent-neural-net.txt:480(搜「exposure bias」)
评估无 teacher forcingProject 7A: Translating with Recurrent Neural Networkstext/54-fm-project-7a-translating-with-recurrent-neural-net.txt:482(搜「without teacher forcing」)
RNN 谱系Seminal Works and Further Readingtext/56-fm-seminal-works-and-further-reading.txt:3(搜「Finding Structure in Time」) · text/56-fm-seminal-works-and-further-reading.txt:5(搜「Long Short-Term Memory」) · text/56-fm-seminal-works-and-further-reading.txt:9(搜「Sequence to Sequence」)

Footnotes

  1. 出处:「Understanding Recurrent Neural Networks」第 9 段(text/52-fm-understanding-recurrent-neural-networks.txt:9,搜「feedback loop」)、第 26 段(text/52-fm-understanding-recurrent-neural-networks.txt:26,搜「50 percent」)。

  2. 出处:「Understanding Recurrent Neural Networks」第 35 段(text/52-fm-understanding-recurrent-neural-networks.txt:35,搜「Output Series」)。

  3. 出处:「Understanding Recurrent Neural Networks」第 11 段(text/52-fm-understanding-recurrent-neural-networks.txt:11,搜「reverb」)。

  4. 出处:「Understanding Recurrent Neural Networks」第 65-70 段(text/52-fm-understanding-recurrent-neural-networks.txt:65,搜「sigmoid(U * input_data」)。

  5. 出处:「Predicting Temperature with Recurrent Neural Networks」第 7 段(text/53-fm-predicting-temperature-with-recurrent-neural-net.txt:7,搜「Max Planck Institute」)。

  6. 出处:「Predicting Temperature with Recurrent Neural Networks」第 78-80 段(text/53-fm-predicting-temperature-with-recurrent-neural-net.txt:78,搜「prediction lag」)。

  7. 出处:「Predicting Temperature with Recurrent Neural Networks」第 96 段(text/53-fm-predicting-temperature-with-recurrent-neural-net.txt:96,搜「detrending」)。

  8. 出处:「Predicting Temperature with Recurrent Neural Networks」第 132 段(text/53-fm-predicting-temperature-with-recurrent-neural-net.txt:132,搜「commonsense benchmark」)、第 148 段(text/53-fm-predicting-temperature-with-recurrent-neural-net.txt:148,搜「2.67」)。

  9. 出处:「Predicting Temperature with Recurrent Neural Networks」第 286 段(text/53-fm-predicting-temperature-with-recurrent-neural-net.txt:286,搜「worse than the 0.32」)。

  10. 出处:「Predicting Temperature with Recurrent Neural Networks」第 331 段(text/53-fm-predicting-temperature-with-recurrent-neural-net.txt:331,搜「vanishing gradient problem」)。

  11. 出处:「Predicting Temperature with Recurrent Neural Networks」第 358-360 段(text/53-fm-predicting-temperature-with-recurrent-neural-net.txt:358,搜「gates」)。

  12. 出处:「Predicting Temperature with Recurrent Neural Networks」第 360 段(text/53-fm-predicting-temperature-with-recurrent-neural-net.txt:360,搜「update gate」)、第 362 段(text/53-fm-predicting-temperature-with-recurrent-neural-net.txt:362,搜「reset gate」)。

  13. 出处:「Predicting Temperature with Recurrent Neural Networks」第 396 段(text/53-fm-predicting-temperature-with-recurrent-neural-net.txt:396,搜「four gates」)。

  14. 出处:「Predicting Temperature with Recurrent Neural Networks」第 417 段(text/53-fm-predicting-temperature-with-recurrent-neural-net.txt:417,搜「long-term dependencies」)。

  15. 出处:「Predicting Temperature with Recurrent Neural Networks」第 364-366 段(text/53-fm-predicting-temperature-with-recurrent-neural-net.txt:364,搜「randomly deactivates」)、第 388 段(text/53-fm-predicting-temperature-with-recurrent-neural-net.txt:388,搜「consistently lower than the training loss」)。

  16. 出处:「Project 7A: Translating with Recurrent Neural Networks」第 5 段(text/54-fm-project-7a-translating-with-recurrent-neural-net.txt:5,搜「context vector」)、第 31 段(text/54-fm-project-7a-translating-with-recurrent-neural-net.txt:31,搜「tokenization」)、第 124 段(text/54-fm-project-7a-translating-with-recurrent-neural-net.txt:124,搜「vocabulary」)、第 361 段(text/54-fm-project-7a-translating-with-recurrent-neural-net.txt:361,搜「embedding layer」)。

  17. 出处:「Project 7A: Translating with Recurrent Neural Networks」第 454 段(text/54-fm-project-7a-translating-with-recurrent-neural-net.txt:454,搜「teacher forcing」)。

  18. 出处:「Project 7A: Translating with Recurrent Neural Networks」第 480 段(text/54-fm-project-7a-translating-with-recurrent-neural-net.txt:480,搜「exposure bias」)。

  19. 出处:「Seminal Works and Further Reading」第 3 段(text/56-fm-seminal-works-and-further-reading.txt:3,搜「Finding Structure in Time」)、第 5 段(text/56-fm-seminal-works-and-further-reading.txt:5,搜「Long Short-Term Memory」)、第 7 段(text/56-fm-seminal-works-and-further-reading.txt:7,搜「RNN Encoder-Decoder」)、第 9 段(text/56-fm-seminal-works-and-further-reading.txt:9,搜「Sequence to Sequence」)。

  20. 出处:「Project 8A: Using Attention to Improve Language Translation」第 5 段(text/59-fm-project-8a-using-attention-to-improve-language-t.txt:5,搜「significant information loss」)。