一、序列建模问题的核心挑战
序列建模连接了传统统计序列模型和深度学习序列模型两大范式。
1.1 序列标注任务的普遍性
之前已经把中文分词(Chinese Word Segmentation)转成了序列标注(sequence labeling)问题:输入一个可观察序列,输出一个标签序列。这种建模方式非常普遍,例如:
- 金融交易序列:输出买入/卖出/持有动作。
- 游戏视频流:输出按键动作序列。
- 自动驾驶视频:输出控制决策。
- 中文分词:输出 BIES 标签。
1.2 序列建模的三大困难
所有后续模型设计,本质上都在解决下面三个问题:
- 可变长度建模:输入长度不固定,模型不能只支持定长序列。
- 长程依赖(long-range dependency):远处历史可能决定当前预测。
- 多周期信号叠加:真实时间序列里往往同时存在短周期和长周期结构,需要模型提取 underlying pattern。
金融市场中,煤炭行业一般天冷了就会涨(季节性短周期),而房地产行业可能以十年为周期波动(长周期)。一个好的序列模型需要有能力同时捕捉这些不同周期信号的叠加。
总结:序列模型最难的,不是把一个序列输进去,而是要抓住信号背后真正稳定的模式(the underlying pattern)。
二、隐马尔可夫模型的基本思想
2.1 HMM
以 Crazy Soft Drink Machine 为例:我们只能看到机器吐出来的饮料,却看不到它内部的偏好状态,这就是 HMM 的基本结构:
- 有一个隐状态序列 $H_1,H_2,\ldots,H_T$。
- 有一个观测序列 $O_1,O_2,\ldots,O_T$。
- 当前状态决定下一个状态如何转移。
- 当前状态决定当前观测如何生成。
2.2 生成模型与判别模型
HMM 是一个生成模型(generative model)。判断生成模型的标准非常简单:
能不能”造样本”。能造样本就是生成模型,不能造就是判别模型。
HMM 之所以能生成,是因为给定参数后:
- 先从初始分布 $\pi$ 采样第一个隐状态;
- 根据当前状态从发射分布采样观测;
- 再根据状态转移概率采样下一个隐状态;
- 如此反复,就能模拟整台机器的运行。
| 类型 | 判断标准 | 例子 |
|---|---|---|
| 生成模型 | 能造样本——给定参数后可以从模型中采样出新数据 | HMM、Naive Bayes、GAN |
| 判别模型 | 只能根据输入预测输出,不能生成新样本 | CRF、SVM、Logistic Regression |
判别模型只能”看到什么输入就输出什么标签”,而生成模型能反过来”如果这个世界是这样运转的,那么它应该产生什么样的观测”。生成模型在标注数据少时,有机会通过建模联合分布来利用更多结构信息;代价是模型假设更强,表达能力会受限。
2.3 马尔可夫性与变长能力
HMM 的两个核心性质:
- 天然支持变长序列。只要状态转移和发射机制在,序列长短并不会破坏模型定义。
- 满足马尔可夫性(Markov Property):
它的好处是极大简化统计建模;坏处是它无法显式聚合长历史。
马尔可夫性本质上就是”只看当前,不看更早”。这在当年是为了让问题可解,但也直接限制了模型能力。
2.4 HMM 的五元组定义
HMM 的标准形式是:
\[\text{HMM}=(S,V,\pi,A,B)\]其中:
- $S$:隐状态集合;
- $V$:观测字母表;
- $\pi$:初始状态分布;
- $A$:状态转移矩阵,$A_{ij}=P(H_{t+1}=j\mid H_t=i)$;
- $B$:发射概率矩阵,$B_j(o)=P(O_t=o\mid H_t=j)$。
注意:真正建模时,状态数本身就是一个超参数,因为隐状态根本看不见,只能由我们假设。
三、HMM 的三个经典问题
3.1 评估问题(Evaluation)
给定观测序列 $O=(o_1,\ldots,o_T)$,计算它由模型生成的概率:
\[P(O\mid \lambda)\]如果暴力枚举所有可能的隐状态序列,复杂度会指数爆炸,因此必须使用动态规划。
3.2 解码问题(Decoding)
给定观测序列,求最可能的隐状态序列:
\[H^*=\arg\max_H P(H,O\mid \lambda)\]这就是”我看到了表面现象,最合理的内部解释是什么”。
3.3 学习问题(Learning)
给定大量观测序列,在隐状态不可见的情况下估计参数:
\[\lambda=(\pi,A,B)\]这对应的是”机器内部规则不知道,但我能不能从大量样本里把规则反推出来”。
四、前向-后向算法与 Viterbi 解码
4.1 前向算法(Forward Algorithm)
定义前向量:
\[\alpha_t(j)=P(o_1,\ldots,o_t,H_t=j\mid\lambda)\]它表示:到时刻 $t$ 为止,已经观测到前 $t$ 个符号,且当前处于状态 $j$ 的联合概率。
初始化:
\[\alpha_1(j)=\pi_j\,B_j(o_1)\]递推:
\[\alpha_t(j)=\left(\sum_i \alpha_{t-1}(i)A_{ij}\right)B_j(o_t)\]终止:
\[P(O\mid\lambda)=\sum_j \alpha_T(j)\]前向算法的本质是复用前面已经算过的部分结果,因此复杂度从指数级降到多项式级。
4.2 后向算法(Backward Algorithm)
定义后向量:
\[\beta_t(i)=P(o_{t+1},\ldots,o_T\mid H_t=i,\lambda)\]递推为:
\[\beta_t(i)=\sum_j A_{ij}B_j(o_{t+1})\beta_{t+1}(j)\]后向算法并不是用来替代前向算法,而是和前向算法一起,为后面的状态后验概率计算与 EM 学习服务。
4.3 Viterbi 解码
Viterbi 的思想与前向算法很像,但”求和”被改成了”取最大值”。定义:
\[\delta_t(j)=\max_{H_1,\ldots,H_{t-1}} P(H_1,\ldots,H_{t-1},H_t=j,o_1,\ldots,o_t\mid\lambda)\]递推公式:
\[\delta_t(j)=\left(\max_i \delta_{t-1}(i)A_{ij}\right)B_j(o_t)\]同时记录回溯指针:
\[\psi_t(j)=\arg\max_i \delta_{t-1}(i)A_{ij}\]最后从终点反向回溯,就能得到最优隐状态路径。
总结:前向算法是在做”概率求和”,Viterbi 是在做”最优路径选择”。两者图长得很像,但目标完全不同。
五、EM 算法与 HMM 学习
5.1 为什么需要 EM
如果隐状态可见,参数统计非常直接;但 HMM 的困难在于状态是隐藏的。所以需要在”估计隐状态”和”更新参数”之间反复迭代,这就是 EM 算法(Expectation-Maximization)。
5.2 似然函数的符号约定
有些文献里会出现 $P(O \mid \lambda)$ 和 $P(O; \lambda)$ 两种写法。为什么不用竖线而用分号?这是为了区分条件概率和似然函数——当写成 $P(O \mid \lambda)$ 时,$\lambda$ 是给定的(不能调);当写成 $P(O; \lambda)$ 时,意味着 $\lambda$ 是可以调整的参数。在 EM 框架下,我们就是在调整 $\lambda$ 使得观测序列的生成概率最大化。
5.3 E 步:估计隐变量后验
前向-后向算法可以帮助计算:
\[\gamma_t(i)=P(H_t=i\mid O,\lambda)\]以及相邻状态联合后验:
\[\xi_t(i,j)=P(H_t=i,H_{t+1}=j\mid O,\lambda)\]这些量可以理解为:在当前参数下,模型认为某个状态、某次转移”大概出现了多少次”。
5.4 M 步:重新估计参数
得到期望计数以后,就可以重新归一化更新参数:
\[\pi_i=\gamma_1(i)\] \[A_{ij}=\frac{\sum_{t=1}^{T-1}\xi_t(i,j)}{\sum_{t=1}^{T-1}\gamma_t(i)}\] \[B_j(o)=\frac{\sum_{t:o_t=o}\gamma_t(j)}{\sum_{t=1}^T \gamma_t(j)}\]这就是 HMM 中著名的 Baum-Welch 学习过程,本质上是 HMM 上的 EM。
5.5 EM 的理论保证与硬版本
EM 算法最巧妙的地方在于——在统计框架下可以严格证明,每次 E-M 迭代之后,新参数对给定样本的生成概率一定会提高(或至少不下降)。这是 EM 框架最重要的理论基础。有了这个保证,就可以放心迭代直到收敛。
还有一种更简单的思路:硬版本 EM(Viterbi Training)。不用软后验 $\gamma_t(i)$,而是直接用 Viterbi 解码得到的最优隐状态路径来做近似参数更新。实现更简单,但比标准 Baum-Welch 更粗糙。
5.6 HMM 的结构性局限:离散状态表征
对于一个非常复杂的任务(如自动驾驶),用离散状态来刻画路况几乎不可能。即使把隐状态数量增加到 1 万甚至 100 万个——先不谈计算复杂性和参数估计的难度——也很难覆盖所有场景。
围棋的状态是离散的,但状态空间太大以至于无法用离散方法穷举。AlphaGo 的成功恰恰在于——它不再把围棋局面视为离散状态,而是映射到连续向量空间(隐空间)中进行建模。同样地,序列建模也必然会从离散隐状态(HMM)走向连续向量表征(深度学习)。这正是后面 RNN、LSTM、Transformer 等模型兴起的根本原因。
用一个足够高维的连续向量空间,就能刻画远复杂于离散状态的世界——这就是”表征”(representation)如此重要的原因。
六、HMM 在中文分词与语音识别中的应用
6.1 中文分词
把 HMM 用到中文分词时:
- 观测序列:字序列;
- 隐状态:BIES 标签;
- 状态转移:如
B→I、I→E等; - 发射概率:某个标签生成某个字的概率。
这种建模方式让中文分词第一次系统地进入统计学习框架。但必须承认:单纯 HMM 在中文分词上的性能并不强,因为它的独立性假设太重,可用特征太少。
6.2 语音识别
HMM 对语音识别的历史意义极大,原因有两点:
- 语音是天然的变长序列,一个字或一个词持续时间并不固定。
- HMM 可以通过状态自循环描述时长变化,因此非常适合早期语音建模。
在经典语音识别系统里,HMM 通常与声学模型、语言模型一起组成完整系统。可以说:没有 HMM,就没有很长一段时期里的现代语音识别工业体系。
七、从 HMM 到 CRF:为什么需要判别式序列模型
7.1 HMM 的主要局限
HMM 的问题主要有三类:
- 马尔可夫假设太强,只看当前状态。
- 发射独立性假设太强,难以融入丰富上下文。
- 作为生成模型,它为了建联合分布,牺牲了不少判别能力。
7.2 标签偏置(Label Bias)问题
从局部归一化(local normalization)的角度看,某些模型在每个局部状态都单独做概率归一化,这会导致:
- 一旦某个状态的转移分布被局部归一化,它对后续观测的纠错能力就有限;
- 出边少的状态可能天然占便宜;
- 模型会更关注”局部转移合法”,而不是整条路径全局最优。
这就是 Label Bias 问题。
7.3 条件随机场(CRF)
CRF 是一个判别模型(discriminative model),直接建模条件概率 $P(Y\mid X)$,不再强求去生成观测:
\[P(Y\mid X)=\frac{1}{Z(X)}\exp\!\left(\sum_k \lambda_k f_k(X,Y)\right)\]其核心优势:
- 全局归一化(global normalization),整条序列统一打分。
- 可引入丰富特征,不必受 HMM 那种强生成假设约束。
- 在小数据、强特征工程场景里非常有效。
关键:CRF 的关键贡献不只是”换了个模型”,而是把”整条路径统一评分”这件事做对了。
7.4 特征模板与特征工程
CRF 的强大很大程度上来自特征模板(feature template)。例如,可以定义:
- 当前字是什么;
- 前一个字、后一个字是什么;
- 当前字与相邻字的组合;
- 当前状态、前一状态的组合特征。
但它的代价也很明显:
- 模板一长,特征空间就爆炸。
- 需要大量人工试错。
- 一个中文分词任务,历史上研究者可能为它堆出好几页模板。
- 模型性能往往非常依赖人类设计的模板质量。
这正是后面深度学习兴起的直接动机之一:我们不想再手工穷举模板,希望网络自己学出有效表征。
八、本章主线总结
本章的主线可以概括成四句话:
- HMM 让序列问题第一次有了比较系统的统计建模框架。
- 前向、后向、Viterbi、EM 共同构成了 HMM 的核心算法体系。
- HMM 在中文分词和语音识别里都留下了深远影响。
- 但由于独立性假设、局部归一化和特征贫弱等问题,人们自然走向了 CRF,再进一步走向深度学习。
核心观点:理解 HMM,不是因为今天还要大量手写 HMM,而是因为后面很多模型的设计,都是在修它的短板。