目录
  1. 1. 写在前面
  2. 2. 1. 概率图模型基础:有向图 vs 无向图
    1. 2.1. 1.1 概率图模型的分类
    2. 2.2. 1.2 有向图 vs 无向图的表达能力
    3. 2.3. 1.3 条件独立性与图分离
  3. 3. 2. Hammersley-Clifford 定理
    1. 3.1. 2.1 定理陈述
    2. 3.2. 2.2 极大团与因子分解
  4. 4. 3. 线性链条件随机场
    1. 4.1. 3.1 正式定义
    2. 4.2. 3.2 参数化形式
    3. 4.3. 3.3 特征函数的设计示例
    4. 4.4. 3.4 CRF 与 HMM 的对比视角
  5. 5. 4. 线性链 CRF 的矩阵形式
    1. 5.1. 4.1 引入矩阵表示
    2. 5.2. 4.2 获取条件概率
  6. 6. 5. CRF 的前向-后向算法
    1. 6.1. 5.1 前向向量
    2. 6.2. 5.2 后向向量
    3. 6.3. 5.3 归一化因子与前向-后向的关系
    4. 6.4. 5.4 边际概率
  7. 7. 6. 参数学习
    1. 7.1. 6.1 极大似然估计
    2. 7.2. 6.2 对数似然的凸性
    3. 7.3. 6.3 优化方法
    4. 7.4. 6.4 对数似然的 L2 正则化
    5. 7.5. 6.5 IIS 算法在 CRF 中的应用
  8. 8. 7. Viterbi 解码
    1. 8.1. 7.1 CRF 的 Viterbi 算法
    2. 8.2. 7.2 算法伪代码
  9. 9. 8. 标签偏置问题与 MEMM
    1. 9.1. 8.1 标签偏置问题(Label Bias Problem)
    2. 9.2. 8.2 CRF 如何避免标签偏置
  10. 10. 9. Bi-LSTM-CRF 与现代序列标注
    1. 10.1. 9.1 从手工特征到自动特征
    2. 10.2. 9.2 训练与推理
    3. 10.3. 9.3 为什么 LSTM 之后还要加 CRF 层?
  11. 11. 10. CRF++ 工具简介
    1. 11.1. 10.1 数据格式
    2. 11.2. 10.2 特征模板
    3. 11.3. 10.3 训练与预测
  12. 12. 11. 数值计算示例:CRF 的完整推导
    1. 12.1. 11.1 问题设定
    2. 12.2. 11.2 前向递推
    3. 12.3. 11.3 边际概率计算
    4. 12.4. 11.4 Viterbi 解码
  13. 13. 12. 势函数设计与特征工程
    1. 13.1. 12.1 原子特征设计
    2. 13.2. 12.2 CRF++ 特征模板详解
  14. 14. 13. 面试高频问答
  15. 15. 14. 条件随机场的最大熵视角
    1. 15.1. 14.1 CRF 作为条件最大熵模型
    2. 15.2. 14.2 特征选择与模型复杂度
    3. 15.3. 14.3 链式 CRF 的限制
  16. 16. 15. 面试高频问答(续)
  17. 17. 16. 一般 CRF 的推断与学习
    1. 17.1. 16.1 精确推断的局限性
    2. 17.2. 16.2 近似推断方法
    3. 17.3. 16.3 结构化 SVM 作为 CRF 的替代
  18. 18. 17. 总结
【统计学习方法死磕系列】条件随机场

写在前面

条件随机场(Conditional Random Field, CRF)是概率图模型家族中的判别式模型。它直接对条件概率 $P(Y|X)$ 建模,避免了 HMM 需要为观测分布 $P(X)$ 建模(而我们又不关心 $P(X)$)的问题。在序列标注任务中,CRF 可以自由地使用任意全局特征,且不存在 HMM 的观测独立性假设——这使其成为 NLP 序列标注任务(分词、词性标注、NER)中长达十多年的 SOTA 方法。

与 HMM 相比,CRF 的数学框架更为抽象(涉及无向图模型、势函数、全局归一化),因此也更容易让初学者感到困惑。本文将从无向概率图模型的基础出发,推导到 Hammersley-Clifford 定理,再聚焦于线性链 CRF 的参数化形式、前向-后向算法、Viterbi 解码和 IIS 训练。全文力求推导严密、案例具体。


1. 概率图模型基础:有向图 vs 无向图

1.1 概率图模型的分类

概率图模型(Probabilistic Graphical Model)用图结构表示随机变量之间的条件依赖关系。

  • 有向图模型(贝叶斯网络, Bayesian Network):用有向无环图(DAG)表示因果关系。联合分布分解为每个节点给定父节点的条件概率之积。

$$P(X_1, \ldots, X_n) = \prod_{i=1}^{n} P(X_i | \text{Pa}(X_i))$$

  • 无向图模型(马尔可夫随机场, Markov Random Field, MRF):用无向图表示相关关系。联合分布分解为所有极大团的势函数之积。

$$P(X_1, \ldots, X_n) = \frac{1}{Z} \prod_{C \in \mathcal{C}} \Psi_C(X_C)$$

其中 $\mathcal{C}$ 是所有极大团(maximal clique),$\Psi_C$ 是定义在团 $C$ 上的非负势函数(potential function),$Z = \sum_{X} \prod_{C} \Psi_C(X_C)$ 是归一化常数(配分函数, Partition Function)。

1.2 有向图 vs 无向图的表达能力

特性 贝叶斯网络(有向) 马尔可夫随机场(无向)
边的含义 因果关系 / 条件分布 相关关系 / 势函数
分解形式 条件概率之积 势函数之积
归一化 天然归一化(条件概率) 需要全局归一化 $Z$
参数学习 通常容易(局部似然) 需要全局归一化(更难)
循环依赖 (A-B-C-A) 不可表示(DAG 要求无环) 可表示
独立性编码 $d$-separation 图分离(graph separation)

CRF 的关键特征:CRF 是 $P(Y|X)$ 的 MRF,即给定 $X$ 的条件下,$Y$ 构成一个 MRF。CRF 不建模 $P(X)$,因此是一个判别式模型——这是它区别于 HMM(生成式)和一般 MRF 的核心。

1.3 条件独立性与图分离

在无向图中,条件独立性的判断由图分离(Graph Separation)给出:

全局马尔可夫性:对于无向图中三个互不相交的节点集合 $A, B, C$,如果从 $A$ 到 $B$ 的所有路径都经过 $C$(即 $C$ 分离了 $A$ 和 $B$),则 $A \perp B | C$。

对于线性链(即链式结构$Y_1 - Y_2 - \cdots - Y_T$),这退化为熟悉的性质:

  • $Y_t \perp {Y_1, \ldots, Y_{t-2}, Y_{t+2}, \ldots, Y_T} | {Y_{t-1}, Y_{t+1}}$
  • 即 $Y_t$ 给定左右邻居后,与其他所有节点独立——这是马尔可夫性的无向图版。

2. Hammersley-Clifford 定理

2.1 定理陈述

Hammersley-Clifford 定理是 MRF 的理论基石,它建立了概率分布与图结构之间的对应关系

定理(Hammersley-Clifford):对于一个正的联合概率分布 $P(X) > 0$,$P$ 满足无向图 $\mathcal{G}$ 的所有条件独立性(即 $P$ 是一个 MRF on $\mathcal{G}$),当且仅当 $P$ 可以分解为该图所有极大团上的势函数之积:

$$P(X) = \frac{1}{Z} \prod_{C \in \mathcal{C}} \Psi_C(X_C)$$

其中 $\mathcal{C}$ 是 $\mathcal{G}$ 的极大团集合,$\Psi_C(X_C) \geq 0$ 是定义在团变量 $X_C$ 上的势函数。

这个定理的重要性在于:

  1. 它证明了”满足条件独立性的分布”和”可分解为团势函数之积的分布”是等价的
  2. 它告诉我们可以通过定义团上的势函数来隐式地编码条件独立性——这是 CRF 模型设计的理论基础

2.2 极大团与因子分解

定义(团, Clique):团是图中两两相连的节点子集。极大团(Maximal Clique)是不能再加入任何节点而仍保持完全连接的团。

对于线性链结构 $Y_1 - Y_2 - \cdots - Y_T$:

  • 极大团是每条边及其两端点:${Y_t, Y_{t+1}}$,共 $T-1$ 个
  • (如果有节点势函数,单节点也是团)

