跳到主要内容

序列与循环神经网络 — 语言模型、隐状态与时间的反向传播

这一章讲四件事: 序列数据和表格数据的本质区别(自回归:拿序列自己的历史预测它的下一步); 语言模型是什么、怎么评估(n-gram 与 perplexity); RNN 怎么用隐状态携带历史; 以及沿时间反向传播(BPTT)为什么难、实战中怎么截断。 这是通往注意力与 Transformer(第 12、13 章)的必经之路。

1. 序列问题的本质:历史的长度在变

到目前,每条数据是一个定长向量。换成序列: 输入是一串有序的向量 x₁,…,x_T——文本的词、病人的每日检查、股价的每日收盘。 序列之间可以假设独立同分布,序列内部的各步绝不独立: 第 10 天的用药强烈依赖前 9 天发生了什么1

想预测下一步,就是要估 P(x_t | x_{t-1}, …, x_1)。 麻烦在于:条件的个数随 t 变——第 3 步有 2 个历史值,第 100 步有 99 个, 而我们所有的模型都要定长输入。两条出路2:

  • τ 窗口:只回头看最近 τ 步,拍成定长向量,用普通模型。 如果丢掉更早的历史不损失预测力,就说序列满足 τ 阶马尔可夫(「只看最近、不问更早」的假设,得名自俄国数学家)条件——给定最近 τ 步,未来与更早的过去无关;
  • 隐状态:维护一个摘要 h_t,每步更新 h_t = f(x_t, h_{t-1})—— 它「随身带着」到当前为止的全部历史(有损压缩)。 这叫潜变量自回归模型,RNN 就是它最著名的实现。

书里还有一个因果视角:文本为什么按从左到右分解概率, 而不是反过来?因为现实是因果结构的—— 改变 x_t 影响 x_{t+1} 的分布,却不影响 x_{t-1} 的; 正向(顺着时间)往往是更容易学的方向3

2. 语言模型与 n-gram:计数法的四个死穴

语言模型估计的是整段文本的联合概率 P(x₁,…,x_T)。 它有什么用?作者给的例子一听就懂4: 语音识别的两个候选「to recognize speech」和「to wreck a nice beach」, 发音几乎一样,语言模型能毙掉第二个; 「dog bites man」比「man bites dog」常见得多。

用链式法则,联合概率 = 逐个条件概率的乘积, 于是语言模型 = 不断回答「给定上文,下一个词是什么」。 第 τ 阶马尔可夫近似下,条件只依赖最近几个词: unigram(不看上文)、bigram(看前 1 个)、trigram(看前 2 个)。 这些模型本质就是计数:「deep」后面跟「learning」的次数 ÷ 「deep」的次数。

计数法有四个死穴5: 稀有组合太多(三词组合大批从来没出现过,概率估成 0); 要存下所有计数; 完全不懂词义(「cat」和「feline」出现在相似语境,计数法看不出来); 长句子几乎必然是从未见过的新组合。 Laplace 平滑(给每个计数加个小常数)能救「零概率」, 但救不了其余三条——所以要换神经模型。

perplexity:下一步平均有几个真实选择

评估语言模型的指标(打分用的量)叫 perplexity(困惑度): 平均交叉熵取指数。直觉读法是—— 模型每预测下一个词时,平均「相当于在几个词之间拿不定主意」6:

perplexity = exp( −(1/n) Σ_t log P(x_t | 上文) )

完美模型:对正确词永远给概率 1 → perplexity = 1
均匀乱猜:对词表每个词给相同概率 → perplexity = 词表大小(必须赢过的基线)
给正确词打 0 分 → perplexity = ∞

它同时有信息论读法(第 05 章的等价):编码这段文本平均每词需要的比特数。 好预测 ⇔ 好压缩,在语言模型这里变成了可以天天看的仪表盘。

词表(模型认识的全部词的花名册)有多大,决定「均匀乱猜」的 perplexity 是多少—— 这是最差的及格线。

这条及格线叫基线(baseline,什么都不学也能拿到的兜底水平);新模型必须先赢过它。

3. RNN:把历史压进隐状态

n-gram 的另一个死法:存 |V|^n 个计数,阶数一高就爆炸。 RNN 的思路:不存历史本身,存历史的摘要7:

H_t = φ( X_t·W_xh + H_{t-1}·W_hh + b ) ← 隐状态更新
O_t = H_t·W_hq + b_q ← 当前步输出

