跳转至

04. 语言模型与 RNN

官方 PPT 来源第 4 讲官方 PPT

本讲对应 CS224n 第 4 讲 Language Models and Recurrent Neural Networks。PPT 开头直接强调:language modeling 是本课程最重要的概念之一,它引出了大部分现代 NLP。换句话说,从这一讲开始,课程正式从“词向量 + 前馈分类器”进入“用神经网络预测语言序列”的主线。


本讲学习目标

学完这一讲,你应该能从零回答下面这些问题:

  1. Language model 到底预测什么?
  2. 为什么“预测下一个词”能支撑很多 NLP 能力?
  3. 怎样把一整段文本的概率分解成一串 next-word probabilities?
  4. n-gram language model 的 Markov assumption 是什么?
  5. n-gram 概率怎样用计数估计?
  6. smoothing 和 backoff 分别解决哪类稀疏问题?
  7. 为什么 n-gram 增大后稀疏和存储问题会变严重?
  8. fixed-window neural language model 比 n-gram 好在哪里,又有什么硬伤?
  9. RNN 为什么能处理任意长度输入?
  10. RNN-LM 的 hidden state、embedding、output distribution 分别是什么?
  11. RNN-LM 训练时为什么每个时间步都有 loss?
  12. Teacher forcing 和生成时 rollout 有什么区别?
  13. Perplexity 是什么,为什么越低越好?
  14. Backpropagation through time 为什么会把重复权重的梯度相加?
  15. Vanishing gradient 和 exploding gradient 分别怎样影响 RNN?
  16. Gradient clipping 能解决什么,不能解决什么?
  17. Seq2seq NMT 为什么可以看成 conditional language model?
  18. RNN encoder-decoder 的 bottleneck problem 是什么?

PPT 脉络

部分 PPT 内容 本讲义对应章节
语言模型任务 next-word prediction、文本概率、LM 应用、next-word prediction 能做什么 1-4
n-gram LM n-gram 定义、Markov assumption、计数估计、生成、稀疏和存储问题 5-10
神经 LM fixed-window neural LM、embedding、hidden layer、固定窗口问题 11-12
RNN-LM RNN 架构、共享参数、训练、teacher forcing、BPTT、生成、perplexity 13-20
RNN 难点 vanishing gradient、exploding gradient、gradient clipping、LSTM/attention/residual 提示 21-25
机器翻译 MT、NMT、encoder-decoder、seq2seq、conditional LM、端到端训练、bottleneck 26-31

1. 什么是 Language Modeling?

Language modeling 的任务是:

给定前面的词,预测下一个词的概率分布。

PPT 的例子是:

the students opened their ______

下一个词可能是:

books
laptops
exams
minds

语言模型不是只输出一个答案,而是输出整个词表上的概率分布。形式化地,给定词序列:

\[ x^{(1)}, x^{(2)}, \ldots, x^{(t)} \]

语言模型要计算:

\[ P(x^{(t+1)} \mid x^{(t)}, \ldots, x^{(1)}) \]

其中 \(x^{(t+1)}\) 可以是词表 \(V\) 中任何一个词:

\[ V=\{w_1,\ldots,w_{|V|}\} \]

这就是 next-word prediction。

1.1 为什么它是概率分布?

因为语言通常不是唯一答案。

例如:

the students opened their ______

books 很合理,laptops 也合理,minds 有修辞意味,exams 也可能出现。语言模型需要表达这些候选词的相对可能性。

所以输出不是:

下一个词 = books

而是类似:

P(books | context) = 0.40
P(laptops | context) = 0.20
P(exams | context) = 0.10
...

2. 语言模型也能给整段文本打概率

PPT 说,language model 也可以被看成:

给一段文本分配概率的系统。

如果一段文本是:

\[ x^{(1)}, x^{(2)}, \ldots, x^{(T)} \]

那么它的概率可以用链式法则分解:

\[ P(x^{(1)},\ldots,x^{(T)}) = P(x^{(1)}) \times P(x^{(2)} \mid x^{(1)}) \times \cdots \times P(x^{(T)} \mid x^{(T-1)},\ldots,x^{(1)}) \]

更紧凑地写:

\[ P(x^{(1)},\ldots,x^{(T)}) = \prod_{t=1}^{T} P(x^{(t)} \mid x^{(t-1)},\ldots,x^{(1)}) \]

这里第一个词 \(x^{(1)}\) 可以理解为在空历史或起始符号之后预测出来。

2.1 这条公式为什么重要?

因为它把“整段话是否自然”转化成了一连串“每个词在前文下是否自然”。

如果每一步都预测得好,整段文本概率就高。

如果某一步出现极不自然的词,整段文本概率就会被拉低。

这就是现代生成模型的基本思想:一个词一个词地预测,每一步都依赖此前已经出现的词。


3. 为什么我们关心 Language Modeling?

PPT 给出两个层面的答案。

3.1 它是衡量语言预测能力的 benchmark

语言模型可以作为标准任务,用来衡量系统预测语言使用的能力。

