跳到主要内容

隐状态与三道门 — 「我生在上海……所以我的母语是」为什么会答不出来

这一章讲三件事: 序列数据为什么需要第三种接线法; 循环网络那份「边走边改写的小笔记」是怎么工作的、又为什么会失灵; 以及三道门怎么把它救回来——救到什么程度,又在哪里停下。

它在全书链条里的位置: 上一章对付空间,这一章对付顺序。 这一章末尾那个解不开的死结,就是第 09 章注意力机制登场的全部理由。 07、09 两章建议连着读。

1. 序列数据特殊在哪

图像的信息藏在「谁挨着谁」里,文字和语音的信息藏在另一种结构里:谁在谁后面

书里给的例子很小:「小明吃」后面接什么?很可能是「饭」「面」或「苹果」, 几乎不会是「和」或「吃」1。第三个词依赖前两个词; 一段语音的第五帧延续前四帧;一支股票的明天取决于昨天和上周。 这一类数据的共同点:单独看任何一个点都没意义,意义在顺序里。

拿你已经会的两种网络来对付它,各有一道坎:

  1. 长度不固定。 一句话可能 5 个词,也可能 50 个词, 而前馈网络的输入个数是写死的;填零或截断能凑合,但都不理想2;
  2. 依赖跨得远。 「小明说他没看见小红,因为她藏在桌子后面」—— 要弄清「她」指谁,得跨越大半句话把前后信息连起来, 而前馈网络压根没有建立这种跨位置联系的机制3

于是有了第三种接线法:循环网络。 它的核心件是一个随时间变化、不断被改写的内部向量,叫隐状态—— 下一节就讲它。

2. 隐状态:给网络一份边走边改写的笔记

循环网络的想法,用读书来比方最准。

你读一句话的时候,不是每读一个新词就把前文忘光: 你脑子里有一份「目前读到哪里、讲了什么」的理解,每读一个词, 就拿这份旧理解和这个新词合在一起,形成一份新理解。 隐状态就是那份理解——每处理完一个词,它就被改写一次, 改写成「旧笔记 + 刚读到的词」的混合体4

读「我」 读「生」 读「在」 读「上海」
│ │ │ │
▼ ▼ ▼ ▼
笔记1 ────→ 笔记2 ────→ 笔记3 ────→ 笔记4 ────→ ……
每改写一次,都把旧笔记和刚读到的词揉在一起

这张图看的是循环:同一份笔记沿着句子一路传、一路被改写,信息靠它从句首带到句尾。

书里的说法:这就像你读一句话的过程—— 每读一个词,都会基于前文的理解消化当前词,同时更新你对整句话的理解5。 因为这份笔记是在时间步之间来回传递的,所以叫「循环」。

3. 时间上共享权重:句子多长,参数都不变

上一章的卷积在空间上共享:同一个模板滑遍全图。 这一章在时间上做同一件事:每一个时间步用的是同一套权重

读到第 3 个词时「揉笔记」的那组数,和读到第 50 个词时用的是同一组。 参数数量和句子长度完全无关6——5 个词的句子是这套参数, 500 个词的段落还是这套参数。

这个性质对变长序列至关重要,也正是它让循环网络在 2010 年代中期 成为机器翻译、语音识别的标配。2016 年 Google 公布的神经机器翻译系统, 用的就是多层循环网络7

但「每一步都用同一套权重」同时也是它的死结所在。下一节就是死结本身。

4. 走查:「我生在上海……所以我的母语是」

这一章的主走查,是书里那个让人心头一沉的填空题:

我生在上海,小时候和外婆住在外滩的一条弄堂里,后来搬到了浦东的一个新小区…… (中间三百个字)……所以我的母语是__8

要填对这个空(「上海话」或「普通话」), 模型必须把开头的「我生在上海」一路记到句尾。 拿第 2 节那份笔记来走一遍,看看会发生什么。

笔记每被改写一次,旧内容都要经过一次权重乘法才能进新笔记。 乘法这个东西有个脾气:每次乘一个小于 1 的数,内容就缩一点; 每次乘一个大于 1 的数,内容就胀一点。而句子有几百个词,就要连乘几百次。