因此在链 CRF 中,联合分布可分解为:

$$P(Y) = \frac{1}{Z} \prod_{t=1}^{T-1} \Psi_t(Y_t, Y_{t+1})$$

若包含节点势函数:

$$P(Y) = \frac{1}{Z} \prod_{t=1}^{T} \Phi_t(Y_t) \prod_{t=1}^{T-1} \Psi_t(Y_t, Y_{t+1})$$


3. 线性链条件随机场

3.1 正式定义

定义(线性链条件随机场, Linear-chain CRF):设 $X = (X_1, \ldots, X_T)$ 和 $Y = (Y_1, \ldots, Y_T)$ 均为线性链表示的随机变量序列。在给定 $X$ 的条件下,$Y$ 构成一个线性链 MRF:即

$$P(Y_t | X, Y_1, \ldots, Y_{t-1}, Y_{t+1}, \ldots, Y_T) = P(Y_t | X, Y_{t-1}, Y_{t+1})$$

(给定输入 $X$ 和 $Y_t$ 的左右邻居后,$Y_t$ 与其他 $Y$ 条件独立)

3.2 参数化形式

根据 Hammersley-Clifford 定理,线性链 CRF 的条件概率可以分解为:

$$P(Y|X) = \frac{1}{Z(X)} \exp\left( \sum_{t=1}^{T} \sum_{k=1}^{K_1} \lambda_k f_k(Y_t, X, t) + \sum_{t=1}^{T-1} \sum_{l=1}^{K_2} \mu_l g_l(Y_t, Y_{t+1}, X, t) \right)$$

其中:

  • $f_k$:状态特征函数(state feature),依赖于单个位置的状态 $Y_t$ 和观测 $X$
  • $g_l$:转移特征函数(transition feature),依赖于相邻状态 $Y_t, Y_{t+1}$ 和观测 $X$
  • $\lambda_k, \mu_l$:对应的特征权重(参数)
  • $Z(X) = \sum_{Y} \exp(\ldots)$:归一化因子(对给定 $X$ 求和所有可能的 $Y$ 序列)

统一记法:可以将两类特征函数统一为 $F_j(Y_{t-1}, Y_t, X, t)$,对应统一权重 $w_j$:

$$P(Y|X) = \frac{1}{Z(X)} \exp\left( \sum_{t=1}^{T} \sum_{j=1}^{J} w_j F_j(Y_{t-1}, Y_t, X, t) \right)$$

其中 $Y_0$ 定义为特殊的起始标记(如 <START>)。

3.3 特征函数的设计示例

状态特征(State Features)——仅依赖当前位置的状态和观测:

$$f_k(Y_t, X, t) = \begin{cases} 1 & \text{if } Y_t = \text{NOUN} \text{ and } X_t = \text{'learning'} \\ 0 & \text{otherwise} \end{cases}$$

这表示:当位置 $t$ 的观测词是 “learning” 且标注是 NOUN 时,特征激活。

转移特征(Transition Features)——依赖相邻标注:

$$g_l(Y_t, Y_{t+1}, X, t) = \begin{cases} 1 & \text{if } Y_t = \text{ADJ} \text{ and } Y_{t+1} = \text{NOUN} \\ 0 & \text{otherwise} \end{cases}$$

这表示:形容词后跟名词时,特征激活。这是一个典型的语言学先验——英文中形容词通常修饰其后的名词。

特征权重的作用

  • 如果 $w_{\text{ADJ, NOUN}} > 0$(正权重),模型倾向于在形容词后标注名词
  • 如果 $w_{\text{ADJ, NOUN}} < 0$(负权重),模型倾向于避免这种标注序列

3.4 CRF 与 HMM 的对比视角

HMM 可以视为 CRF 的一个”特例”——当特征函数的设计恰好对应 HMM 的对数转移概率和对数发射概率时:

$$\begin{aligned} P(Y|X)_{\text{HMM}} &= \frac{\prod_t P(Y_t|Y_{t-1}) \cdot P(X_t|Y_t)}{\sum_{Y'} \prod_t P(Y'_t|Y'_{t-1}) \cdot P(X_t|Y'_t)} \\ &= \frac{\exp\left(\sum_t \log a_{Y_{t-1}Y_t} + \sum_t \log b_{Y_t}(X_t)\right)}{\sum_{Y'} \exp(\ldots)} \end{aligned}$$

这恰好是 CRF 在特定特征函数下的形式(取权重为对数概率)。因此:

$$\text{HMM} \subset \text{CRF}$$

CRF 比 HMM 更强大在于:

  1. 特征可以依赖整个 $X$(不限于 $X_t$)——可以使用上下文特征
  2. 特征可以是任意实值函数,不必对应概率
  3. 特征之间可以重叠、相关——不存在 HMM 中”参数独立”的限制

4. 线性链 CRF 的矩阵形式

4.1 引入矩阵表示

对于链式结构,我们可以将因子分解写为矩阵乘积的形式——这为前向-后向算法提���了方便的代数框架。

将特征权重和特征函数聚合为”得分”(score):

$$s_t(y_{t-1}, y_t) = \sum_{j=1}^{J} w_j F_j(y_{t-1}, y_t, X, t)$$

注意 $t=1$ 时定义 $s_1(y_0, y_1) = \sum_j w_j F_j(y_{\text{start}}, y_1, X, 1)$。

定义 $N \times N$ 矩阵($N$ 是 $Y$ 的取值个数):

$$M_t(y_{t-1}, y_t) = \exp(s_t(y_{t-1}, y_t))$$

则条件概率可以写为矩阵乘积的形式:

$$P(Y|X) = \frac{1}{Z(X)} \prod_{t=1}^{T} M_t(Y_{t-1}, Y_t)$$

而归一化因子为:

$$Z(X) = \sum_{Y} \prod_{t=1}^{T} M_t(Y_{t-1}, Y_t) = [M_1 M_2 \cdots M_T]_{\text{start, end}}$$

即所有 $M_t$ 乘积矩阵中从起始状态到结束状态的元素。这与 HMM 的前向递推在数学上是同构的——归一化因子 $Z(X)$ 对所有可能路径的”得分”求和(而非 HMM 中对概率求和)。

4.2 获取条件概率

给定参数后,我们可以计算:

  • $P(Y_t = y | X)$:时刻 $t$ 状态为 $y$ 的边际概率
  • $P(Y_t = y, Y_{t+1} = y’ | X)$:相邻状态的联合边际概率

这些计算依赖前向-后向算法。


5. CRF 的前向-后向算法

5.1 前向向量

定义前向向量 $\alpha_t$,其中 $\alpha_t(y)$ 表示:在时刻 $t$ 状态为 $y$,且观测了 $X_{1:t}$(实际 CRF 中 $X$ 全程可见,”前向”只是对 $Y$ 而言)的所有路径的未归一化得分之和。

$$\alpha_t(y) = \sum_{y_{1:t-1}} \exp\left( \sum_{\tau=1}^{t} s_\tau(y_{\tau-1}, y_\tau) \right) \quad \text{其中 } y_t = y$$

递推公式

$$\alpha_{t+1}(y') = \sum_{y} \alpha_t(y) \cdot \exp(s_{t+1}(y, y'))$$

或写成向量-矩阵形式:

$$\alpha_{t+1} = \alpha_t M_{t+1}$$

其中 $\alpha_t$ 是 $1 \times N$ 的向量。

初始化:$\alpha_0(y_{\text{start}}) = 1$,其余为 0。(在实现中通常 $t=1$ 从实际序列开始。)

5.2 后向向量

定义后向向量 $\beta_t$,其中 $\beta_t(y)$ 表示:在时刻 $t$ 状态为 $y$ 的条件下,从 $t+1$ 到 $T$ 的所有路径的未归一化得分之和。

$$\beta_t(y) = \sum_{y_{t+1:T}} \exp\left( \sum_{\tau=t+1}^{T} s_\tau(y_{\tau-1}, y_\tau) \right) \quad \text{其中 } y_t = y$$

递推公式

$$\beta_t(y) = \sum_{y'} \exp(s_{t+1}(y, y')) \cdot \beta_{t+1}(y')$$

初始化:$\beta_T(y) = 1$(对所有 $y$)。

5.3 归一化因子与前向-后向的关系

归一化因子 $Z(X)$ 可以通过多种方式计算:

$$Z(X) = \sum_{y} \alpha_T(y)$$

$$Z(X) = \sum_{y} \beta_0(y) \cdot \exp(s_1(y_{\text{start}}, y))$$

$$Z(X) = \sum_{y} \alpha_t(y) \cdot \beta_t(y), \quad \forall t$$

5.4 边际概率

单节点边际概率

$$P(Y_t = y | X) = \frac{\alpha_t(y) \cdot \beta_t(y)}{Z(X)}$$

相邻节点边际概率

$$P(Y_t = y, Y_{t+1} = y' | X) = \frac{\alpha_t(y) \cdot \exp(s_{t+1}(y, y')) \cdot \beta_{t+1}(y')}{Z(X)}$$

这与 HMM 中 $\gamma_t(i)$ 和 $\xi_t(i,j)$ 的形式完全对应。HMM 的前向概率和 CRF 的前向向量在数学结构上是同构的,区别仅在于:

  • HMM 中 $\alpha_t(i)$ 是”概率”
  • CRF 中 $\alpha_t(y)$ 是”未归一化的得分”
  • 但两者除以各自的总和后,都成为归一化的条件概率

6. 参数学习

6.1 极大似然估计

给定训练数据 $\mathcal{D} = {(X^{(d)}, Y^{(d)})}_{d=1}^{D}$(监督学习),CRF 的对数似然为:

$$\ell(w) = \sum_{d=1}^{D} \log P(Y^{(d)} | X^{(d)}; w)$$

$$= \sum_{d=1}^{D} \left[ \sum_{t=1}^{T_d} \sum_{j=1}^{J} w_j F_j(Y_{t-1}^{(d)}, Y_t^{(d)}, X^{(d)}, t) - \log Z(X^{(d)}) \right]$$

对数似然的梯度

$$\frac{\partial \ell}{\partial w_j} = \sum_{d=1}^{D} \left[ \sum_{t=1}^{T_d} F_j(Y_{t-1}^{(d)}, Y_t^{(d)}, X^{(d)}, t) - E_{P(Y|X^{(d)})}\left[ \sum_{t=1}^{T_d} F_j(Y_{t-1}, Y_t, X^{(d)}, t) \right] \right]$$

梯度 = 经验特征的计数 - 模型期望特征的计数

  • 第一项是特征 $F_j$ 在训练数据上的经验计数
  • 第二项是特征 $F_j$ 在当前模型 $P(Y|X^{(d)})$ 下的期望计数(通过前向-后向计算边际概率后加权求和)

当梯度为 0 时,经验期望 = 模型期望——这恰好是最大熵原理的约束条件。这说明 CRF 的 MLE 等价于最大熵模型的对偶问题。

6.2 对数似然的凸性

CRF 的对数似然 $\ell(w)$ 是参数 $w$ 的凹函数。具体来说:

$$\frac{\partial \ell}{\partial w_j} = \text{经验计数} - \text{模型期望}$$

$$\frac{\partial^2 \ell}{\partial w_j \partial w_k} = -\text{Cov}_{P(Y|X)}[F_j, F_k] \leq 0$$

二阶导数是特征在模型分布下的协方差的负值——必定是半负定的。因此 $\ell(w)$ 是凹函数,存在唯一的全局最大值(在特征不共线的前提下)。

由于 $\ell$ 是凹函数,梯度下降/上升可以保证收敛到全局最优。

6.3 优化方法

CRF 的训练通常使用以下优化方法:

1. 梯度下降(Gradient Ascent)

$$w_j \leftarrow w_j + \eta \cdot \frac{\partial \ell}{\partial w_j}$$

2. L-BFGS:最常用的方法,利用二阶导数信息的拟牛顿法。结合 line search 确定步长。适用于特征数量在 $10^2-10^4$ 的中等规模 CRF。

3. 随机梯度下降(SGD):每次用一个小批量数据估计梯度。适用于大规模训练数据(如数百万序列)。

4. IIS(Improved Iterative Scaling):当特征满足 $F_j \geq 0$ 且 $\sum_j F_j = \text{constant}$ 时可用。CRF 的 IIS 训练要求每轮迭代中求解前向-后向来计算特征期望。

6.4 对数似然的 L2 正则化

为防止过拟合(特别是特征数量远大于训练样本数时),通常加入 L2 正则化:

$$\ell_{\text{reg}}(w) = \ell(w) - \frac{\lambda}{2} \sum_{j} w_j^2$$

梯度变为:

$$\frac{\partial \ell_{\text{reg}}}{\partial w_j} = \frac{\partial \ell}{\partial w_j} - \lambda w_j$$

加入 L2 后对数似然仍然是凹函数(凹函数减去凸函数 $\lambda w_j^2/2$ 仍是凹的)。

L1 正则化(稀疏化特征权重)也常被使用,但需要使用 OWL-QN(L-BFGS 的 L1 扩展)等特殊优化器。

6.5 IIS 算法在 CRF 中的应用

IIS 的训练步骤与最大熵模型类似,但特征期望的计算需要前向-后向算法。

Algorithm: IIS for Linear-chain CRF
Input: 训练数据 D = {(X^{(d)}, Y^{(d)})}; 特征函数 F_j
Output: 权重 w

1. 初始化 w = 0
2. 计算经验期望 Ẽ_j = (1/D) Σ_d Σ_t F_j(Y_{t-1}^{(d)}, Y_t^{(d)}, X^{(d)}, t)
3. repeat:
4. // 计算模型期望(E-step 对应)
5. for each 序列 (X^{(d)}, Y^{(d)}):
6. 用当前 w 计算前向 α 和后向 β
7. 计算 Z(X^{(d)})
8. 计算边际概率 P(Y_t|X) 和 P(Y_t,Y_{t+1}|X)
9. 累加特征期望 E_j
10. // 更新权重(M-step 对应)
11. for each j:
12. δ_j = (1/M) log(Ẽ_j / E_j)
13. w_j = w_j + δ_j
14. until 收敛

收敛速度:IIS 保证对数似然每次迭代单调递增。收敛率通常为线性,慢于 L-BFGS。因此现代 CRF 实现更倾向于使用 L-BFGS。


7. Viterbi 解码

7.1 CRF 的 Viterbi 算法

给定 $X$ 和参数 $w$,求最可能的状态序列:

$$Y^* = \arg\max_Y P(Y|X) = \arg\max_Y \sum_{t=1}^{T} s_t(Y_{t-1}, Y_t)$$

其中 $s_t$ 是步骤得分。这与 HMM 的 Viterbi 算法完全同构,只需将概率乘法换成得分加法。

7.2 算法伪代码

Algorithm: Viterbi for Linear-chain CRF
Input: 得分矩阵 s_t(y_{t-1}, y_t) for t=1..T
Output: 最优标注序列 Y*

1. // 初始化 (t=1)
2. for each state y:
3. δ_1(y) = s_1(y_start, y) // y_start 是起始状态
4. ψ_1(y) = 0
5. // 递推
6. for t = 1 to T-1:
7. for each y':
8. δ_{t+1}(y') = max_y [δ_t(y) + s_{t+1}(y, y')]
9. ψ_{t+1}(y') = argmax_y [δ_t(y) + s_{t+1}(y, y')]
10. // 终止
11. score* = max_y δ_T(y), y_T* = argmax_y δ_T(y)
12. // 回溯
13. for t = T-1 down to 1:
14. y_t* = ψ_{t+1}(y_{t+1}*)
15. return Y* = (y_1*, ..., y_T*)

复杂度:$O(T \cdot N^2)$($N$ 个标签类型,$T$ 个位置)。与 HMM 相同。

注意:这里的 $\delta_t(y)$ 含义与 HMM 中略有不同:

  • HMM: $\delta_t(i)$ 是”到达状态 $i$ 的最优路径的概率”
  • CRF: $\delta_t(y)$ 是”到达状态 $y$ 的最优路径的对数得分“(即 $\log$ 概率去除了归一化常数)

由于 $\log$ 是单调函数,最大化概率等价于最大化对数得分。


8. 标签偏置问题与 MEMM

8.1 标签偏置问题(Label Bias Problem)

在理解 CRF 之前,有必要了解它的前身 MEMM(Maximum Entropy Markov Model)及后者的标签偏置问题。

MEMM 将每个位置的标注建模为给定前一个标注和观测的条件分布:

$$P(Y_t | Y_{t-1}, X) = \frac{\exp(\sum_j w_j f_j(Y_t, Y_{t-1}, X, t))}{\sum_{y'} \exp(\sum_j w_j f_j(y', Y_{t-1}, X, t))}$$