如果一个模型能更准确地预测下一个词,通常说明它捕捉了更多语言规律,例如:

  • 局部搭配。
  • 句法结构。
  • 语义关联。
  • 篇章上下文。

3.2 它是许多 NLP 任务的子组件

PPT 列出很多应用:

  • predictive typing。
  • speech recognition。
  • handwriting recognition。
  • spelling / grammar correction。
  • authorship identification。
  • machine translation。
  • summarization。
  • dialogue。

这些任务都需要生成文本或估计文本概率。

PPT 还直接点明:ChatGPT is an LM。也就是说,理解 language modeling 是理解现代 NLP 的入口。


4. Next-word prediction 为什么这么强?

PPT 给了一组例子,说明“预测下一个词”看似简单,其实会逼模型学很多能力。

4.1 事实知识

Stanford University is located in ______, California.

要预测 Stanford 附近的地点,模型需要知道事实。

4.2 句法

I put ___ fork down on the table.

这里要选择合适的冠词,模型需要懂局部语法。

4.3 指代

The woman walked across the street, checking for traffic over ___ shoulder.

要预测 her,模型需要知道 woman 和后面的代词对应。

4.4 词汇语义和主题

I went to the ocean to see the fish, turtles, seals, and _____.

模型需要知道 ocean 主题下还可能出现什么动物或对象。

4.5 情感

Overall, the value I got from the two hours watching it was the sum total of the popcorn and the drink. The movie was ___.

模型要从前文判断评价倾向。

4.6 推理和算术

PPT 还给了简单推理和数列例子。它想表达的是:足够强的 language model 可能通过 next-word prediction 学会许多看起来不像“语言建模”的能力。


5. n-gram Language Model:深度学习前的经典方法

在深度学习之前,常见做法是 n-gram language model。

5.1 什么是 n-gram?

n-gram 是连续 \(n\) 个词组成的片段。

以:

the students opened their

为例:

  • unigram:thestudentsopenedtheir
  • bigram:the studentsstudents openedopened their
  • trigram:the students openedstudents opened their
  • four-gram:the students opened their

n-gram LM 的思想是:

统计不同 n-gram 在大语料中出现的频率
用这些频率预测下一个词

6. n-gram 的 Markov Assumption

完整语言模型要计算:

\[ P(x^{(t+1)} \mid x^{(t)},x^{(t-1)},\ldots,x^{(1)}) \]

历史太长,无法直接统计。n-gram LM 做 Markov assumption:

下一个词只依赖前面 \(n-1\) 个词。

也就是:

\[ P(x^{(t+1)} \mid x^{(t)},x^{(t-1)},\ldots,x^{(1)}) \approx P(x^{(t+1)} \mid x^{(t)},x^{(t-1)},\ldots,x^{(t-n+2)}) \]

如果是 4-gram LM,就只看前面 3 个词。

例如:

as the proctor started the clock, the students opened their _____

4-gram LM 只看:

students opened their

它会丢掉更远处的 proctor started the clock 等上下文。


7. n-gram 概率怎样用计数估计?

根据条件概率定义:

\[ P(w \mid \text{context}) = \frac{P(\text{context}, w)} {P(\text{context})} \]

统计近似就是用语料计数替代概率。

对 4-gram:

\[ P(w \mid \text{students opened their}) = \frac{ \text{count}(\text{students opened their } w) }{ \text{count}(\text{students opened their}) } \]

PPT 给出的例子:

count(students opened their) = 1000
count(students opened their books) = 400
count(students opened their exams) = 100

于是:

\[ P(\text{books} \mid \text{students opened their}) = \frac{400}{1000} = 0.4 \]
\[ P(\text{exams} \mid \text{students opened their}) = \frac{100}{1000} = 0.1 \]

这个方法很直观:以前在同样上下文后面经常出现什么词,现在就给什么词更高概率。


8. n-gram 的稀疏问题

PPT 分成两个 sparsity problem。

8.1 稀疏问题一:完整 n-gram 没见过

如果:

students opened their w

从未在语料中出现,那么:

\[ \text{count}(\text{students opened their }w)=0 \]

于是:

\[ P(w \mid \text{students opened their})=0 \]

问题是:没见过不等于不可能。很多合理句子可能只是训练语料里没出现过。

PPT 给出的部分解决方案是 smoothing:

给每个 \(w \in V\) 的计数加一个很小的 \(\delta\)

直觉是:不要让没见过的候选词概率直接变成 0。

8.2 稀疏问题二:上下文本身没见过

如果:

students opened their

这个 context 本身从未出现,那么分母为 0:

\[ \text{count}(\text{students opened their})=0 \]

这时对任何 \(w\) 都无法计算概率。

PPT 给出的部分解决方案是 backoff:

不再看完整上下文,只退回到更短上下文。

例如从:

students opened their

退回:

opened their

8.3 为什么 n 不能随便变大?

PPT 明确指出:

Increasing \(n\) makes sparsity problems worse. Typically, we cannot have \(n\) bigger than 5.