连乘的后果,用一组数感受一下。 下面这组数是为演示编的,不是真实网络的数值: 假设每改写一次,「我生在上海」这份信息最多留下八成(0.8):

改写了多少次开头那份信息还剩参照物
10 次0.8¹⁰ ≈ 0.107只剩约一成
20 次0.8²⁰ ≈ 0.012只剩约百分之一
50 次0.8⁵⁰ ≈ 0.000014基本等于没有了

这张表看的是指数衰减的脾气:不是慢慢变淡,是每过一段就抹掉一个量级。 三百个字的中间段,足够把它抹得干干净净。

反过来,如果每步乘的数大于 1,麻烦一样大:内容会指数级放大, 几十步之后爆成天文数字。前者叫梯度消失,后者叫梯度爆炸—— 往回传的「该往哪拧」的信号,走的是同一条连乘的路, 所以笔记内容传不动,学习信号也传不动9

朴素循环网络在这个填空题上几乎必败:不是它不聪明,是开头那份信息物理上传不到结尾。 书里的话:「信息一路衰减,到结尾已经看不清开头了」10

5. 长短期记忆:三道门和一条高速公路

1997 年,两位研究者提出了专门治这个病的结构,名字叫长短期记忆(LSTM)11。 它的解法不是换掉那份笔记,而是在笔记旁边再修一条几乎不设卡的高速公路

这条高速公路是另一个随时间传递的向量,叫细胞状态。 和第 2 节那份笔记的区别在于:笔记每步都要被整个改写, 而细胞状态默认原样通过——信息放上去,就能近乎不衰减地传到很远的地方12

当然,不能什么都往高速公路上放,也不能永远不下来。 所以配了三道门,每道门都是一个小小的神经网络,输出一个 0 到 1 之间的数, 意思是「开多大」:0 是完全关死,1 是完全打开13:

它管什么用高速公路的话说
遗忘门上一段的细胞状态,留多少旧信息还值不值得继续往前运
输入门当前这个新词,写多少进去新货要不要装车
输出门细胞状态里有多少变成当前笔记这一站卸多少货下来用

这张表看的是分工:高速公路负责「传得远」,三道门负责「该记的记、该忘的忘、该用的用」。

回到第 4 节那道填空题。读到「我生在上海」时, 输入门可以把这条信息写上高速公路;中间三百个字, 遗忘门一直开着(接近 1),这条信息就几乎原样地待在车上; 读到「所以我的母语是」时,输出门把它卸下来。 指数衰减那条连乘的路,被这条加法为主的近路绕开了。

它还有一个更省料的简化版,只留两道门,参数更少、训练更快, 很多任务上效果和三门版相当14

但要诚实地说:三道门是缓解,不是根治。 真正长的依赖——比如一段五百字的叙述——它仍然吃力。 这一点是第 9 节的伏笔,先记住。

6. 双向:有时候得看后文

到目前为止,这份笔记只从左往右传。但有时候,理解一个词需要看它的后面

书里的例子:「苹果刚发布了新手机」——要判断「苹果」是公司还是水果, 得看到后面的「手机」15。从左往右读的网络,读到「苹果」时后面还没读, 只能猜。

解法对称得漂亮:同时跑两个方向。一个网络从左往右读, 另一个从右往左读,每个位置把两个方向的笔记拼起来。 这样每个位置都带着前后两边的上下文(周围已出现的词)16

这个「双向」的想法后来被 BERT(靠「遮住词再猜词」自学语言规律的著名模型)继承了下来—— 只是实现换成了第 09、10 章要讲的那块积木。那是后话。

7. 序列到序列:把一句话变成另一句话

循环网络最重要的一种用法,是处理「输入一句话、输出另一句话」的任务, 最典型的就是翻译。这个用法有个名字,叫序列到序列

