句子、声音、传感器记录、股价——这些数据的意义由顺序决定。给一次只看一张的神经网络加上一个记住“刚才看到的东西”的环,就成了 RNN;再给这份记忆加上不让它变模糊的门(gate),就成了 LSTM 和 GRU。我们会用数字追踪记忆是否真的留了下来,并通过实验确认:即使有门,学习也不会自动成功。
在 3-1 中,果蝇判断了影子是否“正在靠近”。可如果只拿到一张拍下影子的照片,会怎样呢?
3-2·3-3 的神经网络接收一个输入、给出一个输出就结束了。它不会记得之前看到过什么。这样的神经网络叫作前馈(只向前流动的)神经网络。一张同样大小的影子,可能正在靠近,也可能正在远去。答案不在单个画面里,而在画面的顺序里。3-1 的实验把两张画面(先·后)一起输入,也是这个原因。
数列“100 → 110 → 120”(上升)和“120 → 110 → 100”(下降)由同样的三个数组成。把它们输入前馈神经网络有两种方法。
ht = f(xt, ht−1)每个时刻重复使用同一组权重
解决第 2 节问题的思路很简单:处理每一步时,同时接收上一步生成的摘要(隐藏状态)。画成图,就是从方框出来的箭头又回到自身,形成一个环。把这个环沿时间轴一路展开,看起来就像同一个方框按步数连成一串的前馈神经网络。这些方框全都使用同一组权重。正如 3-3 的 CNN 在所有“位置”上使用同一个滤波器,RNN 在所有“时刻”上使用同一组权重。所以长度变了,权重数量也不变。
ht = tanh(wx·xt + wh·ht−1)Elman, 1990
ct = ft ⊙ ct−1 + it ⊙ gt · ht = ot ⊙ tanh(ct)Hochreiter & Schmidhuber, 1997 · 遗忘门 Gers 等, 2000
| 符号 | 名称 | 范围 | 作用(本单元中设定的权重) |
|---|---|---|---|
| ct | 细胞状态 | 无限制 | 运送长期记忆的传送带。只经过一次乘法(f)和一次加法就传到下一步 |
| ft | 遗忘门 | 0~1 (σ) | 保留多少过去的记忆。用 σ(bf) 固定为常数 |
| it | 输入门 | 0~1 (σ) | 写入多少新值。σ(10 × 起始标记 − 5):只在第一步打开 |
| gt | 候选值 | −1~1 (tanh) | 要写入的内容。tanh(3 × xt) |
| ot | 输出门 | 0~1 (σ) | 输出多少记忆。σ(5) ≈ 0.993,始终保持打开 |
| ht | 隐藏状态(输出) | −1~1 | ot ⊙ tanh(ct)。送往下一层以及下一步的门 |
| ⊙ | 逐元素相乘 | 向量相同位置的元素相乘。像本例这样只有一个数时,就是普通乘法 |
为了便于说明,这个单元的权重是人为设定的。规则是“只在第一步写入,之后几乎不擦除”。所以翻转第一个信号,20 步之后的记忆也会准确地翻转。第 4 节的 RNN 在同样的输入下翻转第一个信号,最后的值到小数点后第四位都完全相同。这说明 LSTM 是一种能够容纳长期记忆的结构。细胞状态只靠一次乘法(f ≈ 1)和加法延续,所以反向传递的梯度也几乎不减小 [R3]。
补充两点。第一,1997 年最初的 LSTM 并没有遗忘门。遗忘门是 Gers 等人为了解决输入无休止地延续时细胞状态只增不减的问题而加上的 [R4],如今所说的“LSTM”通常指这个版本。第二,结构能够容纳记忆,并不保证学习能找到那组权重。代码 2 的实验展示了这一差别(第 6 节下方)。
ht = (1 − zt) ⊙ ht−1 + zt ⊙ h̃tCho 等, 2014
GRU 把 LSTM 的遗忘门和输入门合并成一个更新门 z。过去的记忆保留 (1 − z),空出的部分由新候选 h̃ 按 z 填满。保留得越多,写入得越少;写入得越多,保留得越少——就像一杆秤。此外又加了一个重置门 r,决定在计算候选时使用多少过去的记忆。它不区分细胞状态和隐藏状态,因此也没有输出门 [R5]。
权重组从 LSTM 的 4 组减少到 3 组,按教科书公式,参数恰好是 3/4。Keras 默认的 GRU 多一套偏置,所以稍多一些(隐藏 16、输入 1 时为 912 个对 1,152 个,约 0.79 倍)。哪一个更好,因任务而异。
每一步都是 ±1、正确答案是第一步的数列(后面各步都是长得一模一样的干扰项)。隐藏 16、Adam 0.005、30 个轮次(epoch)、训练 2,000 条·测试 1,000 条。两个种子的结果分别列出。50% 左右相当于瞎猜,即学习失败。
训练网络把输入压缩到狭窄的中间层(瓶颈),再还原成原样。不需要正确答案——输入本身就是正确答案。果蝇的蘑菇体则恰恰相反,是把输入扩展开。
不同的书和论文,图示符号都略有差异。这里整理本系列的约定,并按时间顺序看看序列模型是如何一边解决问题一边发展过来的。
| 符号 | 含义 | 前馈 | RNN | LSTM | GRU | 自编码器 |
|---|---|---|---|---|---|---|
| 方框 | 一层(权重乘法 + 激活函数) | ✓ | ✓ | ✓ | ✓ | ✓ |
| → | 数值流动的方向 | 只向前 | 向前 + 下一时刻 | 向前 + 下一时刻 | 向前 + 下一时刻 | 只向前 |
| ↺ 环 | 再次接收上一时刻的值 | — | h | h 和 c | h | —(序列型用 RNN) |
| σ | 压到 0~1 的门(gate) | — | — | 3 个 (f, i, o) | 2 个 (z, r) | — |
| tanh | 压到 −1~1 的激活函数 | 可选 | ✓ | 候选 g 与输出 | 候选 h̃ | 可选 |
| ⊙ · ⊕ | 逐元素相乘 · 相加 | — | — | ✓ | ✓ | — |
| 沙漏 | 先变窄再变宽的层大小 | — | — | — | — | ✓ |
回答三个问题,就能选出一个作为起点的模型。这不是正确答案,而是第一个候选。最终决定始终要用验证数据比较后做出(3-2 第 9 节)。
两段代码都只使用 Colab 默认安装的库。点击“下载笔记本(.ipynb)”后,在 Colab 中通过文件 → 上传笔记本打开,或者复制后粘贴到新笔记本的单元格中。
用同一个数列计算第 4 节只有一个数的 RNN 和第 5 节手工设定的 LSTM。隐藏状态、反向传递的梯度、翻转第一个信号时的变化,都会得到与页面相同的数字。想换成自己的数据,只需修改 SEQ。
用三种模型学习每一步都是 ±1、正确答案是第一步的数列。长度 10 · 50 · 100,种子 2 个。第 6 节下方的表格直接由这段输出生成。
这是粘贴到 ChatGPT、Qwen、Claude 等 AI 助手中的提示词。点击“复制”时,所选代码会一并附在提示词后面。把〔 〕里的内容换成自己的情况即可。
AI 的回答只是起点。它提出的论文·数值·库函数务必对照原文和官方文档核实。如果在竞赛·论文中借助了 AI,请按照主办方和期刊的规定说明使用的事实和范围。
与正文中黄色虚线下划线相同的词典。整个系列使用统一的写法。点击章节名可跳到首次出现的位置。
类比是理解的第一步,但也可能成为误解的种子。果蝇·大脑类比标注了强度。直接 有证据表明实际在做同样的事 · 部分 只有部分性质相似 · 无 尚未发现对应的东西
| 概念 | 日常类比 | 果蝇·大脑类比 | 类比失灵之处 |
|---|---|---|---|
| 隐藏状态 | 读书时在脑中积累的情节梗概 | 部分 神经元群体的持续活动 | 大脑的短时记忆由什么回路维持,因脑区而异,仍在研究之中 |
| 展开·权重共享 | 同一位员工每天按同一套工作守则干活 | 无 | 大脑不会在每个时刻制造相同的“副本”。展开是为了计算而画的图 |
| 梯度消失 | 传话游戏中最初的话变得模糊 | 无 反向传播本身尚未在大脑中得到证实 | 传话是向前传递的信号变模糊,而梯度消失是向后传递的学习信号变小 |
| 细胞状态 | 工厂的传送带 | 无 | 传送带上的物品原样前进,而细胞状态每一步都会按遗忘门的比例略微减小 |
| 门 | 水龙头(开多大,0~1) | 部分 调节突触传递的神经调质(例如:果蝇蘑菇体中的多巴胺) | 多巴胺参与学习(连接强度的变化)。LSTM 的门是决定每一步流向的计算,其本身并不是学习 |
| GRU 的更新门 | 秤:旧记忆减得越多,装进的新内容越多 | 无 | 与真正的秤不同,每一步、每个数都使用不同的比例 |
| 自编码器瓶颈 | 把冗长的会议总结成三行,再重新展开写出来 | 部分 反例:蘑菇体不是压窄,而是扩展 | 与人写摘要不同,自编码器不由人来决定“什么重要”,只靠还原误差来决定 |
E-1 作者简介 · E-2 学术参考文献 · E-3 图片参考资料
这是面向讲师、实务 OJT 负责人和辅导老师的教学指南。时间为预估值,请根据实际课堂调整。
| 对象 | 学完 3-2 的大学生·职场人士。处理传感器·日志·句子·时间序列数据的从业者 |
|---|---|
| 先修知识 | 3-2 的反向传播与梯度消失、sigmoid·tanh。了解 3-3 的权重共享,第 3 节会更容易 |
| 学习目标 | ① 用两种方法(平均、拼接)说明前馈网络为什么难以处理顺序 ② 用数字展示 RNN 的隐藏状态与梯度消失 ③ 说明 LSTM·GRU 的门起什么作用,并区分“结构能够容纳记忆”与“学习能找到它” |
| 预计时间 | 阅读 45~55 分钟 · 动画演示 25 分钟 · Colab 实践 30 分钟(代码 1 10 分钟,代码 2 运行 5 分钟 + 解读 15 分钟) |
导入 5 分钟(第 1 节的相同画面)→ 第 2·3 节 10 分钟 → 第 4 节梯度消失 10 分钟 → 第 5 节翻转第一个信号 15 分钟 → 第 6 节下方实验表讨论 5 分钟 → 检测题 5 分钟。
用第 9 节选择助手给团队数据分类 15 分钟 → 第 4·5 节 20 分钟 → 代码 2 运行·解读 30 分钟(“结果因种子而异”该如何报告)→ 第 7 节异常检测思路 15 分钟 → 提示词卡片 10 分钟。
入门者只看第 1·3·5·9 节。中级者先让他们手算第 5 节的 c 跟三步,再与代码 1 的 lstm 函数对照,并亲自推导第 6 节的参数公式。
| 章节 | 停下来提问的问题 | 操作提示 |
|---|---|---|
| 1 一次一张 | “只看第三张画面,能知道是不是在靠近吗?” | 停在“当前的一张画面”,再切换到“顺序” |
| 2 前馈 | “如果每次句子长度都不同,拼接会怎样?” | 交替点击长度 3 和 5,观察输入格数的变化 |
| 3 环与展开 | “展开的五个方框,权重有几组?” | 在折叠图 ↔ 展开图之间交替点击 |
| 4 RNN | “把 w_h 调大,记忆留得更久,为什么学习反而更难?” | 从 0.9 改成 1.5,比较 h12 和梯度的数字 |
| 5 LSTM | “翻转第一个信号,20 步之后的记忆会怎样?” | 在 b_f = 5 下切换 +1/−1,再改成 b_f = 1 看差别 |
| 6 GRU | “有门的 LSTM·GRU 为什么在 T = 100 时失败了?” | 把实验表中种子 0 和 1 并排阅读 |
| 7 自编码器 | “瓶颈为 4 时误差突然减小的原因是什么?” | 把瓶颈从 1 增加到 4,观察绿色曲线,再切换到蘑菇体视图 |
| 8 图示规则·脉络 | “1997 年的 LSTM 与如今的 LSTM 有什么不同?” | 点击年表,翻到 2000 年的遗忘门 |
| 9 选择助手 | “我们团队的数据属于哪一类?” | 让每位参与者选择答案,再讨论推荐结果出现分歧的地方 |
| 误解 | 正确解释 | 要展示的场景 |
|---|---|---|
| 用了 LSTM,长期记忆问题就解决了 | LSTM 是能够容纳长期记忆的结构。学习能否找到那组权重,取决于任务·训练时间·初始化 | 第 6 节下方实验表(T = 100) |
| SimpleRNN 只要过几步就一定会遗忘 | 视初始化和任务而定,它有时也能记得相当久。在本实验中,直到 T = 50 两个种子都成功了 | 第 6 节下方实验表(T = 50) |
| LSTM 从一开始就有遗忘门 | 1997 年的原始论文里没有,是 2000 年 Gers 等人加上的 | 第 8 节年表 |
| GRU 总是比 LSTM 更快、更好 | 只是参数少到约 3/4,性能因任务而异。在本实验的 T = 50 中,只有 GRU 失败了 | 第 6 节 |
| 自编码器模仿了大脑的记忆方式 | 它是压窄后做摘要的计算技术。果蝇的蘑菇体反而是扩展 | 第 7 节蘑菇体视图 |
顺序丢失了。100 → 110 → 120(上升)和 120 → 110 → 100(下降)的平均值都是 110,神经网络无法区分。
h_1 = tanh(1) ≈ 0.762, h_2 = tanh(0.9 × 0.762) = tanh(0.686) ≈ 0.595.
要连乘 19 步,所以是 0.9933 的 19 次方 ≈ 0.880 倍。第 5 节的实际值(0.988 → 0.864,约 0.875 倍)略小一些,是因为输入门没有完全关闭(0.007),干扰信号一点点渗了进来。这个数列的干扰信号中 −1 有 10 个,+1 有 9 个。
一组 = 16 × (16 + 1) + 16 = 288。SimpleRNN 288,LSTM 4 × 288 = 1,152,GRU 3 × 288 = 864。Keras 默认 GRU 多出 48 个偏置,为 912。
不可以。像第 5 节那样把权重设定得当,LSTM 就能容纳长期记忆。失败的意思是梯度下降在 30 个轮次内没能找到那组权重。要改变训练时间、学习率、数据量重新实验,并用多个种子重复,才能下结论。
在代码 1 的 lstm 函数中,把输入门改为始终打开(i = σ(5))。计算翻转第一个信号时 20 步之后的细胞状态会怎样,并用两句话写出输入门的作用。
在代码 2 中尝试至少一种把 T = 100 的失败变为成功的方法(增加轮次、改变学习率、增加数据等)。用 3 个以上的种子把结果做成表格报告,并有理有据地写出什么起了作用。
| 入门者 | 跳过第 4 节的梯度图和第 7·8 节,讲解也不会断。只需把第 5 节的“翻转第一个信号”讲清楚 |
|---|---|
| 进阶 | 把第 4 节的梯度连乘公式推广到隐藏大小为多维(矩阵)的情形,讨论特征值与梯度消失·爆炸的关系 [R2] |
| 延伸学习 | Sangsun Ahn,《面向商业的数据科学》讲义(数据科学总览) · STEP [K-数字] 人工智能自然语言处理(与 3-5·3-8 相关) · STEP [K-数字] 金融科技数据分析基础(与 3-6 相关) |
| 讲师用资料 | 检测题的评分标准和作业参考答案见教师用答案页面 (3-7) |
「3-7 序列模型」篇读完了。实验室的成员们各说一句话帮你总结。