\(n\) 越大,模型看的上下文越长,但也越容易遇到从没出现过的组合。

这就是 n-gram 的根本矛盾:

想看更长上下文
-> n 变大
-> 稀疏更严重
-> 概率更难可靠估计

9. n-gram 的存储问题

PPT 还强调 storage problem:

Need to store count for all n-grams you saw in the corpus.

语料越大,见过的 n-gram 越多。

\(n\) 越大,可能的 n-gram 组合越多。

即使只存出现过的 n-gram,也会非常庞大。

所以 n-gram LM 不仅泛化差,还会占用大量存储。


10. n-gram 可以生成文本,但容易不连贯

语言模型可以用来生成文本。方法是:

  1. 给定当前 context。
  2. 得到下一个词的概率分布。
  3. 从分布中 sample 一个词。
  4. 把 sample 出来的词接到文本后面。
  5. 重复。

PPT 用 trigram LM 生成出一段新闻风格文本。它看起来局部语法还可以,但整体不连贯。

原因很直接:

如果模型每次只看三个词左右
它很难维持长距离主题、事件和逻辑

PPT 的结论是:

We need to consider more than three words at a time if we want to model language well.

但增加 \(n\) 又会加剧稀疏和存储问题。

这就引出 neural language model。


11. Fixed-window Neural Language Model

PPT 先问:

How to build a neural language model?

语言模型的输入是词序列,输出是下一个词的概率分布。一个自然想法是:像第 3 讲 NER 一样,用固定窗口。

例如:

as the proctor started the clock the students opened their _____

只取最近几个词:

the students opened their

每个词查 embedding,然后拼接成一个长向量,送入 hidden layer,最后输出词表上的概率分布:

word ids
-> embeddings
-> concatenation
-> hidden layer
-> output distribution over vocabulary

这就是 fixed-window neural language model。

PPT 提到它大致对应 Bengio 等人的 neural probabilistic language model。

11.1 相比 n-gram 的改进

PPT 列出两个改进:

  1. No sparsity problem。
  2. 不需要存储所有出现过的 n-gram。

为什么没有 n-gram 那种稀疏问题?

因为神经模型不是给每个离散 n-gram 单独存一个计数,而是通过词向量和网络参数学习可泛化的模式。

例如:

students opened their books
students opened their laptops

如果 bookslaptops 的表示相近,模型可以把一些统计信息共享过去。


12. Fixed-window Neural LM 的剩余问题

PPT 明确列出它的硬伤。

12.1 固定窗口太小

固定窗口只能看有限历史。

如果依赖距离超过窗口大小,模型就看不到。

12.2 扩大窗口会扩大 \(W\)

窗口越大,拼接向量越长。输入维度增大后,hidden layer 权重矩阵 \(W\) 也会变大。

如果每个词向量维度是 \(d\),窗口长度是 \(k\),输入维度就是:

\[ kd \]

窗口越长,参数量和计算量越大。

12.3 窗口永远不够大

自然语言里可能存在很长距离依赖。固定窗口无法保证覆盖所有相关历史。

12.4 不同位置没有对称性

PPT 指出:

\(x^{(1)}\) and \(x^{(2)}\) are multiplied by completely different weights in \(W\). No symmetry in how the inputs are processed.

意思是:窗口中第 1 个位置和第 2 个位置使用不同权重处理。模型没有天然地表达“同一个词出现在不同时间位置时,应当用同一种机制处理”。

PPT 给出的需求是:

We need a neural architecture that can process any length input.

这就是 RNN。


13. RNN 的核心思想

RNN 是 recurrent neural networks。PPT 给出的核心思想是:

Apply the same weights \(W\) repeatedly.

也就是同一组参数在每个时间步重复使用。

13.1 RNN 的序列结构

对输入序列:

\[ x^{(1)},x^{(2)},\ldots,x^{(T)} \]

RNN 逐步读入词,并维护 hidden state:

\[ h^{(0)},h^{(1)},h^{(2)},\ldots,h^{(T)} \]

可以用下面的递推理解:

\[ e^{(t)} = E x^{(t)} \]
\[ h^{(t)} = f(W_h h^{(t-1)} + W_e e^{(t)} + b_h) \]
\[ \hat{y}^{(t)} = \text{softmax}(U h^{(t)} + b_y) \]

其中:

  • \(x^{(t)}\):第 \(t\) 个词,通常可看成 one-hot。
  • \(E\):embedding matrix。
  • \(e^{(t)}\):第 \(t\) 个词的 embedding。
  • \(h^{(t)}\):读到第 \(t\) 个词后的 hidden state。
  • \(W_h\):hidden-to-hidden recurrent weight。
  • \(W_e\):embedding-to-hidden weight。
  • \(U\):hidden-to-output weight。
  • \(\hat{y}^{(t)}\):给下一个词的预测概率分布。

PPT 图中也使用了 \(E\)\(W_e\)\(W_h\)\(U\) 这些组件。

13.2 Hidden state 的直觉

hidden state 是“到目前为止读过内容”的压缩记忆。