它用两个循环网络,分工像一次口译17:

  1. 编码器:把整句英文从头读到尾,读完之后, 它最后那份笔记被当成整句话的浓缩——一个叫上下文向量的东西;

  2. 解码器:从这份浓缩出发,一个词一个词地把中文写出来。

"How are you" → 编码器逐词读完 → 一份浓缩笔记 → 解码器逐词写出 → "你好吗"

这张图看的是翻译的老办法:整句话先被压成一份固定大小的笔记,再从它展开成另一种语言。

2014 年,有人给解码器加了一个动作:每写一个词, 就回头去原句的各个位置「查一遍」,动态决定这次参考哪些源词。 翻译质量立刻大幅提升18这个「回头查一遍」的动作,就是注意力机制第一次被证明有效的地方。 当时它只是循环网络的配件;三年后它会把整个循环结构掀掉。先记住这个出场。

8. 那个固定向量,装不下长句子

第 7 节的老办法有一个明显的软肋,书里点得很直接: 整句话被压缩成一个固定大小的向量,对长句子损失严重19

这个软肋和第 4 节的死结是同一个东西的两种长相。 无论是一份不断改写的笔记,还是一份固定大小的浓缩, 它们都是一座独木桥:开头到结尾的全部信息,都必须从这座桥上过。 桥就那么大,句子越长,掉下去的东西越多。

循环网络的老办法:开头 ════════╗
║ 独木桥(隐状态 / 固定向量)
结尾 ════════╝
信息要过桥,桥太窄,挤掉一大半

下一章的办法: 开头 ════════════════╗
任意两个位置直连,不挤桥 ║
结尾 ════════════╝

这张图看的是下一章的起点:与其把桥修宽,不如不走了——让任意两个位置直接对话。

怎么直接对话,第 09 章讲。这一章你只需要带走这个死结的形状: 信息被迫一步步传,传得越远越模糊,而语言恰恰到处是长距离的联系。

9. 三种结构的分工

到这里,三种基础网络凑齐了。书里给的分工,值得完整抄下来20:

网络对付什么数据它先替机器信了什么
前馈网络独立样本:一行表格、一组固定个数的特征「输入各部分互不依赖」
卷积网络空间数据:图像、医学影像「相邻的更相关;同一模式随处出现」
循环网络时间数据:文本、语音、时间序列「后面的取决于前面的」

这张表就是第 04 章那句「结构本身就是一种先验」的三份答卷。

三者的共同地基完全一样:多层神经元 + 非线性开关 + 梯度下降。 差别只在怎么按数据的特点设计归纳偏置。书里补了一句很重的话: 没有归纳偏置的网络,理论上能学任何东西,实际上什么都学不好21

10. 怎么选一个网络

面对一个新任务,书里给了一张按四个问题往下走的清单22,压缩成一页:

先问再问参考结论
数据是什么型?表格先梯度提升树,别硬上神经网络
图像数据少选卷积,数据海选视觉 Transformer
文本/语音今天主流直接用第 10 章那块积木
数据有多少?几百到几千条简单模型或拿预训练模型微调,别从零训
百万以上可以承受从头训
算力有多少?一块消费级显卡小模型、原型、学习
多卡集群(把许多张卡连成一台逻辑机器)才谈得上大模型
业务要什么?要可解释透明模型优先,神经网络配解释工具
要实时小模型 + 模型压缩

这张表最值得记住的是行序:先数据、再算力、最后才是模型。 新手最常见的错误是倒过来——先选一个时髦的模型,再回去凑数据和算力。

11. 循环这条线没有死

2018 年之后,循环网络在语言任务上的主力地位基本被取代, 书里写得明白:今天主流做法通常不再从零训练 LSTM23

但它的思想没有死。 近几年出现的一类新架构——状态空间(用一个随时被改写的「状态」概括全部历史)模型,, 在某种程度上可以看作循环思想的回归:它们试图把循环网络的效率, 和下一章要讲的那种架构的能力结合起来24

书里给这件事的评语值得抄:历史往往不是直线—— 今天被替代的方法,明天可能以新的形式复兴25。 记住这句话,第 11 章讲长文成本时你还会再想起它。

