# 第 15 章　序列生成模型

> 来源：https://deeplearning.bnuai.com/chapters/15-sequence-generation ｜ 作者：唐志清（北京师范大学） ｜ 更新：2026-11-01 ｜ 内容依据邱锡鹏《神经网络与深度学习》（https://nndl.ai/）及作者公开课件

## 学习目标

<div class="goals">

- 理解序列概率模型的链式分解和**自回归生成**；
- 掌握序列生成的搜索策略：贪心搜索与**束搜索**；
- 掌握 N 元统计语言模型及其平滑技术；
- 掌握深度序列模型的“嵌入层—特征层—输出层”结构；
- 掌握困惑度、BLEU、ROUGE 三种评价指标的计算；
- 理解基于循环网络、注意力、卷积和 Transformer 的序列到序列模型。

</div>

## 课件幻灯片

> 本章课件共 54 页，可在网页中逐页浏览：https://deeplearning.bnuai.com/chapters/15-sequence-generation；PDF 下载：https://deeplearning.bnuai.com/pdf/nndl-ch15.pdf

## 讲义

### 15.1 序列概率模型

自然语言、语音、音乐等都是**序列数据**。序列数据有两个特点：样本是变长的；样本空间非常大（长度为 $T$、词表大小为 $|\mathcal V|$ 的序列有 $|\mathcal V|^T$ 种）。序列中蕴含着潜在的规律——以语言为例，一个句子是否“合理”，可以用它出现的概率来衡量，这就是**语言模型**：$p(\text{“面包上涂黄油”})>p(\text{“黄油上涂面包”})$。[幻灯片 2](#slide-2) [幻灯片 3](#slide-3) [幻灯片 4](#slide-4)

**序列概率模型**。给定序列 $\boldsymbol x_{1:T}=x_1,x_2,\cdots,x_T$，根据概率的乘法公式，其联合概率可以分解为 [幻灯片 5](#slide-5) [幻灯片 7](#slide-7)

$$
p(\boldsymbol x_{1:T})=\prod_{t=1}^{T}p\big(x_t\mid\boldsymbol x_{1:(t-1)}\big).
$$

于是序列数据的概率密度估计就转化为单变量的条件概率估计问题——给定历史 $\boldsymbol x_{1:(t-1)}$ 预测下一个词 $x_t$，即一个 $|\mathcal V|$ 类的分类问题。这类模型称为**自回归生成模型**。[幻灯片 9](#slide-9)

**序列生成**：一旦学到了条件概率，就可以从 $x_1$ 开始逐个生成：每一步从 $p(x_t\mid\boldsymbol x_{1:(t-1)})$ 中采样或选取一个词，直到生成特殊的结束符 `<eos>`。[幻灯片 10](#slide-10) [幻灯片 11](#slide-11) 如果希望生成**概率最高**的序列，需要在指数级的空间中搜索：

- **贪心搜索**：每一步选择当前条件概率最大的词。简单快速，但只是局部最优，不一定得到全局概率最高的序列。[幻灯片 12](#slide-12)
- **束搜索**：每一步保留概率最高的 $K$ 个候选序列（$K$ 称为**束大小**），在它们的基础上扩展出 $K|\mathcal V|$ 个序列，再选出前 $K$ 个，直到结束。束搜索在计算量和搜索质量之间取得折中，$K=1$ 时退化为贪心搜索。[幻灯片 13](#slide-13)

在一个玩具语言模型上比较贪心搜索与束搜索，并调节温度、Top-k、Top-p 体验采样策略：

> （此处为交互演示，请在网页中使用：https://deeplearning.bnuai.com/chapters/15-sequence-generation）

<p class="demo-link">在单独页面中打开：<a href="/demos/decoding">解码：束搜索与采样</a></p>

### 15.2 N 元统计模型

由于数据稀疏，直接估计 $p(x_t\mid\boldsymbol x_{1:(t-1)})$ 很困难（长历史几乎不会重复出现）。**N 元模型**做一个**马尔可夫假设**：每个词只依赖于前面 $N-1$ 个词：[幻灯片 14](#slide-14)

$$
p\big(x_t\mid\boldsymbol x_{1:(t-1)}\big)\approx p\big(x_t\mid\boldsymbol x_{(t-N+1):(t-1)}\big).
$$

$N=1$ 为**一元模型**（各词独立），$N=2$ 为**二元模型**，依此类推。参数用**最大似然估计**，即频率计数：

$$
p\big(x_t\mid\boldsymbol x_{(t-N+1):(t-1)}\big)=\frac{\mathrm m\big(\boldsymbol x_{(t-N+1):t}\big)}{\mathrm m\big(\boldsymbol x_{(t-N+1):(t-1)}\big)},
$$

$\mathrm m(\cdot)$ 表示在训练语料中出现的次数。

**平滑技术**：N 元模型的主要问题是**数据稀疏**——训练集中没有出现过的 N 元组概率为 0，导致整个句子概率为 0。**平滑**就是给未出现的 N 元组分配一定的概率。最简单的是**加法平滑**（$\delta=1$ 时为拉普拉斯平滑）：[幻灯片 15](#slide-15)

$$
p\big(x_t\mid\boldsymbol x_{(t-N+1):(t-1)}\big)=\frac{\mathrm m\big(\boldsymbol x_{(t-N+1):t}\big)+\delta}{\mathrm m\big(\boldsymbol x_{(t-N+1):(t-1)}\big)+\delta|\mathcal V|},\qquad 0<\delta\le1 .
$$

更好的方法还有插值平滑、回退（Katz）、Kneser–Ney 平滑等，其基本思想是“劫富济贫”，把高频 N 元组的一部分概率质量分给低频和未出现的 N 元组。

### 15.3 深度序列模型

**深度序列模型**用神经网络估计条件概率 $p_\theta(x_t\mid\boldsymbol x_{1:(t-1)})$，一般由三层组成：[幻灯片 16](#slide-16)

```mermaid
flowchart LR
  X["历史 x₁ … xₜ₋₁"] --> E["嵌入层<br/>词 → 稠密向量 e"]
  E --> H["特征层<br/>平均 / 前馈 / 循环 / Transformer → hₜ"]
  H --> O["输出层<br/>softmax(W hₜ + b)"]
  O --> P["p(xₜ | 历史)"]
```

- **嵌入层**：把每个词 $x$ 映射为一个低维稠密的**词嵌入**向量 $\boldsymbol e_x=\boldsymbol M\,\mathrm{onehot}(x)$，$\boldsymbol M$ 为嵌入矩阵。与 one-hot 的局部表示相比，分布式表示可以刻画词与词之间的相似性（语义相近的词向量也相近）。[幻灯片 17](#slide-17) [幻灯片 18](#slide-18)
- **特征层**：把历史的词向量序列 $\boldsymbol e_1,\cdots,\boldsymbol e_{t-1}$ 编码为一个定长的历史表示 $\boldsymbol h_t$。[幻灯片 19](#slide-19)
  - **简单平均**：$\boldsymbol h_t=\sum_{i=1}^{t-1}\alpha_i\boldsymbol e_i$，权重可以相同，也可以用注意力计算；[幻灯片 20](#slide-20)
  - **前馈神经网络**（Bengio 2003 的神经语言模型）：把前 $N-1$ 个词向量拼接后输入前馈网络，$\boldsymbol h_t=g\big(\boldsymbol e_{t-N+1}\oplus\cdots\oplus\boldsymbol e_{t-1}\big)$——它仍是 N 元模型，但能共享相似词的统计信息；[幻灯片 21](#slide-21)
  - **循环神经网络**：$\boldsymbol h_t=\tanh\big(\boldsymbol U\boldsymbol h_{t-1}+\boldsymbol W\boldsymbol e_{t-1}+\boldsymbol b\big)$，理论上可以利用全部历史信息。[幻灯片 22](#slide-22)
- **输出层**：一般用 softmax 分类器输出词表上的概率分布 $\boldsymbol o_t=\mathrm{softmax}\big(\boldsymbol W\boldsymbol h_t+\boldsymbol b\big)$。词表很大时，softmax 的归一化计算代价很高，可以用层次化 softmax、重要性采样、噪声对比估计等方法加速。[幻灯片 23](#slide-23)

**参数学习**：给定训练序列，用最大似然估计——最小化每个时刻的交叉熵损失 $\mathcal L(\theta)=-\sum_{t=1}^{T}\log p_\theta(x_t\mid\boldsymbol x_{1:(t-1)})$。训练时用**真实的历史**作为输入（**教师强制**），而测试时只能用模型**自己生成**的历史，这种不一致会导致**曝光偏差**问题：一旦早期生成错误，错误会逐步累积。可用计划采样、强化学习或对抗训练来缓解。

### 15.4 评价方法

**困惑度**（Perplexity）衡量语言模型对测试数据的拟合程度，可以理解为模型在每个位置“平均有多少个等可能的选择”，越低越好：[幻灯片 25](#slide-25) [幻灯片 26](#slide-26)

$$
\mathrm{PPL}(\theta)=2^{H(\tilde p,p_\theta)}=\Big(\prod_{n=1}^{N}p_\theta\big(\boldsymbol x_{1:T_n}^{(n)}\big)\Big)^{-1/T},\qquad T=\sum_nT_n .
$$

它是测试集上每个词的条件概率的几何平均的倒数。若模型对每个词都是在 $|\mathcal V|$ 个词中均匀猜测，困惑度就等于 $|\mathcal V|$。

**BLEU**（双语评估替补）是机器翻译中常用的指标，衡量生成序列与参考序列之间 N 元组的重合度（偏重**精确率**）。[幻灯片 27](#slide-27) [幻灯片 28](#slide-28) 对生成序列 $\boldsymbol x$ 和参考序列集合 $\{\boldsymbol s^{(k)}\}$，N 元组的**截断精度**为

$$
P_N(\boldsymbol x)=\frac{\sum_{w\in\mathcal W}\min\Big(c_w(\boldsymbol x),\ \max_k c_w\big(\boldsymbol s^{(k)}\big)\Big)}{\sum_{w\in\mathcal W}c_w(\boldsymbol x)},
$$

$c_w(\cdot)$ 为 N 元组 $w$ 出现的次数，取 min 是为了防止通过重复同一个词“刷分”。由于精确率偏爱短句，BLEU 引入**长度惩罚因子** $b(\boldsymbol x)=1$（若 $l_x>l_s$），否则 $\exp(1-l_s/l_x)$，最终

$$
\mathrm{BLEU\text{-}N}(\boldsymbol x)=b(\boldsymbol x)\times\exp\Big(\sum_{N'=1}^{N}\alpha_{N'}\log P_{N'}\Big),
$$

通常 $N=4$，$\alpha_{N'}=1/N$。

**ROUGE**（面向召回率的摘要评估替补）常用于文本摘要，计算的是参考序列中的 N 元组有多少出现在生成序列中（偏重**召回率**）：[幻灯片 29](#slide-29)

$$
\mathrm{ROUGE\text{-}N}(\boldsymbol x)=\frac{\sum_k\sum_{w\in\mathcal W}\min\big(c_w(\boldsymbol x),c_w(\boldsymbol s^{(k)})\big)}{\sum_k\sum_{w\in\mathcal W}c_w\big(\boldsymbol s^{(k)}\big)} .
$$

### 15.5 序列到序列模型

**序列到序列**（Seq2Seq）模型是一种条件序列生成模型：给定输入序列 $\boldsymbol x_{1:S}$，生成输出序列 $\boldsymbol y_{1:T}$，两者长度不必相同。机器翻译、文本摘要、对话、语音识别都是典型的 Seq2Seq 任务：[幻灯片 30](#slide-30) [幻灯片 31](#slide-31)

$$
p\big(\boldsymbol y_{1:T}\mid\boldsymbol x_{1:S}\big)=\prod_{t=1}^{T}p\big(y_t\mid\boldsymbol y_{1:(t-1)},\boldsymbol x_{1:S}\big),\qquad
\hat\theta=\arg\max_\theta\sum_{n=1}^{N}\log p_\theta\big(\boldsymbol y_{1:T}^{(n)}\mid\boldsymbol x_{1:S}^{(n)}\big).
$$

生成时同样可以用贪心搜索或束搜索。根据编码器和解码器的不同，Seq2Seq 模型有以下几类：[幻灯片 32](#slide-32)

- **基于循环神经网络**：编码器 RNN 把输入序列编码为最后时刻的隐状态 $\boldsymbol h_S^{enc}$，作为解码器 RNN 的初始状态，再自回归地生成输出。缺点是所有信息被压缩到一个定长向量中，长句子效果差。[幻灯片 33](#slide-33)
- **基于前馈网络 / 卷积网络**：用（带门控的）卷积网络作为编码器和解码器，可以并行计算（如 ConvS2S）。[幻灯片 34](#slide-34) [幻灯片 36](#slide-36)
- **基于注意力**：解码器在每一步以当前隐状态为查询，对编码器各时刻的隐状态计算注意力，得到上下文向量 $\boldsymbol c_t=\sum_{i=1}^{S}\alpha_{t,i}\boldsymbol h_i^{enc}$，再结合 $\boldsymbol c_t$ 预测下一个词。注意力机制解决了信息瓶颈，并能学到软对齐（见第 8 章）。[幻灯片 35](#slide-35)
- **基于自注意力（Transformer）**：编码器和解码器都由多头自注意力层堆叠而成，解码器使用掩码自注意力保证自回归，并通过编码器-解码器注意力读取输入信息。Transformer 训练时可以完全并行，成为当今机器翻译和大语言模型的主流架构。[幻灯片 37](#slide-37) [幻灯片 41](#slide-41) [幻灯片 43](#slide-43) [幻灯片 46](#slide-46)

**应用**：除机器翻译外，序列生成模型还广泛用于**文本摘要**（抽取式 / 生成式）、**对话系统**、**看图说话**（以 CNN 编码图像、RNN 或 Transformer 生成描述）以及**诗歌生成**等。[幻灯片 47](#slide-47) [幻灯片 48](#slide-48) [幻灯片 50](#slide-50) [幻灯片 51](#slide-51) [幻灯片 53](#slide-53)

> 第二版教材在此基础上新增了「大语言模型与智能体」一章：以 Transformer 为骨干、以自回归语言建模为目标、在海量文本上预训练，再经过指令微调和对齐，就得到了今天的大语言模型——本章的“下一个词预测”正是其最核心的训练目标。

## 本章小结

- 序列概率模型 $p(\boldsymbol x_{1:T})=\prod_tp(x_t\mid\boldsymbol x_{1:(t-1)})$ 把序列建模转化为“预测下一个词”，生成时用贪心搜索或束搜索。
- N 元模型基于马尔可夫假设和频率计数，需要平滑处理数据稀疏；深度序列模型由嵌入层、特征层、输出层组成。
- 评价指标：困惑度（越低越好）、BLEU（精确率 + 长度惩罚）、ROUGE（召回率）。
- Seq2Seq 模型的编码器-解码器可以基于 RNN、CNN、注意力或 Transformer。

## 思考题与习题 {#exercises}

<div class="exercise-list">

1. **（计算）** 语料为“我 爱 你 / 我 爱 他 / 他 爱 我”。用二元模型（不平滑）计算 $p(\text{爱}\mid\text{我})$ 和 $p(\text{你}\mid\text{爱})$；再用 $\delta=1$ 的加法平滑重新计算（词表为 {我, 爱, 你, 他}）。
2. **（分析）** 举例说明贪心搜索为什么不一定找到概率最高的序列。束搜索能保证找到吗？
3. **（计算）** 一个语言模型在一个 4 个词的测试句子上给出的条件概率分别为 0.5、0.25、0.5、0.125，计算困惑度。
4. **（计算）** 参考译文 “the cat is on the mat”，候选译文 “the the the the the the the”。计算一元组的普通精确率与截断精确率。
5. **（概念）** 什么是曝光偏差？列举两种缓解方法。
6. **（编程）** 用字符级 LSTM 或小型 Transformer 在一部唐诗语料上训练语言模型，分别用贪心搜索、束搜索（$K=5$）和温度采样生成诗句，比较生成结果的流畅度与多样性。

</div>

**部分提示**

- 第 1 题：$p(\text{爱}\mid\text{我})=2/2=1$（“我”后接“爱”两次；第三句末尾的“我”后面没有词）；$p(\text{你}\mid\text{爱})=1/3$。平滑后：$(2+1)/(2+4)=0.5$，$(1+1)/(3+4)=2/7$。
- 第 3 题：$\mathrm{PPL}=(0.5\times0.25\times0.5\times0.125)^{-1/4}=(1/128)^{-1/4}=128^{1/4}\approx3.36$。
- 第 4 题：普通精确率 $7/7=1$；截断后 “the” 最多计 2 次，为 $2/7$。

## 延伸阅读

- 教材：邱锡鹏《神经网络与深度学习》第 15 章「序列生成模型」。
- Bengio Y, et al. A neural probabilistic language model, JMLR 2003；Sutskever I, et al. Sequence to sequence learning with neural networks, NeurIPS 2014；Papineni K, et al. BLEU, ACL 2002。
- 实践：[nndl-practice](https://github.com/nndl/nndl-practice) 中的语言模型与 Transformer 相关章节。
- 交互：[解码：束搜索与采样](https://deeplearning.bnuai.com/demos/decoding)。
- 第二版对应章节：第 13 章「大语言模型与智能体」（序列到序列与 Transformer 部分见第 8 章）。