例如读到:

the students opened their

\(h^{(4)}\) 应该包含前面这些词对下一个词预测有用的信息。模型再根据 \(h^{(4)}\) 输出:

books, laptops, exams, ...

的概率分布。


14. RNN 相比 fixed-window LM 的优点和缺点

PPT 列出 RNN 的优点。

14.1 可以处理任意长度输入

因为 RNN 每一步重复使用同样的递推规则:

\[ h^{(t)} = f(W_h h^{(t-1)} + W_e e^{(t)} + b_h) \]

所以序列长度可以是 5,也可以是 500。参数量不会因为输入变长而线性增长。

14.2 理论上可以利用很久之前的信息

\(h^{(t)}\)\(h^{(t-1)}\) 来,而 \(h^{(t-1)}\) 又由更早的 hidden states 来。

所以理论上,第 1 个词的信息可以一路传到第 \(t\) 步。

14.3 模型大小不随上下文长度增加

fixed-window 模型扩大窗口会扩大输入矩阵。RNN 的参数共享,因此更长历史不需要更多参数。

14.4 每个时间步处理方式对称

同一个 \(W_h\)\(W_e\)\(U\) 在每一步使用。PPT 称之为 symmetry in how inputs are processed。

同一个词出现在不同位置时,处理机制一致。

14.5 RNN 的缺点

PPT 也列出两个缺点:

  1. recurrent computation is slow。
  2. 实践中很难访问很多步以前的信息。

第二点就是后面 vanishing gradient 的核心。


15. RNN Language Model 怎样训练?

训练数据是一大段文本序列:

\[ x^{(1)},x^{(2)},\ldots,x^{(T)} \]

RNN-LM 在每个时间步 \(t\) 都输出预测分布:

\[ \hat{y}^{(t)} \]

它表示:

\[ P(x^{(t+1)} \mid x^{(t)},\ldots,x^{(1)}) \]

也就是读到第 \(t\) 个词后,对第 \(t+1\) 个词的预测。

15.1 每个时间步都有 loss

PPT 的例子:

the students opened their exams

训练时:

  • 输入 the,预测 students
  • 输入 students,预测 opened
  • 输入 opened,预测 their
  • 输入 their,预测 exams

\(t\) 步的 loss 是预测分布 \(\hat{y}^{(t)}\) 和真实下一个词之间的 cross entropy。

如果真实下一个词是 \(x^{(t+1)}\),那么:

\[ J^{(t)}(\theta) = - \log \hat{y}^{(t)}_{x^{(t+1)}} \]

其中 \(\hat{y}^{(t)}_{x^{(t+1)}}\) 表示模型在第 \(t\) 步分配给真实下一个词的概率。

15.2 整体 loss

对整个训练序列,把每个时间步的 loss 平均:

\[ J(\theta) = \frac{1}{T} \sum_{t=1}^{T} J^{(t)}(\theta) \]

如果是实际训练,通常不会一次把整个 corpus 都放进内存,而是按句子、文档片段或 batch 计算 loss 和梯度,然后用 SGD 更新参数。


16. Teacher Forcing:训练时为什么喂真实词?

PPT 在训练图中标出 Teacher forcing

训练时,第 \(t+1\) 步的输入通常是语料中的真实词,而不是模型自己上一步采样出来的词。

例如训练句子:

the students opened their exams

即使模型在 the 后面预测错了,下一步仍然喂给它真实的 students,让它学习:

students -> opened

这叫 teacher forcing。

16.1 为什么要这样?

因为训练目标是让每个真实上下文下的下一个词概率变高。如果每一步都用模型自己的错误采样作为下一步输入,训练会变得更不稳定,而且很难并行计算。

PPT 在生成部分会对比:生成时 sampled output becomes next step's input。训练和生成的输入来源不同。


17. Backpropagation Through Time:RNN 怎样反向传播?

RNN 的关键难点是:同一个 \(W_h\) 在每个时间步重复出现。

PPT 问:

What is the derivative of \(J^{(t)}\) with respect to the repeated weight matrix \(W_h\)?

答案是:

The gradient with respect to a repeated weight is the sum of the gradient with respect to each time it appears.

写成公式:

\[ \frac{\partial J^{(t)}}{\partial W_h} = \sum_{i=1}^{t} \left. \frac{\partial J^{(t)}}{\partial W_h} \right|_{(i)} \]

这里 \(\left.\frac{\partial J^{(t)}}{\partial W_h}\right|_{(i)}\) 表示 \(W_h\) 在第 \(i\) 个时间步那次使用对最终 loss 的贡献。

17.1 为什么要相加?

因为同一个参数 \(W_h\) 通过多条时间路径影响 \(J^{(t)}\)

第 3 讲已经讲过:一个变量通过多条路径影响最终输出时,梯度要相加。

RNN 只是把这种“分支相加”沿时间展开了。

17.2 什么是 BPTT?

PPT 给出算法名:

backpropagation through time

做法是把 RNN 按时间展开成一个很深的前馈网络,然后从后往前传播梯度:

t -> t-1 -> t-2 -> ... -> 0

一边反传,一边把共享参数 \(W_h\) 在各时间步的梯度贡献累加起来。

17.3 Truncated BPTT

PPT 提到实践中常常为了训练效率截断:

truncated after about 20 timesteps

也就是反向传播不一定穿过完整序列,而只回看有限步数。

这样训练更省内存、更快,但也限制了直接学习非常长距离依赖的能力。


18. 用 RNN-LM 生成文本

RNN-LM 也可以像 n-gram LM 一样生成文本。

PPT 称为 generating rollouts。

流程:

  1. 输入开始符号,例如 <s>
  2. 得到下一个词分布。
  3. sample 一个词,例如 my
  4. my 作为下一步输入。
  5. 再 sample 下一个词。
  6. 重复,直到生成结束符号 </s>

示意:

<s> -> my -> favorite -> season -> is -> spring -> </s>

PPT 还展示了在特定文本风格上训练的 RNN-LM 可以生成类似风格的文本。这说明 LM 不只是分类器,它可以变成生成器。


19. Perplexity:怎样评估语言模型?

PPT 说,语言模型的标准评估指标是 perplexity。

对长度为 \(T\) 的语料,perplexity 是模型赋予真实词序列概率的倒数,并按词数归一化:

\[ \text{perplexity} = \prod_{t=1}^{T} \left( \frac{1} {P_{\text{LM}}(x^{(t+1)} \mid x^{(t)},\ldots,x^{(1)})} \right)^{1/T} \]

用模型预测分布 \(\hat{y}^{(t)}\) 写:

\[ \text{perplexity} = \prod_{t=1}^{T} \left( \frac{1} {\hat{y}^{(t)}_{x^{(t+1)}}} \right)^{1/T} \]

PPT 进一步说明,它等于 cross-entropy loss 的指数:

\[ \text{perplexity} = \exp \left( \frac{1}{T} \sum_{t=1}^{T} -\log \hat{y}^{(t)}_{x^{(t+1)}} \right) \]

也就是:

\[ \text{perplexity} = \exp(J(\theta)) \]

19.1 Perplexity 的直觉

perplexity 可以粗略理解为:

模型每一步平均在多少个候选词之间困惑。

如果模型对真实下一个词给很高概率,perplexity 就低。

如果模型对真实下一个词给很低概率,perplexity 就高。

PPT 明确写道:

Lower perplexity is better.

20. RNN-LM 的完整训练链条

把前面内容串起来:

文本序列
-> one-hot words
-> embeddings
-> RNN hidden states
-> 每一步输出下一个词概率分布
-> 每一步 cross entropy loss
-> 所有时间步 loss 平均
-> BPTT 计算梯度
-> SGD 更新 E, W_e, W_h, U 等参数

这里最重要的变化是:模型不再只看固定窗口,而是通过 hidden state 逐步积累历史。


21. RNN 的核心问题:Vanishing 和 Exploding Gradients

PPT 第 3 部分专门讲 RNN 的训练困难:

Problems with RNNs: exploding and vanishing gradients

它们都来自同一个事实:RNN 的梯度要沿时间反复乘很多局部导数。

如果这些乘上的因子多数小于 1,梯度会越来越小。

如果这些乘上的因子多数大于 1,梯度会越来越大。


22. Vanishing Gradient:远处信号被淹没

PPT 用图问:

\[ \frac{\partial J^{(4)}}{\partial h^{(1)}} = ? \]

这个梯度要从第 4 步一路反传到第 1 步。中间会经过多个 hidden-to-hidden 变换。

直觉上,它包含类似这样的连乘:

\[ \frac{\partial J^{(4)}}{\partial h^{(1)}} = \frac{\partial J^{(4)}}{\partial h^{(4)}} \frac{\partial h^{(4)}}{\partial h^{(3)}} \frac{\partial h^{(3)}}{\partial h^{(2)}} \frac{\partial h^{(2)}}{\partial h^{(1)}} \]

如果这些局部项都比较小,梯度信号会随着向前传播不断变小。

PPT 的结论是:

When these are small, the gradient signal gets smaller and smaller as it backpropagates further.

22.1 为什么它是问题?

PPT 说:

Gradient signal from far away is lost because it is much smaller than gradient signal from close-by.

也就是说,模型权重主要根据近处影响更新,远距离影响几乎学不到。

结果是:RNN 理论上可以利用很久以前的信息,但实践中很难真的学会长期依赖。


23. Vanishing Gradient 对 RNN-LM 的影响

PPT 给了一个长距离依赖例子:

When she tried to print her tickets, she found that the printer was out of toner.
She went to the stationery store to buy more toner.
It was very overpriced.
After installing the toner into the printer, she finally printed her ______

目标词应该和很前面的 tickets 相关。

要从这个训练样本中学习,RNN-LM 需要建模:

第 7 步附近的 tickets
-> 末尾目标词 tickets

之间的依赖。