12. 作者的判断与证据

有证据的部分。 指数衰减与爆炸是连乘的数学事实; LSTM 的三道门结构是 1997 年论文的内容;2016 年 Google 翻译系统用多层循环网络是公开史实; 「固定向量装不下长句」有当年翻译质量随句长下降的实验记录。

要分开看的三处:

  1. 「理论上可以捕捉任意长的依赖」。 书里自己也说这是理论。 第 4 节那组衰减数是我们为演示编的,真实网络每步留下多少,取决于学出来的权重, 没有固定值——但「连乘会指数级放大或缩小」这件事是确定的。
  2. 「三道门大大缓解」。 书里紧接着补了「只是改善而非根治」, 半句都不能省。省掉后半句,会以为这个问题 1997 年就解决了。
  3. 「双向比单向好」。 书里只给了「苹果」一个例子。 双向的代价是计算翻倍,而且生成任务(必须从左往右写)根本用不了它—— 这也是为什么今天的生成模型(负责凭空造出新样本的那一类)是单向的,第 10 章会讲。

判断(我们的,不是书里的):这一章真正的主角不是循环网络,是第 4 节那张衰减表。 「连乘几百次」这四个字,是过去三十年神经网络一半架构创新的总发动机: 三道门是为了绕开它,残差连接是为了绕开它,下一章的注意力还是为了绕开它。 看懂这张表,后面每一章你都能自己回答「它为什么要被发明出来」。 如果错,会错在: 我们把循环网络写得像一条死路。 它在短序列、低延迟(响应快、等待短)、小模型场景里今天仍然合用,状态空间模型更是它的直系后代。 「被取代」指的是语言大模型这个主战场,不是所有战场。

13. 边界与局限

  • 三道门内部的具体结构没有展开。 每道门的小网络长什么样、 输入是什么,这一版只讲到「输出 0 到 1 之间的一个数」。

  • 循环网络怎么训练没有讲。 沿时间展开的反向传播(把误差从输出逐层倒推、算出每个参数该往哪调的算法),书里基本跳过, 只留下了「信号走同一条连乘的路」这个结论。

  • 情感分析(判断一句话是夸还是损)那个例子只讲了形状。 「东西挺好,就是快递太慢了」这种转折句, 循环网络能抓住重点,但书里没给具体成绩数字26

  • 「几百字就传不动」没有精确边界。 多长的依赖算「长」, 取决于任务和训练,书里没给量化(变成确切数字)的临界点。

  • 状态空间模型只给了一个名字。 它具体怎么把循环和注意力的好处拼起来, 书里留了一句话,没有展开。

14. 可带走的

  1. 序列数据的意义在顺序里:长度不固定、依赖跨得远。 这是前两种网络都对付不了它的原因。
  2. 隐状态就是一份边走边改写的笔记:旧笔记 + 新词 = 新笔记。
  3. 每个时间步共享同一套权重,所以句子多长参数都不变。 这既是它的强项,也是死结的一半。
  4. 连乘的脾气:每步留八成,五十步后只剩十万分之一点四。 信息传不动,学习信号也传不动。
  5. 三道门 + 一条高速公路:默认原样通过,该记的记、该忘的忘、该用的用。 这是缓解,不是根治。
  6. 判断「苹果」是公司还是水果,要看后文。 双向 = 两个方向各跑一遍再拼起来。
  7. 翻译的老办法是把整句压成一个固定向量再展开——长句必损。 这是独木桥问题。
  8. 注意力第一次被证明有效,是在 2014 年的翻译里当配件。 三年后它掀掉了整张桌子。
  9. 三种网络 = 三份先验。 选网络就是选「你先替机器信世界有哪种结构」。
  10. 被替代不等于死。 循环的思想正以新的形式回来。

15. 原文地图