每步:把当前输入 X_t 和上一步隐状态 H_{t-1} 各自线性变换后相加、过激活函数, 得到新的隐状态;输出层再从隐状态出预测。 两个设计要点:

  • 所有时间步共享同一组参数——第 3 步和第 300 步用的是同一个 W_hh, 所以参数量不随序列长度增长8; 这也是「recurrent(循环)」一词的由来:同一个计算在时间维上反复套用;
  • 隐状态的更新,等价于「把 [X_t; H_{t-1}] 拼接起来过一个全连接层」—— RNN 没有新零件,只是把 MLP 按时间铺开。

作者特意区分:隐藏层(hidden layer)和隐状态(hidden state)是两个概念—— 前者是网络结构里不可见的层,后者是「只能由之前时间步算出」的当前步输入9

实战两个细节:文本切成 token(标记——模型眼里的最小单位,一个词或一个字)时输入和目标错开一个位置 (输入第 t 个词,目标是第 t+1 个词)——语言模型因此是自监督的; 训练时要梯度裁剪(梯度范数超阈值就缩回去)—— 因为偶发的巨大梯度会毁掉一次更新,原因下一节讲。

4. BPTT:沿时间展开的反向传播,与它为什么崩

RNN 的反向传播叫 BPTT(backpropagation through time): 把循环计算沿时间展开成 T 层的前馈(信号只从输入往输出单向流、不回头)网络,照常反传; 同一参数在每一步都出现,它的梯度 = 各步梯度之和 (这种「同一参数多处共享」叫 weight tying,和卷积核共享同理)10

崩的原因在第 06 章见过同款:展开后的网络有 T 层, 梯度是 T 个「∂h_t/∂h_{t-1}」矩阵的连乘—— 序列上千步,就是上千个矩阵连乘,消失或爆炸几乎必然11

三种应对,书里给了冷静的比较12:

策略做法评价
全计算完整反传到序列开头慢;且对初始条件过敏(蝴蝶效应),实践不用
规则截断只反传最近 τ 步梯度有偏,但偏向简单稳定的模型——实践标配
随机截断以一定概率随机截断,期望上无偏理论漂亮,实测并不比规则截断好(方差变大)

反直觉的一点是:截断带来的「短视」恰恰是想要的—— 它把模型偏向短期依赖,起到正则化效果。 而爆炸梯度另有保险丝:第 3 节说的梯度裁剪—— 裁剪管爆炸,门控(给信息通道装一扇可学习的门,决定放多少过去)管消失,后者是第 11 章 LSTM 的主题。

5. 作者的判断与证据

书里给了证据的: n-gram 的稀疏性问题(词频统计); perplexity 的三种极端;RNN 参数共享的结构推导; BPTT 的连乘分析(a_t = b_t + c_t·a_{t-1} 递推展开)。

作者的立场: 「规则截断优于随机截断」是基于实验的判断, 他给了三条理由(短依赖够用、方差增大、短视本身就是正则); 「τ 窗口 vs 隐状态」没有普适答案,取决于依赖有多长。

判断(我们的,不是书里的): RNN 的隐状态是「用固定大小的向量, 承诺装下任意长的历史」——这个承诺就是它的天花板。 第 11 章的门控是在「怎么装得更聪明」上做文章; 第 12 章的注意力干脆换思路:不装了,需要时回头查原文。 读这三章时记住这条线:RNN 的问题不是工程问题,是「承诺过重」。 如果错,会错在: 说 RNN「装不下」是一种直觉化表述; 严格说 f 足够强时 h_t 可以无损存下全部历史(书里自己也承认了这一点)—— 瓶颈更准确地说是「可训练的压缩」:梯度难以穿过长链把早期信息保真地传下来。

6. 边界与局限

  • τ 窗口丢弃长程依赖;隐状态压缩有损且难训——两者都没有解决「真正的长依赖」;
  • RNN 逐步串行,长序列训练慢(这是后来注意力架构兴起的工程动机之一);
  • perplexity 只衡量「下一个词」的预测,不等于下游任务质量;
  • 原书从零实现与框架实现两版(字符级《时间机器》),拆解只取机制。