注意:在每个位置 $t$,MEMM 局部归一化(对每个 $Y_{t-1}$ 独立归一化)。

标签偏置的表现:假设从状态 A 出发,有两条路:A → B(转移概率 0.9)和 A → C(转移概率 0.1)。从状态 C 又有两条路,从状态 B 只有一条路。由于局部归一化,B 之后的唯一路径获得全部概率质量(1.0),而 C 之后的两条路各自获得一定的概率质量。最终,即使 B 之后的唯一路径对应的整体序列概率不高,局部归一化仍会使 MEMM 偏向于通过 B 的路径——因为它强制了从 B 出去的分布是确定性的。

根本原因:局部归一化使得模型”忘记”了前几步的低概率事件——每个位置的归一化只考虑了从前一个状态出发的局部分布,而不考虑全局路径的相对优劣。这导致 MEMM 偏好”出度小”的状态(即转移目标少的状态),即使全局来看这些路径并不更优。

8.2 CRF 如何避免标签偏置

CRF 使用全局归一化:

$$P(Y|X) = \frac{\exp(\sum_{t,j} w_j F_j(Y_{t-1}, Y_t, X, t))}{\sum_{Y'} \exp(\sum_{t,j} w_j F_j(Y'_{t-1}, Y'_t, X, t))}$$

分母 $Z(X)$ 是对所有可能的完整路径求和——不进行局部分别归一化。这意味着:

  1. 从一个状态出发到不同后继的”分支”之间可以正确比较整体路径的好坏
  2. 某个状态后面的唯一后继不会”抢夺”全部概率——因为归一化发生在全局层面
  3. MEMM 的标签偏置问题在 CRF 中被彻底消除了

MEMM vs CRF 总结

特性 MEMM CRF
模型类型 判别式 判别式
归一化 局部(per-state) 全局(per-sequence)
标签偏置
训练效率 更快(不需前向-后向) 更慢(需要前向-后向)
表达能力 受限(局部归一化的偏置) 更强
历史定位 CRF 的前身 MEMM 的改进

9. Bi-LSTM-CRF 与现代序列标注

9.1 从手工特征到自动特征

传统 CRF 的特征函数 $F_j$ 需要人工设计。这既是优势(可以注入领域知识)也是劣势(需要大量特征工程)。

Bi-LSTM-CRF(Huang et al., 2015)的核心创新是用 Bi-LSTM 替换手工特征提取:

  1. Bi-LSTM 层:对输入序列的每个位置,生成一个上下文相关的向量表示 $h_t$(拼接前向和后向 LSTM 的隐藏状态)
  2. 全连接层:将 $h_t$ 映射为每个标签的”发射得分” $e_t(y) = W \cdot h_t + b$
  3. CRF 层:使用可学习的转移矩阵 $T$($T[y’][y]$ 表示从标签 $y’$ 到 $y$ 的转移得分)

整个模型的得分函数为:

$$s(Y|X) = \sum_{t=1}^{T} e_t(Y_t) + \sum_{t=1}^{T-1} T[Y_t][Y_{t+1}]$$

这与 CRF 的得分函数形式一致($e_t$ 对应状态特征得分,$T$ 对应转移特征得分),但 $e_t$ 来自神经网络而非手工特征。

9.2 训练与推理

  • 训练:最大化对数似然,使用 SGD/Adam 优化整个网络(LSTM + CRF 参数端到端训练)。CRF 层的前向-后向算法用于计算归一化因子 $Z(X)$。
  • 解码:Viterbi 算法(与标准 CRF 完全相同)。
  • Loss 的意义:$\text{Loss} = -\log P(Y|X) = -s(Y|X) + \log Z(X)$。最小化 Loss 等价于让正确路径的得分 $s(Y|X)$ 尽可能大,同时让所有路径的 log-sum-exp $\log Z(X)$ 尽可能小(即正确路径相对于错误路径的得分差尽可能大)。

9.3 为什么 LSTM 之后还要加 CRF 层?

单纯使用 Bi-LSTM + Softmax(逐位置独立预测标签)存在两个问题:

  1. 无法建模标签之间的转移约束:如 I-PER 不能出现在 B-PER 之前、B-ORG 后面不能跟 I-LOC 等。Softmax 不关心这些结构约束。
  2. 无法利用标签转移的全局信息:LSTM 虽然可以捕获输入侧的长程依赖,但标签侧的依赖需要通过 CRF 的全局归一化来保证。

CRF 层的作用就是在 LSTM 输出的局部得分之上,学习一个标签转移矩阵,然后通过全局 Viterbi 解码找到最优的完整标注序列。


10. CRF++ 工具简介

CRF++ 是 Taku Kudo 开发的开源 CRF 工具(C++ 实现),是传统(非深度)CRF 的事实标准。

10.1 数据格式

token  feature1  feature2  ...  label

每一行对应一个词的 token。空行分隔句子。

示例(中文分词,BEMS 标注):

我   B
爱 S
北京 B
天安门 E

每个 token 可以有多列特征(如词本身、词性、前后词等),CRF++ 自动生成特征模板。

10.2 特征模板

CRF++ 的特征模板定义了如何从训练数据中自动生成特征函数。模板文件示例:

# Unigram (状态特征)
U00:%x[-2,0] # 前两个词的 word
U01:%x[-1,0] # 前一个词的 word
U02:%x[0,0] # 当前词的 word
U03:%x[1,0] # 后一个词的 word
U04:%x[2,0] # 后两个词的 word
U05:%x[-1,0]/%x[0,0] # 前一个词和当前词的组合

# Bigram (转移特征)
B

U 开头的模板只生成状态特征(依赖当前标签),B 生成转移特征(依赖当前和前一标签)。

%x[row, col] 的含义:row 表示相对当前 token 的偏移量(负数为前、正数为后),col 表示数据中的第几列。

10.3 训练与预测

# 训练
crf_learn -f 3 -c 4.0 template train.txt model

# 预测
crf_test -m model test.txt > output.txt

参数说明:

  • -f:特征频次阈值,低于此值的特征被过滤
  • -c:L2 正则化强度的倒数($C = 1/\lambda$)。越大正则化越弱。

11. 数值计算示例:CRF 的完整推导

11.1 问题设定

我们用一个简化版 NER 标注问题来演示 CRF 的计算。观测序列 $X =$ (“John”, “lives”, “in”, “London”),标签集合 $\mathcal{Y} = {\text{B-PER}, \text{O}, \text{B-LOC}}$(简写为 B-P, O, B-L)。

假设我们已经训练好或预设了以下参数(得分,未归一化):

**转移得分矩阵 $T$**($T[y’][y]$ = 从前一标签 $y’$ 转移到当前标签 $y$ 的得分):

$y’ \setminus y$ B-P O B-L
START 0.1 0.5 0.1
B-P 0.1 1.0 0.1
O 0.5 0.3 0.8
B-L 0.1 1.0 0.1

**发射得分 $E_t(y)$**(由 LSTM 或简单词表给出,位置 $t$ 上标签 $y$ 的得分):

位置 B-P O B-L
1 John 1.5 0.2 0.1
2 lives 0.1 1.2 0.1
3 in 0.1 1.0 0.1
4 London 0.3 0.2 1.8

总得分:一条标注序列 $Y = (y_1, y_2, y_3, y_4)$ 的总得分为:

$$s(Y) = \sum_{t=1}^{4} [T[y_{t-1}][y_t] + E_t(y_t)]$$

其中 $y_0 = \text{START}$。

11.2 前向递推

令 $\alpha_t(y)$ = 在位置 $t$ 标签为 $y$ 的所有前缀路径的未归一化总得分。

**$t=1$**:

$$\alpha_1(\text{B-P}) = \exp(T[\text{START}][\text{B-P}] + E_1(\text{B-P})) = \exp(0.1 + 1.5) = e^{1.6} \approx 4.953$$
$$\alpha_1(\text{O}) = \exp(0.5 + 0.2) = e^{0.7} \approx 2.014$$
$$\alpha_1(\text{B-L}) = \exp(0.1 + 0.1) = e^{0.2} \approx 1.221$$

**$t=2$**:

$$\alpha_2(y) = \sum_{y'} \alpha_1(y') \cdot \exp(T[y'][y] + E_2(y))$$

$$\begin{aligned} \alpha_2(\text{B-P}) &= [4.953 \cdot e^{0.1+0.1} + 2.014 \cdot e^{0.5+0.1} + 1.221 \cdot e^{0.1+0.1}] \\ &= [4.953 \times 1.221 + 2.014 \times 1.822 + 1.221 \times 1.221] \\ &\approx 6.047 + 3.669 + 1.491 = 11.207 \end{aligned}$$

类似地:
$$\alpha_2(\text{O}) \approx 14.879$$
$$\alpha_2(\text{B-L}) \approx 5.766$$

**$t=3, 4$**:继续递推…

归一化因子

$$Z = \sum_{y} \alpha_4(y)$$

(在实际数值示例中由于空间限制省略后续计算,但不影响对算法结构的理解)

11.3 边际概率计算

以 $P(Y_2 = \text{O} | X)$ 为例,需要:

  • $\alpha_2(\text{O})$(前向到位置 2 标签 O 的总得分)
  • $\beta_2(\text{O})$(从位置 2 标签 O 到结尾的后向总得分)

$$P(Y_2 = \text{O} | X) = \frac{\alpha_2(\text{O}) \cdot \beta_2(\text{O})}{Z}$$

后向概率 $\beta_2(\text{O})$ 的计算:从 $t=2$ 标签 O 出发,考虑所有可能的 $y_3, y_4$ 组合,累加 $\exp(T[\text{O}][y_3] + E_3(y_3) + T[y_3][y_4] + E_4(y_4))$。

11.4 Viterbi 解码

得分路径搜索(使用 $\max$ 而非 $\sum$):

**$t=1$**:

  • $\delta_1(\text{B-P}) = 1.6$, $\delta_1(\text{O}) = 0.7$, $\delta_1(\text{B-L}) = 0.2$

**$t=2$**:

  • $\delta_2(\text{O}) = \max[1.6 + 1.0 + 1.2, 0.7 + 0.3 + 1.2, 0.2 + 1.0 + 1.2] = \max[3.8, 2.2, 2.4] = 3.8$
    $\psi_2(\text{O}) = \text{B-P}$(回溯到 B-P)

继续递推并回溯,得到最优序列。在这个例子中,由于 “John” 发射得分明显偏好 B-P、”London” 发射得分明显偏好 B-L,且 B-P→O 和 O→B-L 的转移得分都很高,最佳标注序列预计为:

$$\text{(B-P, O, O, B-L)}$$

即 “John-PER lives-O in-O London-LOC”——这是完全正确的命名实体识别。


12. 势函数设计与特征工程

12.1 原子特征设计

CRF 的性能高度依赖于特征函数的设计。以下是一个 NER 任务中典型的特征集:

字符级特征(不依赖外部词典资源):

  • 当前词
  • 当前词的前缀/后缀(如前 1-4 个字符、后 1-4 个字符):如 “-ing”, “-tion”, “geo-“
  • 当前词是否首字母大写
  • 当前词是否全部大写
  • 当前词是否包含数字
  • 当前词是否包含连字符
  • 当前词的长度

词性特征(依赖 POS tagger):

  • 当前词的词性
  • 前一个/后一个词的词性
  • 当前词+词性的组合

词典特征(依赖外部知识库):

  • 当前词是否在已知人名词典中
  • 当前词是否在已知地名词典中
  • 当前词是否在已知组织名词典中

上下文特征

  • 前一个词 / 后一个词
  • 前两个词 / 后两个词
  • 前一个词+当前词的组合
  • 窗口内的词袋

12.2 CRF++ 特征模板详解

CRF++ 的模板语法中,%x[row, col] 定义了特征如何从数据行中自动展开:

# 假设每行数据格式为: word pos chunk label

# Unigram features (U-prefix) - 只依赖当前标签和 X
U00:%x[-1,0] # 前一个词
U01:%x[0,0] # 当前词
U02:%x[1,0] # 下一个词
U03:%x[-1,0]/%x[0,0] # 前一个词+当前词(组合特征)
U04:%x[0,0]/%x[1,0] # 当前词+下一个词
U05:%x[-1,1] # 前一个词的词性
U06:%x[0,1] # 当前词的词性
U07:%x[1,1] # 下一个词的词性
U08:%x[-1,1]/%x[0,1] # 前一个词性+当前词性

# Bigram features (B-prefix) - 依赖前一标签和当前标签
B

CRF++ 自动展开这些模板:对于每个训练样本的每个位置,检查模板中的模式是否匹配,如匹配则生成一个特征。例如 U02:%x[1,0] 展开为类似”如果下一个词是 ‘London’ 且当前标签是 B-LOC,特征值为 1”。

模板设计经验

  1. 从简单开始:U00-U02(前后各一个词的窗口)通常是最基础的
  2. 逐步添加组合特征(/ 连接):U03-U04。组合特征可以捕获词序列模式,但也会爆炸特征维数
  3. 添加外部特征列(如 POS、chunk):如果数据包含这些列
  4. Bigram 特征(B)通常总是加上——它让模型学习标签转移偏好
  5. 使用 -f 参数过滤低频特征:避免模型被极少出现的”记忆性”特征主导

13. 面试高频问答

Q1: CRF 和 HMM 的核心区别是什么?

A: 四个维度:

  1. 生成式 vs 判别式:HMM 建模 $P(X,Y)$(生成式),CRF 建模 $P(Y|X)$(判别式)
  2. 归一化:HMM 局部归一化(转移概率和发射概率各自独立归一化),CRF 全局归一化(对完整序列路径)
  3. 特征灵活性:HMM 的参数对应固定的概率(转移概率、发射概率),CRF 可以使用任意特征函数,特征之间可以重叠和关联
  4. 观测独立性:HMM 假设 $X_t$ 仅依赖 $Y_t$,CRF 的特征函数可以依赖整个 $X$ 序列(可使用上下文特征)

Q2: Hammersley-Clifford 定理说明了什么?为什么对 CRF 重要?

A: H-C 定理指出:对于正的联合分布 $P(X) > 0$,$P$ 满足无向图上的全部条件独立性,当且仅当 $P$ 可分解为图中所有极大团上的势函数之积。对 CRF 的意义:它保证了我们只需定义团上的势函数(在链 CRF 中就是相邻状态对),由此产生的分布自然满足链式结构的条件独立性——这是 CRF 模型形式正确的理论保证。它也提供了一个构造 MRF 的标准方法:不需要直接处理复杂的条件独立性条件,只需定义团势函数即可。

Q3: 什么是标签偏置问题(Label Bias Problem)?CRF 如何解决的?

A: 标签偏置出现在 MEMM 中——由于局部归一化,每个状态出发的转移概率必须和为 1。这导致”出度小”的状态(转移目标少)在每条路径上获得不成比例的大概率。极端情况下,一个状态如果只有一个后继,从它出发转移到该后继的概率恒为 1,无论全局来看该路径有多差。CRF 通过全局归一化解决:$Z(X)$ 是对所有可能完整路径求和的单一天下归一化,不同路径之间的比较是公平的——不存在局部概率质量被强制分配的问题。

Q4: 为什么 MEMM 的训练比 CRF 快,但实践中仍偏好 CRF?

A: MEMM 的每个位置独立做局部分类(如多类逻辑回归),不需要前向-后向算法来求全局归一化——因此每轮迭代更快。但 MEMM 的标签偏置会导致模型系统性偏好某些标注(出度小的标注),这在序列标注任务中直接损害精度。CRF 每轮需要 $O(T N^2)$ 的前向-后向计算,训练更慢,但标签偏置被消除且表达能力更强——因此当计算资源允许时(特别是对于中等规模的序列标注任务),CRF 是更好的选择。

Q5: 推导 CRF 对数似然的梯度,并解释其结构。

A: $\ell(w) = \sum_t \sum_j w_j F_j(Y_{t-1}, Y_t, X, t) - \log Z(X)$

$$\frac{\partial \ell}{\partial w_j} = \sum_t F_j(Y_{t-1}, Y_t, X, t) - \frac{1}{Z(X)} \frac{\partial Z(X)}{\partial w_j}$$

$$\frac{\partial Z(X)}{\partial w_j} = \sum_{Y'} \exp\left(\sum_t \sum_k w_k F_k\right) \cdot \sum_t F_j(Y'_{t-1}, Y'_t, X, t)$$

$$\frac{\partial \ell}{\partial w_j} = \underbrace{\sum_t F_j(Y, X, t)}_{\text{经验特征计数}} - \underbrace{E_{P(Y'|X)}\left[\sum_t F_j(Y', X, t)\right]}_{\text{模型期望特征计数}}$$

结构:梯度 = 训练数据中特征被激活的次数 - 当前模型期望下特征被激活的期望次数。当梯度为零时,$\tilde{E}(F_j) = E_P(F_j)$——即经验期望等于模型期望,这正是最大熵原理的核心约束。这与逻辑回归的梯度 $\sum_i (\hat{y}_i - y_i)x_i$ 在精神上完全一致(预测期望 - 真实值)。

Q6: 为什么使用 Bi-LSTM + CRF 而不是直接 Bi-LSTM + Softmax 做序列标注?

A: Bi-LSTM + Softmax 对每个位置做独立预测,忽略了标签之间的结构约束。例如在 NER 中,I-PER 不应该出现在 B-PER 之前,这种约束无法被 Softmax 捕获。CRF 层引入了一个可学习的标签转移矩阵,并通过全局 Viterbi 解码确保输出序列在标签转移层面是合理的。实验上,增加 CRF 层通常能带来 1-3 个百分点的 F1 提升——这对序列标注任务非常关键。

Q7: L-BFGS 在 CRF 训练中相比于 SGD 有何优势?

A: L-BFGS 是拟牛顿法,利用最近 $m$ 步的梯度和参数差来近似 Hessian 的逆。它自动估计”曲率”信息,因此:

  1. 不需要调学习率(使用 line search 或 Wolfe 条件自动确定步长)
  2. 超线性收敛率(远快于 SGD 的次线性收敛率)
  3. 内存消耗 $O(md)$($m$ 通常为 10,$d$ 为特征数),可接受

SGD 的优势在于可以处理大规模数据(每次只用 mini-batch 估计梯度),但需要手动调学习率和学习率衰减策略。对于特征数在数千到数万级别的 CRF,L-BFGS 通常是首选。

Q8: CRF 的全局归一化因子 $Z(X)$ 如何计算?为什么它是 CRF 的瓶颈?

A: 对于线性链 CRF,$Z(X) = \sum_{Y} \exp(s(Y|X))$ 通过前向算法递推计算,复杂度为 $O(T \cdot N^2)$。$Z(X)$ 是 CRF 的计算瓶颈,因为:(1) 每次计算梯度时都需要重新计算 $Z(X)$(涉及整个序列的前向递推);(2) 虽然前向算法的 $O(T N^2)$ 比指数级的直接求和 $O(N^T)$ 好得多,但当标签集很大(如序列标注中 $N>100$)时,$N^2$ 因子仍然可观。这也是为什么现代神经网络+CRF 的搭配中,标签集通常较小(NER 的 BIOES 共 17 类左右),使得 $N^2$ 保持在可控范围。对于大规模标签的应用(如语言模型的输出层有 50000 个 token),CRF 不可行——此时用 softmax + beam search 替代。

Q9: 传统 CRF 和 Bi-LSTM-CRF 各有什么优缺点?如何选择?

A:

维度 传统 CRF (CRF++) Bi-LSTM-CRF
特征 手工设计(需领域专家) 自动学习(LSTM 提取)
训练数据需求 小(数千条即可) 较大(通常数万条以上)
训练时间 快(L-BFGS 收敛快) 慢(SGD/Adam 需要更多迭代)
推理时间 中等(LSTM 前向传播 + Viterbi)
精度上限 受限于特征质量 通常更高(自动学习非线性和长程依赖)
可解释性 高(每个特征权重可查) 低(黑盒 LSTM)
调参 少(C, f 参数) 多(学习率, dropout, layer, hidden size…)
适用场景 小样本 + 有领域知识 大样本 + 端到端训练

选择指南:如果标注数据小于 5000 条且有领域专家可以设计特征,用传统 CRF;如果标注数据大于 10000 条且追求最高精度,用 Bi-LSTM-CRF;如果有预训练语言模型(如 BERT),可以直接 finetune BERT + CRF。

Q10: CRF 可以用于非序列结构化预测任务吗?

A: 可以。CRF 的”链”只是图结构的一种特例。一般 CRF(General CRF)的图结构可以是任意的无向图,只要你能在该图上高效地进行推断(或者近似推断)。典型应用包括:

  1. 图像分割:像素或超像素构成网格图(grid graph),每个像素预测其类别标签。相邻像素倾向于共享相同标签(平滑先验)。
  2. 3D 体素标注:医学图像(CT/MRI)的三维网格图 CRF。
  3. 语义分割的 Dense CRF(Krahenbuhl & Koltun, 2011):在全连接的 CRF 上使用高效的均值场推断(mean-field inference),大幅加速了像素级的结构化预测。
  4. Table extraction:从文档扫描件中提取表格结构(二维网格结构)。

在一般图结构上,精确推断(计算 $Z(X)$ 和边际概率)需要在连接树(junction tree)上进行,其复杂度随树宽(treewidth)指数增长。对于树宽大的图,只能使用近似推断(如 loopy BP, mean-field, 或采样方法)。


14. 条件随机场的最大熵视角

14.1 CRF 作为条件最大熵模型

CRF 与最大熵模型有深刻的联系。实际上,线性链 CRF 可以看作是序列版本的条件最大熵模型——最大熵模型对单个位置做分类,CRF 对整个序列做联合预测。

考虑在所有可能的条件概率分布 $P(Y|X)$ 中,我们要求分布满足一组特征约束(模型期望 = 经验期望),然后选择熵最大的那个分布:

$$\max_P H(P) = -\sum_{X,Y} \tilde{P}(X) P(Y|X) \log P(Y|X)$$

$$\text{s.t.} \quad E_P[F_j] = \tilde{E}[F_j], \quad \forall j$$

根据 Lagrange 变分法,这个约束优化问题的解恰好是 CRF 的指数族形式:

$$P(Y|X) = \frac{1}{Z(X)} \exp\left(\sum_j w_j F_j(Y, X)\right)$$

对偶问题是最小化负对数似然(即 CRF 的 MLE):

$$\min_w \quad -\sum_d \log P(Y^{(d)}|X^{(d)})$$

这与逻辑回归-最大熵的原始-对偶关系完全平行——CRF 的 MLE 训练等价于在满足特征矩约束的条件下最大化条件熵。这一对偶关系是理解 CRF 的理论深度的关键。

14.2 特征选择与模型复杂度

CRF 的特征数量 $J$ 决定了模型复杂度。过多的特征导致:

  1. 训练变慢(每秒需要计算 $J$ 个特征的期望)
  2. 容易过拟合(特别是在训练数据有限时)

特征选择策略

  1. 频次过滤:丢弃在训练数据中出现次数极少的特征(如 CRF++ 的 -f 参数)
  2. L1 正则化:自动将许多特征权重置为零(特征选择 + 模型训练一步完成)
  3. 基于信息增益的预筛选:对每个候选特征,计算其与标签的互信息或信息增益,保留 top-K

L1 正则化在 CRF 中的挑战在于优化——由于 L1 在零处不可导,不能直接用 L-BFGS。需要用 OWL-QN(Orthant-Wise Limited-memory Quasi-Newton)等特殊优化器。

14.3 链式 CRF 的限制

线性链 CRF 假设 $Y_t$ 仅与 $Y_{t-1}$ 和 $Y_{t+1}$ 直接相关(一阶马尔可夫性)。在某些应用中,需要更高阶的依赖:

  • 跳阶 CRF(Skip-chain CRF):允许不相邻的 $Y_i$ 和 $Y_j$ 之间存在边(如指代消解中两个提及共享同一实体的关系)
  • 层级 CRF(Hierarchical CRF):在序列标注上叠加树结构(如句法分析中的依存关系)
  • 因子图 CRF:最一般的形式,$Y$ 的空间依赖结构通过因子图显式定义

这些扩展在表达能力更强大的同时,也使得训练中的前向-后向算法不再适用(因为 $Y$ 不再具有链结构)。常用的解决方案包括 loopy belief propagation(近似推断)或 structured SVM(用 max-margin 代替 MLE)。


15. 面试高频问答(续)

(问答 Q8-Q10 见上方)

Q11: CRF 的损失函数是凸函数吗?全局最优解是否唯一?

A: 不含隐藏变量的 CRF(即训练数据提供了完整标注,没有隐状态)的对数似然 $\ell(w) = \sum_d [\sum_{t,j} w_j F_j - \log Z(X^{(d)})]$ 是 $w$ 的严格凹函数(Hessian 是负半定的)。证明:$\frac{\partial^2 \ell}{\partial w_j \partial w_k} = -\text{Cov}_{P(Y|X)}[\sum_t F_j, \sum_t F_k]$。协方差矩阵是半正定的,取其负值即为半负定。因此存在唯一的全局最大值(前提是特征之间不存在线性依赖)。如果有隐状态(如 HCRF, Hidden CRF),损失函数变为非凸(因为 log-sum 嵌套),需要 EM 或梯度方法寻找局部最优。

Q12: 线性链 CRF 的前向-后向算法与 HMM 的前向-后向算法有什么本质异同?

A:

维度 HMM CRF
递推目标 计算概率 $P(O\vert\lambda)$ 计算归一化因子 $Z(X)$
递推公式 $\alpha_{t+1}(j) = [\sum_i \alpha_t(i) a_{ij}] b_j(o_{t+1})$ $\alpha_{t+1}(y) = \sum_{y’} \alpha_t(y’) \exp(s_{t+1}(y’, y))$
空间含义 $\alpha_t(i)$ 是”到达状态 $i$ 的部分序列概率” $\alpha_t(y)$ 是”到达标签 $y$ 的未归一化得分”
数学结构 同构(矩阵-向量乘法) 同构
$\gamma_t$ 含义 $P(i_t \vert O)$ $P(y_t \vert X)$
归一化时机 转移/发射已局部归一化 全局归一化(前向结束后除 $Z$)
数值稳定性 需要 scaling(概率连乘下溢) 需要 log-space 计算(得分指数爆炸)

本质相同:两者都是”sum-product”消息传递算法在链式图上的特例。HMM 的因子是概率(已在 $[0,1]$),CRF 的因子是得分(可在 $\mathbb{R}$ 中)。这也是为什么将 HMM 的前向算法中概率 $a_{ij}, b_j$ 替换为 $\exp(\text{score})$ 后,得到的就是 CRF 的前向算法。

Q13: 实现 CRF 时需要注意哪些数值稳定性问题?

A:

  1. 指数上溢:$\exp(s_t)$ 当 $s_t > 700$(float32)时会溢出。解决方案:所有计算在 log-space 中进行,使用 logsumexp 操作。
  2. logsumexp 的实现:$\log \sum_i \exp(x_i) = x_{\max} + \log \sum_i \exp(x_i - x_{\max})$。减去最大值后再求指数,既避免了上溢,也保持了数值精度。
  3. Viterbi 的 log-space 版本:$\delta_{t+1}(y’) = \max_y [\delta_t(y) + s_{t+1}(y, y’)]$。求和(前向)对应对数域的 logsumexp,最大化(Viterbi)对应对数域的 max——两者在 log-space 中都是数值稳定的。
  4. 长序列上的得分累积:当 $T$ 很大时,即使 log-space 中 $\alpha_t$ 的值也会很大(但不会溢出因为我们在对数域)。前向-后向最终归一化需要 $\gamma_t = \exp(\alpha_t + \beta_t - \log Z)$,这是稳定的因为 $\alpha_t + \beta_t - \log Z \leq 0$。

Q14: 比较 CRF 与 Seq2Seq with Attention 在序列标注任务上的优劣。

A: 在 NLP 的序列标注任务(如 NER, POS tagging, chunking)中:

  • CRF/Bi-LSTM-CRF 的优势

    1. 天然适配序列标注——输出标签数与输入词数严格一致(一对一映射)
    2. CRF 的转移矩阵提供了序列标注所需的结构约束
    3. 收敛快,训练稳定(CRF 损失是凸的,LSTM-CRF 虽然是联合非凸但通常也稳定)
    4. 在标记数据有限时,手工特征 + CRF 优于小样本的端到端 seq2seq
  • Seq2Seq with Attention 的优势

    1. 可以灵活处理输入输出长度不对等的情况(如翻译、摘要)
    2. 注意力机制提供了软对齐,可捕获长程依赖
    3. 在大规模数据上可通过预训练语言模型(如 BART, T5)实现更高的精度
  • 选型建议

    • 标准序列标注(NER/POS/Chunking)→ Bi-LSTM-CRF 或 BERT + CRF
    • 需要生成式输出(如文本纠错、摘要)→ Seq2Seq + Attention
    • 极低资源(<1000 样本)→ 手工特征 CRF 仍然有竞争力
    • 极高资源(>100 万样本)+ 追求 SOTA → 预训练 + finetune (BERT, RoBERTa + CRF 或直接 token classification head)

Q15: 在 CRF 的训练过程中,每次梯度更新都需要前向-后向计算吗?为什么这么昂贵?

A: 是的。每次计算 $\nabla_w \ell$ 时,第二项(模型期望特征计数)需要通过前向-后向计算:先对所有训练序列计算 $\alpha$ 和 $\beta$ 得到 $Z(X)$ 和 $\gamma_t(y), P(Y_t=y, Y_{t+1}=y’|X)$,然后累加特征在这些边际概率下的期望。这个过程的计算量为 $O(D \cdot T_{\text{avg}} \cdot N^2)$($D$ 是训练序列数)。当 $D$ 很大时,完整遍历数据集计算一次梯度可能非常耗时。正是这个原因,CRF 的 SGD/mini-batch 训练并不像神经网络那样 trivial——每个 mini-batch 仍然需要独立的前向-后向计算。现代实践通常:(1) 限制标签数 $N$ 不太大;(2) 使用 GPU 加速前向-后向的矩阵运算;(3) 使用预训练的 LSTM/BERT 做特征提取,使 CRF 层只需极少轮次 finetune。


16. 一般 CRF 的推断与学习

16.1 精确推断的局限性

线性链 CRF 之所以高效,是因为链结构使得前向-后向算法可以在 $O(T N^2)$ 时间内精确计算归一化因子和边际概率。这依赖于一个核心性质:树宽(treewidth)为 1

对于一般的图结构(如网格图、全连接图),treewidth 通常远大于 1。精确推断需要构造连接树(Junction Tree)并在其上运行信念传播(Belief Propagation, BP),复杂度为 $O(N^{w+1})$,其中 $w$ 是 treewidth。对于图像分割中的 2D 网格图,$w = \min(\text{rows}, \text{cols})$——当图像为 $100 \times 100$ 时,$w = 100$,精确推断不可行。

16.2 近似推断方法

1. Loopy Belief Propagation(LBP, 循环信念传播)

在一般图上直接运行 BP(即使有循环),将消息传递迭代直到(希望)收敛。这不是精确的,但在许多实际应用中效果令人满意。

消息更新规则:

$$m_{i \to j}^{(t+1)}(x_j) = \sum_{x_i} \psi_{ij}(x_i, x_j) \phi_i(x_i) \prod_{k \in \mathcal{N}(i) \setminus \{j\}} m_{k \to i}^{(t)}(x_i)$$

LBP 不保证收敛;当它确实收敛时,得到的边际概率是 Bethe 近似的结果。

2. Mean-Field Inference(均值场推断)

用因子化的分布 $Q(Y) = \prod_i Q_i(Y_i)$ 来近似真实后验 $P(Y|X)$:

$$\log Q_i(Y_i) = E_{Q_{-i}}[\log P(Y_i | Y_{-i}, X)] + \text{const}$$

均值场在 Dense CRF(全连接图)中特别高效——通过高斯滤波加速消息传递(Krahenbuhl & Koltun, 2011)。在语义分割中的 Dense CRF 后处理步骤能在秒级内完成百万像素级的全连接 CRF 推断。

3. Sampling(采样)

MCMC(马尔可夫链蒙特卡洛)方法如 Gibbs sampling 可以用来近似期望。但 MCMC 在 CRF 中通常太慢,不适用于训练循环(训练需要每轮迭代重新估计期望)。

16.3 结构化 SVM 作为 CRF 的替代

当 CRF 的似然训练太慢时,可以使用结构化 SVM(Structural SVM / SSVM)直接优化 max-margin 目标,避免计算 $Z(X)$:

$$\min_w \frac{1}{2}\|w\|^2 + C \sum_d \xi_d$$

$$\text{s.t.} \quad s(Y^{(d)}|X^{(d)}) - s(Y|X^{(d)}) \geq \Delta(Y^{(d)}, Y) - \xi_d, \quad \forall Y \neq Y^{(d)}$$

其中 $\Delta(Y^{(d)}, Y)$ 是结构化 Hamming 损失或其他任务特定的距离度量。

训练 SSVM 只需要”找到当前模型下得分最高的错误标注”(loss-augmented inference),这通常比计算完整的 $Z(X)$ 便宜得多。SSVM 在图像分割、语义解析等结构预测任务中与 CRF 性能接近,但训练更快。


17. 总结

条件随机场从无向图模型的框架出发,通过 Hammersley-Clifford 定理建立了”图分离条件独立性”与”团因子分解”的等价关系,进而自然地导出线性链 CRF 的参数化形式。CRF 的三个核心算法——前向-后向(概率计算)、Viterbi(推理)、IIS/L-BFGS(学习)——在计算结构上与 HMM 高度同构,但语义上从”概率”迁移到了”未归一化得分”(等价于对数概率减去常数)。

CRF 知识地图

概率图模型
├── 有向图(贝叶斯网络)
│ └── HMM
│ └── 生成式:P(X,Y) = P(Y) P(X|Y)
│ └── 局限:观测独立性、局部归一化、不能重叠特征

└── 无向图(马尔可夫随机场)
└── Hammersley-Clifford 定理 → 团分解
├── CRF:P(Y|X) = (1/Z) exp(Σ wF) 判别式、全局归一化
│ ├── 线性链 CRF → 序列标注 SOTA
│ ├── Bi-LSTM-CRF → 深度学习 + CRF
│ └── general CRF → 图像分割、3D 体素标注
└── MEMM(局部归一化)→ 标签偏置问题

实践建议

  • 小规模序列标注、特征可手工设计 → CRF++、sklearn-crfsuite
  • 中大规模、需要自动特征学习 → Bi-LSTM-CRF (PyTorch/TensorFlow)
  • 超大规模 NLP(BERT 级别预训练) → BERT + CRF 或直接 BERT + Softmax(预训练模型已经捕获了大部分依赖)

理解 CRF 的最好方式是将它与 HMM 做对应:每个 HMM 的概念在 CRF 中都有一个对应物(前向-后向、Viterbi、$\alpha$/$\beta$/$\gamma$/$\xi$),唯一的变化是从局部归一化的概率空间迁移到了全局归一化的得分空间。一旦建立了这个认知桥梁,CRF 就不再神秘。


本文是【统计学习方法死磕系列】的最后一篇。从 SVM、逻辑回归、决策树、提升算法,到 HMM 和 CRF——这个系列覆盖了统计学习中最核心的几类模型。希望这些死磕式的推导和案例分析能帮助你在面试和实际工作中建立扎实的机器学习理论基础。


扩展阅读推荐

  • Lafferty, McCallum & Pereira (2001), Conditional Random Fields: Probabilistic Models for Segmenting and Labeling Sequence Data — CRF 的开山论文
  • Sutton & McCallum (2012), An Introduction to Conditional Random Fields — CRF 最全面的综述(Foundations and Trends in Machine Learning)
  • Sha & Pereira (2003), Shallow Parsing with Conditional Random Fields — CRF 在 NLP 中的经典应用
  • Huang, Xu & Yu (2015), Bidirectional LSTM-CRF Models for Sequence Tagging — Bi-LSTM-CRF 开创性工作
  • Koller & Friedman (2009), Probabilistic Graphical Models: Principles and Techniques — 概率图模型圣经,第 19-20 章详尽讨论无向图模型和 CRF
  • Krahenbuhl & Koltun (2011), Efficient Inference in Fully Connected CRFs with Gaussian Edge Potentials — Dense CRF 的高效推断,语义分割的经典后处理方法
  • Murphy (2012), Machine Learning: A Probabilistic Perspective, Chapter 19 — 深入讲解 CRF 的概率图视角
  • Wallach (2004), Conditional Random Fields: An Introduction — 比 Sutton & McCallum 更简洁的入门材料

CRF 关键公式速查

公式 表达式 用途
条件概率 $P(Y\vert X) = \frac{1}{Z(X)} \exp(\sum_{t,j} w_j F_j(Y_{t-1},Y_t,X,t))$ 模型定义
得分函数 $s_t(y_{t-1},y_t) = \sum_j w_j F_j(y_{t-1},y_t,X,t)$ 简化记号
归一化因子 $Z(X) = \sum_Y \exp(\sum_t s_t(Y_{t-1},Y_t))$ 全局归一化
前向递推 $\alpha_{t+1}(y) = \sum_{y’} \alpha_t(y’) \exp(s_{t+1}(y’,y))$ 计算 $Z(X)$
后向递推 $\beta_t(y) = \sum_{y’} \exp(s_{t+1}(y,y’)) \beta_{t+1}(y’)$ 计算边际
$\gamma_t(y)=P(Y_t=y\vert X)$ $\alpha_t(y)\beta_t(y)/Z(X)$ 单节点边际
$\xi_t(y,y’)=P(Y_t=y,Y_{t+1}=y’\vert X)$ $\alpha_t(y) \exp(s_{t+1}(y,y’)) \beta_{t+1}(y’)/Z(X)$ 相邻节点边际
对数似然梯度 $\frac{\partial \ell}{\partial w_j} = \sum_t F_j - E_P[\sum_t F_j]$ 学习
Viterbi 递推 $\delta_{t+1}(y’) = \max_y [\delta_t(y) + s_{t+1}(y,y’)]$ 解码

工具推荐

  • **CRF++**(C++):经典工具,特征模板驱动,适合手工特征 + 中小规模数据
  • sklearn-crfsuite(Python):CRFsuite 的 sklearn 兼容包装,API 友好
  • python-crfsuite(Python):CRFsuite 的 Python 绑定
  • PyTorch / TensorFlow:自行实现 Bi-LSTM-CRF(或使用 AllenNLP / Flair / HuggingFace Transformers 内置的 CRF 层)
  • pystruct(Python):通用结构化预测库,支持 CRF、SSVM 等多种结构化模型

如果你已经理解了 HMM 的前向-后向-Viterbi 三件套,CRF 的这三件套在数学上是完全对偶的——只需要把 HMM 中的”概率乘法”换成 CRF 中的”得分加法(再取指数)”,把”局部归一化”换成”全局归一化”,其余 DP 结构完全一致。如果你对 HMM 的三个算法有扎实的理解,掌握 CRF 只需要一个下午。如果你觉得 CRF 很难,回到 HMM 中重新巩固前向-后向-Viterbi——这一步走通后再回来看 CRF,一切都会变得清晰。

CRF 是整个【统计学习方法死磕系列】的最后一站。从 SVM 的几何直觉到 HMM/CRF 的序列概率建模,从逻辑回归的 GLM 框架到 Boosting 的函数空间梯度下降,这个系列试图穿起统计学习中最核心的概念网络。如果读者能将这些模型的推导串起来——看到逻辑回归是最大熵的特例、HMM 是 CRF 的生成式版本、GBDT 在函数空间中的梯度下降等价于 AdaBoost 在指数损失下的前向分步——那么统计学习就不再是一堆孤立的算法,而是一个由优化理论和概率建模编织成的统一体系。这正是”死磕”的意义所在:理解每个模型在整个知识网络中的位置,比记住每个模型的公式重要得多。

这是【统计学习方法死磕系列】的终章。六篇文章,从 SVM 的最大间隔到 CRF 的全局归一化,从对数几率的 sigmoid 到函数空间的梯度提升,覆盖了统计学习中八个核心模型。每一篇都试图从第一性原理出发,补全教材中省略的推导步骤,打通概念之间的深层联系。希望这份笔记对你的学习和工作有帮助。

感谢阅读。 如果你觉得这个系列对你有启发,欢迎分享给同样在死磕统计学习的朋友。

统计学习的深度不在于公式的复杂,而在于在每个推导步骤中问”为什么这是对的”——这正是”死磕”的精神。
本系列到此完结。六篇文章、超过 6300 行笔记,献给所有在统计学习路上一起死磕的读者。
学无止境,死磕不止。

文章作者: Leo·Cheung
文章链接: http://tufusi.com/2022/06/20/%E3%80%90%E7%BB%9F%E8%AE%A1%E5%AD%A6%E4%B9%A0%E6%96%B9%E6%B3%95%E6%AD%BB%E7%A3%95%E7%B3%BB%E5%88%97%E3%80%91%E6%9D%A1%E4%BB%B6%E9%9A%8F%E6%9C%BA%E5%9C%BA/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ONE·PIECE
打赏
  • 微信
  • 支付宝

评论