主题原书章原文位置
序列数据两特殊第3章 从神经元到深度网络text/04-ch03.txt:336(搜「长度不固定」) · :337(搜「长程的」)
隐状态第3章 从神经元到深度网络text/04-ch03.txt:344(搜「隐状态」)
读书比方第3章 从神经元到深度网络text/04-ch03.txt:365(搜「每读一个词」)
时间上共享权重第3章 从神经元到深度网络text/04-ch03.txt:369(搜「共享同一套参数」)
梯度消失与爆炸第3章 从神经元到深度网络text/04-ch03.txt:377(搜「指数级衰减」)
上海填空题第3章 从神经元到深度网络text/04-ch03.txt:380(搜「我生在上海」)
LSTM 与三道门第3章 从神经元到深度网络text/04-ch03.txt:384(搜「长短期记忆网络」) · :388(搜「细胞状态」) · :390(搜「输出在 0 到 1 之间」)
GRU第3章 从神经元到深度网络text/04-ch03.txt:393(搜「门控循环单元」)
2016 Google 翻译第3章 从神经元到深度网络text/04-ch03.txt:396(搜「2016 年公布的神经机器翻译系统」)
转折句例子第3章 从神经元到深度网络text/04-ch03.txt:421(搜「东西挺好」)
双向第3章 从神经元到深度网络text/04-ch03.txt:434(搜「苹果刚发布了新手机」)
序列到序列第3章 从神经元到深度网络text/04-ch03.txt:438(搜「序列到序列」) · :441(搜「上下文向量」)
固定向量装不下第3章 从神经元到深度网络text/04-ch03.txt:444(搜「对长句子损失严重」)
注意力首次有效第3章 从神经元到深度网络text/04-ch03.txt:445(搜「Bahdanau」)
三种结构分工第3章 从神经元到深度网络text/04-ch03.txt:493(搜「三种基础神经网络」) · :505(搜「理论上能学任何东西」)
怎么选网络第3章 从神经元到深度网络text/04-ch03.txt:456(搜「基于数据类型」) · :467(搜「基于数据量」) · :474(搜「基于计算资源」) · :481(搜「基于业务约束」)
循环没有死第3章 从神经元到深度网络text/04-ch03.txt:429(搜「状态空间模型」) · :430(搜「历史往往不是直线」)