但如果梯度很小,远处的 tickets 对末尾 loss 的训练信号传不回去,模型就学不到这种长距离依赖。

测试时遇到类似句子,它也难以预测正确。


24. Exploding Gradient:更新步子太大

如果梯度变得太大,SGD 更新会太大。

SGD 更新式是:

\[ \theta^{new} = \theta^{old} - \alpha \nabla_{\theta}J(\theta) \]

其中:

  • \(\alpha\) 是 learning rate。
  • \(\nabla_{\theta}J(\theta)\) 是 gradient。

如果 gradient 巨大,即使 learning rate 正常,更新步长也可能非常大。

PPT 说这会导致 bad updates:参数被一步推到很糟糕的区域,loss 变大。

最坏情况下,网络中会出现:

Inf 或 NaN

然后需要从更早的 checkpoint 重启训练。


25. Gradient Clipping:处理 exploding gradient

PPT 给出的解决方案是 gradient clipping。

规则是:

如果梯度范数大于某个阈值,就在应用 SGD 更新前把它缩小。

设梯度是 \(g\),阈值是 \(c\)。如果:

\[ \|g\| > c \]

则缩放:

\[ g \leftarrow \frac{c}{\|g\|}g \]

这样做保留了梯度方向,只缩小步长。

PPT 的直觉:

take a step in the same direction, but a smaller step

25.1 它解决什么?

它能防止 exploding gradient 导致训练数值崩溃。

25.2 它不能解决什么?

它不能让模型自动学会长期记忆。

PPT 说 exploding gradient 是比较容易处理的问题;更困难的是 vanishing gradient。


26. 怎样缓解 Vanishing Gradient?

PPT 指出,主问题是:

RNN 很难学会在许多时间步中保留信息。

在 vanilla RNN 中,hidden state 每一步都被重写:

\[ h^{(t)} = f(W_hh^{(t-1)} + W_ee^{(t)} + b) \]

如果要让很早的信息一直保留,模型必须学会在很多次重写中不把它擦掉。

PPT 提出两个方向。

26.1 单独的 memory:LSTM

PPT 首先提到:

How about an RNN with separate memory which is added to?

这就是 LSTM 的动机。LSTM 引入更明确的记忆机制,让信息更容易沿时间保存。

本讲 PPT 只点到 LSTM,不展开其门控公式。

26.2 更直接、更线性的通路

PPT 接着提到:

  • attention。
  • residual connections。
  • etc.

这些方法都在某种意义上给信息和梯度提供更直接的传递路径,减少它们必须穿过长串非线性变换的压力。


27. Machine Translation:本讲最后的应用

PPT 第 5 部分引入 machine translation。

Machine translation 是把源语言句子 \(x\) 翻译成目标语言句子 \(y\)

例如:

x: I like deep learning
y: 我喜欢深度学习

PPT 还指出,Neural Machine Translation 是 NLP deep learning 的第一个巨大成功故事:

  • 2014:第一篇 seq2seq paper 发布。
  • 2016:Google Translate 从 SMT 切换到 NMT。
  • 到 2018 年,NMT 已成为主流。

这里重点不是翻译史,而是:RNN 和 language modeling 可以自然扩展到 seq2seq。


28. Seq2seq:Encoder-Decoder 模型

PPT 描述的 NMT 使用 sequence-to-sequence model。

它由两部分组成:

28.1 Encoder RNN

Encoder 读取源语言句子:

il m' a entarté

并产生源句编码。

这个 encoding 用来给 decoder RNN 提供初始 hidden state。

28.2 Decoder RNN

Decoder 是一个 language model,但它不是无条件语言模型,而是:

在源句 encoding 条件下生成目标句

PPT 图中的目标句是:

he hit me with a pie <END>

测试时,decoder 的输出会作为下一步输入。也就是说:

<START> -> he -> hit -> me -> with -> a -> pie -> <END>

这和 RNN-LM 生成文本的 rollout 完全同构,只是它额外依赖源句 encoding。


29. Seq2seq 不只用于翻译

PPT 强调,encoder-decoder 是一个通用想法:

  • 一个神经网络读取输入并产生 neural representation。
  • 另一个神经网络基于该 representation 产生输出。
  • 如果输入和输出都是序列,就叫 sequence-to-sequence。

PPT 列出的 seq2seq 任务包括:

  • summarization:长文本到短文本。
  • dialogue:之前话语到下一句回复。
  • parsing:输入文本到线性化 parse。
  • code generation:自然语言到 Python code。

所以 machine translation 只是 seq2seq 的代表例子。


30. NMT 是 Conditional Language Model

PPT 明确说:

The sequence-to-sequence model is an example of a Conditional Language Model.

它是 language model,因为 decoder 在预测目标句的下一个词。

它是 conditional,因为预测还依赖源句 \(x\)

普通语言模型:

\[ P(y_t \mid y_{1},\ldots,y_{t-1}) \]

NMT decoder:

\[ P(y_t \mid y_{1},\ldots,y_{t-1}, x) \]

整句目标翻译的概率:

\[ P(y \mid x) = \prod_{t=1}^{T} P(y_t \mid y_1,\ldots,y_{t-1},x) \]

训练 NMT 的方式也和 RNN-LM 类似:给定 parallel corpus,对目标句每个时间步计算 negative log probability,然后平均:

\[ J = \frac{1}{T} \sum_{t=1}^{T} J_t \]

Seq2seq 被作为单个系统优化,backpropagation 端到端穿过 decoder 和 encoder。


31. Multi-layer Encoder-Decoder 和 Bottleneck Problem

PPT 还展示了多层 deep encoder-decoder 机器翻译网络。

其中:

The hidden states from RNN layer \(i\) are the inputs to RNN layer \(i+1\).

也就是一层 RNN 的输出序列会作为下一层 RNN 的输入序列。

31.1 Bottleneck problem

PPT 最后指出 RNN encoder-decoder 的 final piece:

the bottleneck problem in RNNs

早期 encoder-decoder 架构把整个源句压缩成一个 encoding,再把这个 encoding 交给 decoder。

问题是:

源句越长
需要保留的信息越多
单个压缩表示越难承载全部细节

这个 encoding 就变成 bottleneck。

31.2 为什么它重要?

这直接为后续 attention 铺路。

如果 decoder 不只能看一个压缩向量,而是能在生成每个目标词时访问源句不同位置的 hidden states,就能缓解 bottleneck。

本讲 PPT 只把问题提出,下一步课程会围绕 attention 展开。


32. 初学者最容易混的点

32.1 Language model 不是“懂语言”的完整定义

本讲的 LM 是一个明确任务:

\[ P(x^{(t+1)} \mid x^{(t)},\ldots,x^{(1)}) \]

它通过预测下一个词学习语言规律。至于模型是否真的“理解”,不是本讲要直接证明的事。

32.2 n-gram 不是“完全错”,而是泛化有限

n-gram 很直观,也能生成局部语法合理的文本。但它不能很好处理未见组合、长距离依赖和模型大小。

32.3 RNN 的 hidden state 不是无限记忆

RNN 理论上可以处理任意长度输入,但实践中 hidden state 很难保存任意远的信息。vanishing gradient 会让远处依赖很难学习。

32.4 BPTT 不是新优化器

BPTT 是计算 RNN 梯度的方法。真正更新参数的仍然是 SGD 或其变体。

32.5 Teacher forcing 和 generation 不一样

训练时通常喂真实上一个词。

生成时喂模型自己上一步生成的词。

这两个过程输入来源不同。

32.6 Perplexity 不是准确率

perplexity 衡量模型给真实序列的概率高不高。它越低越好,但它不是分类准确率,也不直接告诉你生成文本是否满足某个具体任务需求。


33. 板书级总结

33.1 Next-word prediction

\[ P(x^{(t+1)} \mid x^{(t)},\ldots,x^{(1)}) \]

33.2 文本概率链式分解

\[ P(x^{(1)},\ldots,x^{(T)}) = \prod_{t=1}^{T} P(x^{(t)} \mid x^{(t-1)},\ldots,x^{(1)}) \]

33.3 n-gram Markov assumption

\[ P(x^{(t+1)} \mid x^{(t)},\ldots,x^{(1)}) \approx P(x^{(t+1)} \mid x^{(t)},\ldots,x^{(t-n+2)}) \]

33.4 n-gram 计数估计

\[ P(w \mid c) = \frac{\text{count}(c,w)} {\text{count}(c)} \]

33.5 RNN 递推

\[ e^{(t)} = E x^{(t)} \]
\[ h^{(t)} = f(W_h h^{(t-1)} + W_e e^{(t)} + b_h) \]
\[ \hat{y}^{(t)} = \text{softmax}(U h^{(t)} + b_y) \]

33.6 RNN-LM 时间步 loss

\[ J^{(t)}(\theta) = - \log \hat{y}^{(t)}_{x^{(t+1)}} \]

33.7 总 loss

\[ J(\theta) = \frac{1}{T} \sum_{t=1}^{T} J^{(t)}(\theta) \]

33.8 BPTT 中共享权重梯度相加

\[ \frac{\partial J^{(t)}}{\partial W_h} = \sum_{i=1}^{t} \left. \frac{\partial J^{(t)}}{\partial W_h} \right|_{(i)} \]

33.9 Perplexity

\[ \text{perplexity} = \exp(J(\theta)) \]

33.10 Gradient clipping

\[ \text{if } \|g\| > c, \quad g \leftarrow \frac{c}{\|g\|}g \]

33.11 Conditional LM for NMT

\[ P(y \mid x) = \prod_{t=1}^{T} P(y_t \mid y_1,\ldots,y_{t-1},x) \]

34. 自学路线

第一步:只理解任务

先记住一件事:

语言模型 = 根据前文预测下一个词

不要一开始就陷进 RNN 公式。

第二步:掌握 n-gram 的失败原因