7. 可带走的

  1. 序列的本质困难:历史长度随时间变;τ 窗口或隐状态,二选一;
  2. 语言模型 = 反复回答「下一个词是什么」;它是自监督的(输入目标错一位);
  3. n-gram 死于稀疏、存储、不懂词义、长句必新;
  4. perplexity = 下一步平均在几个真实选择之间犹豫;均匀基线(什么都不学、每个词等概率的兜底模型) = 词表(模型认识的全部词的花名册)大小;
  5. RNN:H_t = φ(X_tW + H_{t-1}W + b),参数共享,不随长度增长;
  6. BPTT 的崩 = T 个矩阵连乘;规则截断是标配,短视本身是正则;
  7. 梯度裁剪管爆炸;消失要门控(第 11 章)。

8. 原文地图

主题原书章原文位置
序列内部不独立Working with Sequencestext/54-working-with-sequences.txt:40(搜「depend heavily」)
两条出路、潜变量自回归Working with Sequencestext/54-working-with-sequences.txt:223(搜「latent autoregressive models」)
因果方向Working with Sequencestext/54-working-with-sequences.txt:373(搜「causally structured」)
speech/beach 例子Language Modelstext/56-language-models.txt:19(搜「wreck a nice beach」)
n-gram 死穴、LaplaceLanguage Modelstext/56-language-models.txt:128(搜「Laplace smoothing」) · text/56-language-models.txt:156(搜「unsuitable」)
perplexity 三种极端Language Modelstext/56-language-models.txt:211(搜「geometric mean」) · text/56-language-models.txt:215(搜「upper bound」)
隐状态定义Recurrent Neural Networkstext/57-recurrent-neural-networks.txt:13(搜「hidden state」)
隐藏层 vs 隐状态Recurrent Neural Networkstext/57-recurrent-neural-networks.txt:25(搜「two very different concepts」)
参数不随长度增长Recurrent Neural Networkstext/57-recurrent-neural-networks.txt:133(搜「does not grow」)
weight tying、蝴蝶效应BPTTtext/60-backpropagation-through-time.txt:37(搜「weight tying」) · text/60-backpropagation-through-time.txt:157(搜「butterfly effect」)
截断策略比较BPTTtext/60-backpropagation-through-time.txt:174(搜「truncated」) · text/60-backpropagation-through-time.txt:237(搜「regularizing effect」)

Footnotes

  1. 出处:「Working with Sequences」第 40 段(text/54-working-with-sequences.txt:40,搜「depend heavily」)。

  2. 出处:「Working with Sequences」第 223 段(text/54-working-with-sequences.txt:223,搜「latent autoregressive models」)。

  3. 出处:「Working with Sequences」第 373 段(text/54-working-with-sequences.txt:373,搜「causally structured」)。引 Hoyer et al. 2009:x_{t+1}=f(x_t)+ε 成立而反向不成立。

  4. 出处:「Language Models」第 19 段(text/56-language-models.txt:19,搜「wreck a nice beach」)。

  5. 出处:「Language Models」第 156 段(text/56-language-models.txt:156,搜「unsuitable」)与第 310 段(text/56-language-models.txt:310,搜「not enough frequency」)。

  6. 出处:「Language Models」第 211 段(text/56-language-models.txt:211,搜「geometric mean」)与第 215 段(text/56-language-models.txt:215,搜「upper bound」)。

  7. 出处:「Recurrent Neural Networks」第 13 段(text/57-recurrent-neural-networks.txt:13,搜「hidden state」)。|V|^n 的存储爆炸见同章开头。

  8. 出处:「Recurrent Neural Networks」第 133 段(text/57-recurrent-neural-networks.txt:133,搜「does not grow」)。

  9. 出处:「Recurrent Neural Networks」第 25 段(text/57-recurrent-neural-networks.txt:25,搜「two very different concepts」)。

  10. 出处:「Backpropagation Through Time」第 37 段(text/60-backpropagation-through-time.txt:37,搜「weight tying」)。

  11. 出处:「Backpropagation Through Time」第 50 段(text/60-backpropagation-through-time.txt:50,搜「1000 matrix products」)。

  12. 出处:「Backpropagation Through Time」第 157 段(text/60-backpropagation-through-time.txt:157,搜「butterfly effect」)、第 174 段(text/60-backpropagation-through-time.txt:174,搜「truncated」)与第 237 段(text/60-backpropagation-through-time.txt:237,搜「regularizing effect」)。随机截断出自 Tallec & Ollivier 2017。