Footnotes

  1. 出处:「第3章 从神经元到深度网络」第 331 段(text/04-ch03.txt:331,搜「小明吃」)。

  2. 出处:「第3章 从神经元到深度网络」第 336 段(text/04-ch03.txt:336,搜「长度不固定」)。 原文:「填零(padding)或截断当然能凑合,但都不理想」。

  3. 出处:「第3章 从神经元到深度网络」第 337 段(text/04-ch03.txt:337,搜「长程的」)。 原文的「她藏在桌子后面」例子与正文同。

  4. 出处:「第3章 从神经元到深度网络」第 344 段(text/04-ch03.txt:344,搜「隐状态」)。 原文把隐状态称为「网络的短期记忆」。

  5. 出处:「第3章 从神经元到深度网络」第 365 段(text/04-ch03.txt:365,搜「每读一个词」)。

  6. 出处:「第3章 从神经元到深度网络」第 369 段(text/04-ch03.txt:369,搜「共享同一套参数」)。 原文:「参数数量不随序列长度变化,这对处理变长序列至关重要」, 并把它和卷积在空间上共享卷积核并列。

  7. 出处:「第3章 从神经元到深度网络」第 396 段(text/04-ch03.txt:396,搜「2016 年公布的神经机器翻译系统」)。

  8. 出处:「第3章 从神经元到深度网络」第 380 段(text/04-ch03.txt:380,搜「我生在上海」)。

  9. 出处:「第3章 从神经元到深度网络」第 376 段(text/04-ch03.txt:376,搜「每一步都经过一次权重矩阵乘法」) 与第 377 段(text/04-ch03.txt:377,搜「指数级衰减」)。 第 4 节那张表里的 0.8 是我们为演示编的,不是书里的数;书里只说「特征值小于 1 就指数级衰减」。 0.8¹⁰≈0.107、0.8²⁰≈0.012、0.8⁵⁰≈0.000014,这三个数读者可以自己用计算器核。

  10. 出处:「第3章 从神经元到深度网络」第 382 段(text/04-ch03.txt:382,搜「信息一路衰减」)。 原文:「朴素 RNN 几乎做不到,信息一路衰减,到结尾已经看不清开头了」。

  11. 出处:「第3章 从神经元到深度网络」第 384 段(text/04-ch03.txt:384,搜「长短期记忆网络」)。 提出者是塞普·霍赫赖特和于尔根·施密德胡贝尔,1997 年;遗忘门是 2000 年的改进。

  12. 出处:「第3章 从神经元到深度网络」第 387 段(text/04-ch03.txt:387,搜「信息高速公」) 与第 388 段(text/04-ch03.txt:388,搜「细胞状态」)。 「加法为主的近路」是我们的说法:细胞状态的传递以「原样照抄 + 按门添减」为主, 避开了每步一次的完整权重乘法。

  13. 出处:「第3章 从神经元到深度网络」第 390 段(text/04-ch03.txt:390,搜「输出在 0 到 1 之间」)。 三道门的分工(遗忘/输入/输出)在第 388 到 390 段。

  14. 出处:「第3章 从神经元到深度网络」第 393 段(text/04-ch03.txt:393,搜「门控循环单元」)。 这个简化版叫 GRU,只有重置门和更新门两道。

  15. 出处:「第3章 从神经元到深度网络」第 434 段(text/04-ch03.txt:434,搜「苹果刚发布了新手机」)。

  16. 出处:「第3章 从神经元到深度网络」第 435 段(text/04-ch03.txt:435,搜「两个方向的 RNN」)。

  17. 出处:「第3章 从神经元到深度网络」第 438 段(text/04-ch03.txt:438,搜「序列到序列」) 与第 441 段(text/04-ch03.txt:441,搜「上下文向量」)。 「像一次口译」是我们的比方。

  18. 出处:「第3章 从神经元到深度网络」第 445 段(text/04-ch03.txt:445,搜「Bahdanau」)。 原文:「2014 年 Bahdanau 等人引入注意力机制解决了这个问题…… 这个改进大大提升了翻译质量」。

  19. 出处:「第3章 从神经元到深度网络」第 444 段(text/04-ch03.txt:444,搜「对长句子损失严重」)。

  20. 出处:「第3章 从神经元到深度网络」第 493 段(text/04-ch03.txt:493,搜「三种基础神经网络」)。 表里「它先替机器信了什么」那一列是我们照第 04 章的归纳偏置框架补的。

  21. 出处:「第3章 从神经元到深度网络」第 505 段(text/04-ch03.txt:505,搜「理论上能学任何东西」)。 原文:「没有归纳偏置的网络(比如让 MLP 处理图像), 理论上能学任何东西,实际上什么都学不好」。

  22. 出处:「第3章 从神经元到深度网络」第 456 段(text/04-ch03.txt:456,搜「基于数据类型」)、 第 467 段(text/04-ch03.txt:467,搜「基于数据量」)、 第 474 段(text/04-ch03.txt:474,搜「基于计算资源」)、 第 481 段(text/04-ch03.txt:481,搜「基于业务约束」)。 这张表是我们把书里的四段文字压成的;「行序最值得记住」是我们的判断,不是书里的。

  23. 出处:「第3章 从神经元到深度网络」第 425 段(text/04-ch03.txt:425,搜「2018 年之后」) 与第 427 段(text/04-ch03.txt:427,搜「不再从零专门训练」)。

  24. 出处:「第3章 从神经元到深度网络」第 429 段(text/04-ch03.txt:429,搜「状态空间模型」)。 书里点名的例子是 Mamba。

  25. 出处:「第3章 从神经元到深度网络」第 430 段(text/04-ch03.txt:430,搜「历史往往不是直线」)。

  26. 出处:「第3章 从神经元到深度网络」第 421 段(text/04-ch03.txt:421,搜「东西挺好」)。 原文说词袋模型难以分辨这种转折,而循环网络能通过隐状态累积上下文捕捉到。