你应该能说清:

  • 为什么要 Markov assumption。
  • 为什么未见 n-gram 会导致 0 概率。
  • smoothing 和 backoff 分别补什么洞。
  • 为什么 \(n\) 变大后问题更严重。

第三步:理解固定窗口神经 LM

把它看作第 3 讲 window classifier 的语言模型版本:

固定长度上下文 embedding 拼接
-> hidden layer
-> 下一个词分布

第四步:理解 RNN 为什么自然

RNN 的关键不是“神秘循环”,而是:

同一组参数重复作用在每个时间步
hidden state 负责携带历史

第五步:分清训练和生成

训练:

真实前文 -> 预测真实下一个词 -> cross entropy

生成:

模型采样出的词 -> 作为下一步输入 -> 继续采样

第六步:把 BPTT 和第 3 讲 backprop 连起来

BPTT 只是把 RNN 沿时间展开,然后反向传播。

共享参数出现多次,所以梯度贡献相加。

第七步:最后理解 RNN 为什么被后续模型替代

RNN 的难点:

  • recurrent computation 慢。
  • long-distance dependency 难学。
  • vanishing gradient。
  • encoder-decoder bottleneck。

这些问题会自然引出 attention、Transformer、residual connections 等后续内容。


35. 自测题

  1. Language model 的形式化目标是什么?
  2. 为什么一个 LM 可以给整段文本分配概率?
  3. n-gram 的 Markov assumption 是什么?
  4. 4-gram LM 在预测 students opened their _____ 后面词时看哪些词?
  5. n-gram 的两个 sparsity problem 分别是什么?
  6. smoothing 和 backoff 分别解决什么问题?
  7. fixed-window neural LM 相比 n-gram LM 有什么改进?
  8. fixed-window neural LM 为什么仍然不够?
  9. RNN 为什么可以处理任意长度输入?
  10. RNN-LM 在第 \(t\) 步输出的 \(\hat{y}^{(t)}\) 表示什么?
  11. RNN-LM 为什么每个时间步都有 cross entropy loss?
  12. Teacher forcing 是什么?
  13. BPTT 中为什么重复权重的梯度要相加?
  14. Perplexity 和 cross entropy loss 有什么关系?
  15. Vanishing gradient 为什么会伤害长距离依赖?
  16. Exploding gradient 为什么会导致 Inf 或 NaN?
  17. Gradient clipping 的核心公式和直觉是什么?
  18. NMT 为什么是 conditional language model?
  19. Encoder-decoder 的 bottleneck problem 是什么?

36. 自测题参考答案

  1. 给定前文 \(x^{(1)},\ldots,x^{(t)}\),计算下一个词 \(x^{(t+1)}\) 的概率分布,即 \(P(x^{(t+1)} \mid x^{(t)},\ldots,x^{(1)})\)
  2. 因为链式法则可以把整段文本概率分解成每个词在前文条件下的概率乘积。
  3. 下一个词只依赖最近 \(n-1\) 个词,而不依赖完整历史。
  4. students opened their 这三个词。
  5. 第一,完整 n-gram 没见过,候选词概率变 0;第二,上下文本身没见过,分母为 0,任何候选词概率都无法计算。
  6. smoothing 给所有候选词加小计数,避免 0 概率;backoff 退回更短上下文,避免完整上下文没见过时无法计算。
  7. 它用 embeddings 和神经网络泛化,不需要给每个 n-gram 单独存计数,也缓解未见组合问题。
  8. 窗口固定,扩大窗口会扩大权重矩阵,而且不同位置由不同权重处理,没有 RNN 的时间共享对称性。
  9. 因为 RNN 在每个时间步重复使用同一组参数,并通过 hidden state 递推保存历史,参数量不随序列长度增长。
  10. 表示读到第 \(t\) 个词后,对第 \(t+1\) 个词的预测概率分布。
  11. 因为每个时间步都可以用当前历史预测真实下一个词,因此每一步都能计算一个 negative log probability。
  12. 训练时把真实上一个词作为下一步输入,而不是把模型自己采样出来的词作为下一步输入。
  13. 因为同一个参数 \(W_h\) 在多个时间步被重复使用,每次使用都通过一条路径影响 loss,总梯度是所有路径贡献之和。
  14. Perplexity 等于平均 cross entropy loss 的指数,即 \(\text{perplexity}=\exp(J(\theta))\)。越低越好。
  15. 长距离依赖的训练信号要跨很多时间步反传,如果局部梯度连乘后越来越小,远处信息对参数更新几乎没有影响。
  16. 梯度过大时 SGD 更新步长过大,参数可能被推到数值异常区域,导致网络出现 Inf 或 NaN。
  17. \(\|g\|>c\),令 \(g \leftarrow \frac{c}{\|g\|}g\)。直觉是保持方向不变,但把步子缩小。
  18. 因为 decoder 在预测目标句下一个词,同时条件不仅包括目标句前文,还包括源句 \(x\)
  19. 整个源句被压缩成一个 encoding 传给 decoder,长句信息太多时这个压缩表示难以承载全部细节,成为信息瓶颈。