条件随机场(CRF)和隐马尔科夫模型(HMM)最大区别在哪里?CRF的全局最优体现在哪里?

最近在看HMM和CRF的介绍,感觉一直没深入理解二者的区别,除了一个是有向图一个是无向图,一个是生成式模型一个是判别式模型。二者都用了前后向算法和维特…
关注者
947
被浏览
156,868

14 个回答

可以按照这个顺序理解:

1. 简单了解一下概率图模型

2. 简单了解一下朴素贝叶斯分类器和隐马尔可夫模型, 朴素贝叶斯模型扩展到序列问题,就是一个隐马

3. 其实还有个最大熵马尔可夫模型MEMM,就是结合了logistics regression地马尔科夫网络

4. CRF论文其实是拿MEMM来作比较的

5. 隐马尔可夫可以推导出线性链CRF

其他辅助理解的扩展

6. CRF与Logistic Regression

7. 生成式和判别式模型

8. 简单的代码实现




概率图模型

Graphical Models, 用图的形式表示随机变量之间条件依赖关系的概率模型,是概率论与图论的结合。图中的节点表示随机变量,缺少边表示条件独立假设。
G = (V, E). 其中 V: vertex, 顶点/节点, 表示随机变量. E: edge, 边/弧. 如果两个节点不存在边, 则二者条件独立.

image from: Probabilistic Graphical Models Principles and Techniques

从图上可以看到, 贝叶斯网络(Bayesian Networks, BNs)是有向图, 每个节点的条件概率分布表示为P(当前节点 | 父节点).

而马尔可夫网络则是无向图. 无向图形模型是指一整个家族的概率分布,每个概率分布都根据给定的因子集合进行因式分解。一般用random field来指代无向图中定义的特定分布. 数学上表达无向图, 指给定子集 \left\{Y_{a}\right\}_{a=1}^{A} , 对于所有 \mathbf{y}_{a} 和任何因子选项 \mathcal{F}=\left\{\Psi_{a}\right\} , \Psi_{a}\left(\mathbf{y}_{a}\right) \geq 0 , 无向图定义的各个分布可以写成:

p(\mathbf{y})=\frac{1}{Z} \prod_{a=1}^{A} \Psi_{a}\left(\mathbf{y}_{a}\right)\\

Z是正则项用于保证分布 p 和为 1
Z=\sum_{\mathbf{y}} \prod_{a=1}^{A} \Psi_{a}\left(\mathbf{y}_{a}\right)\\

Markov Net 包含了一组具有马尔可夫性质的随机变量. 马尔可夫随机场(Markov Random Fields, MRF)是由参数 λ=(S, π, A) 表示, 其中 S 是状态的集合, π 是初始状态的概率, A 是状态间的转移概率。一阶马尔可夫链就是假设 t 时刻的状态只依赖于前一时刻的状态,与其他时刻的状态和观测无关。这个性质可以用于简化概率链的计算。使用类似性质作为假设的模型还有Bi-gram语言模型等.

从 朴素贝叶斯 到 隐马尔可夫模型

朴素贝叶斯分类器(NBs)假设条件独立性(朴素贝叶斯假设, Hand and Yu, 2001):

p(x_i | y, x_j) = p(x_i | y)\\

在给定目标值 y 时,x的属性值之间相互条件独立。这样, 计算可以简化为

p(y | \overrightarrow{x}) \propto p(y, \overrightarrow{x}) = p(y) \prod_{i=1} p(x_i | y).\\

朴素贝叶斯模型只考虑了单个输出变量y。如果要为一个观察序列 \overrightarrow{x} =(x_1, …, x_n) 预测对应的分类序列\overrightarrow{y} =(y_1, …, y_n) ,一个简单的序列模型可以表示为多个NBs的乘积。此时不考虑序列单个位置之间的相互依赖。

p(\overrightarrow{y}, \overrightarrow{x}) = \prod^n_{i=1} p(y_i) p(x_i | y_i)\\
此时每个观察值 x_i 仅取决于对应序列位置的类变量 y_i 。由于这种独立性假设,从一个步骤到另一个步骤的转换概率不包括在该模型中。然而这种假设在实践中几乎不会符合,这导致这种模型的性能很有限。

因此,比较合理的假设是观测序列在连续相邻位置间的状态存在依赖。要模拟这种依赖关系, 就要引入状态转移概率 p(y_i | y_{i-1}) , 由此引出著名的隐马尔可夫模型 Hidden Markov model, HMM, Rabiner (1989)。

HMM的参数 λ= (Y, X, π, A, B) ,其中 Y 是隐状态(输出变量)的集合, X 是观察值(输入)集合, π 是初始状态的概率, A 是状态转移概率矩阵 p(y_i | y_{i-1})B 是输出观察值概率矩阵 p(x_i | y_{i}) 。在POS任务中, X 就是观察到的句子, Y 就是待推导的标注序列, 因为直接尝试对待求的状态进行参数估计, 所以可以理解为隐含状态的模型.

概括一下HMM设定的假设:
1. 假设每个状态仅依赖于其前一个状态, p(y_t|y_{t−1})
2. 假设每一个观察值 x 仅依赖于当前状态值 y , p(x_t|y_t)

那么状态序列 y 和观察序列 x 的联合概率可以分解为
p(\mathbf{y}, \mathbf{x})=\prod_{t=1}^{\mathrm{T}} p\left(y_{t} | y_{t-1}\right) p\left(x_{t} | y_{t}\right)\\

从朴素贝叶斯, 到HMM有如下转换关系:

Diagram of the relationship between naive Bayes, logistic regression, HMMs, linear-chain CRFs, generative models, and general CRFs. image from: An Introduction to Conditional Random Fields, by Charles Sutton and Andrew McCallum


HMM的缺陷是其基于观察序列中的每个元素都相互条件独立的假设。即在任何时刻观察值仅仅与状态(即要标注的标签)有关。对于简单的数据集,这个假设倒是合理。但大多数现实世界中的真实观察序列是由多个相互作用的特征和观察序列中较长范围内的元素之间的依赖而形成的。而条件随机场(conditional random fiel, CRF)恰恰就弥补了这个缺陷.

从上图可以看到当HMM有了条件分布后,就变成了线性条件随机场 。

隐马尔可夫模型与最大熵马尔可夫模型

最大熵马尔可夫模型(Maximum Entropy Markov Models, MEMM)跟HMM的生成式概率图不同,MEMM对当前状态的判断依赖于前一时间步的状态和当前观察值的状态。

image from McCallum, A. (1909)

所谓"熵"就是信息论中的概念:
> Entropy: the uncertainty of a distribution.

量化Entropy: surprise.
Entropy = expected surprise

Event x ,
Probability p_x ,
"Surprise" log(\frac{1}{p_x}) ,
Entropy:

\begin{aligned} &H(p)=E_{p}\left[\log \frac{1}{p_{x}}\right]\\ &\mathrm{H}(p)=-\sum_{x} p_{x} \log p_{x} \end{aligned}\\


熵最大的分布就是均匀分布,也就是每一个选项都一样,等于什么信息都没给。如果给了额外的信息,如约束,特征之后,熵就可以降低。

“最大熵”是指遵循最大熵原则:
> model all that is known and assume nothing about that which is unknown.

也就说, 如果给定了一组事实,我们最好选择一个符合这些事实的模型,剩余情况则尽可能地一视同仁不做任何区别对待。最佳的模型是符合训练数据衍生的约束条件的模型,同时尽可能少地做假设,也就是少做承诺,也就避免过拟合。

MEMM 把HMM中的转移概率和发射概率替换为一个概率:当前状态s依赖于前一个状态s^{\prime} 和当前观察值o, \mathrm{P}\left(s | s^{\prime}, o\right)

MEMM的训练思路是这样: 对每个状态 s^{\prime} , 将训练数据分为<观察-目标状态>对 <o, s> , 也就是把 \mathrm{P}\left(s | s^{\prime}, o\right) 分成 |S| 个分别训练的exponential model \mathrm{P}_{s^{\prime}}(s | o)=\mathrm{P}\left(s | s^{\prime}, o\right) , 再通过最大化熵来训练exponential models, 换种说法叫logistic regression classifier.

用的约束条件是学习分布中每个特征 a 的期望值与训练数据的观测序列上每个特征的期望值相同. 满足这些约束的最大熵分布(Della Pietra,Della Pietra和Lafferty,1997)是唯一的,与最大似然分布一致,对每一个位置的状态 s^{\prime} , 具有指数形式:
\mathrm{P}_{s^{\prime}}(s | o)=\frac{1}{Z\left(o, s^{\prime}\right)} \exp \left(\sum_{a} \lambda_{a} f_{a}(o, s)\right)\\
其中 \lambda_{a} 是待估计的参数, Z\left(o, s^{\prime}\right) 是归一化因子
Z\left(o, s^{\prime}\right)=\sum_{s \in S} P\left(s | s^{\prime}, o\right)\\
S是状态集.

如果把问题简化为线性的相邻依赖, 那么每一个状态 s_{i} 仅依赖于前一个状态 s_{i-1} . 用Y表达标签序列, 用X表达观察序列, 那么
P\left(y_{1}, y_{2}, \ldots, y_{n} | \boldsymbol{x}\right)=P\left(y_{1} | \boldsymbol{x}\right) P\left(y_{2} | \boldsymbol{x}, y_{1}\right) P\left(y_{3} | \boldsymbol{x}, y_{2}\right) \ldots P\left(y_{n} | \boldsymbol{x}, y_{n-1}\right)\\
其中
P\left(y_{1} | \boldsymbol{x}\right)=\frac{e^{f\left(y_{1} ; \boldsymbol{x}\right)}}{\sum_{y_{1} \in S} e^{f\left(y_{k} ; \boldsymbol{x}\right)}}, \quad P\left(y_{k} | \boldsymbol{x}, y_{k-1}\right)=\frac{e^{g\left(y_{k-1}, y_{k}\right)+f\left(y_{k} ; \boldsymbol{x}\right)}}{\sum_{y_{k} \in S} e^{g\left(y_{k-1}, y_{k}\right)+f\left(y_{k} ; \boldsymbol{x}\right)}}\\

P(\boldsymbol{y} | \boldsymbol{x})=\frac{e^{f\left(y_{1} ; \boldsymbol{x}\right)+g\left(y_{1}, y_{2}\right)+f\left(y_{2} ; \boldsymbol{x}\right)+\cdots+g\left(y_{n-1}, y_{n}\right)+f\left(y_{n} ; \boldsymbol{x}\right)}}{\left(\sum_{y_{1} \in S} e^{f\left(y_{1} ; \boldsymbol{x}\right)}\right)\left(\sum_{y_{2} \in S} e^{g\left(y_{1}, y_{2}\right)+f\left(y_{2} ; \boldsymbol{x}\right)}\right) \cdots\left(\sum_{y_{n} \in S} e^{g\left(y_{n-1}, y_{n}\right)+f\left(y_{n} ; \boldsymbol{x}\right)}\right)}\\
MEMM将整体的概率分布分解为每一个时间步的分布之积,所以算loss只需要把每一步的交叉熵求和。只需要每一步单独执行softmax,所以MEMM是完全可以并行的,速度跟直接逐步Softmax基本一样。

虽然MEMM能克服HMM的很多弱点, 但是MEMM自身也有一个 **label bias** 问题, 就是标签偏差, 离开给定状态的转移仅相互对比,而不是与全局所有其他转移对比。转移分数是分别对每个状态的归一化, 这意味到达一个状态的所有质量必须在可能的后续状态之间分配。观察值可以影响哪个目标状态获得质量,但无法影响多少质量可以被传递。这会导致模型偏向输出选择较少的状态, 比如极端情况下, 在训练集中某个状态 s_a 只发现了有一种可能的转移 s_b , 那么状态 s_a 别无选择,只能将所有质量传递给它的唯一的 transition output s_b


随机场

随机场,可以看成是一组随机变量的集合(这组随机变量对应同一个样本空间)。当给每一个位置按照某种分布随机赋予一个值之后,其全体就叫做随机场。这些随机变量之间可能有依赖关系,一般来说,也只有当这些变量之间有依赖关系的时候,我们将其单独拿出来看成一个随机场才有实际意义。

如果给定的 MRF 中每个随机变量下面还有观察值,我们要确定的是给定观察集合下,这个 MRF 的分布,也就是条件分布,那么这个 MRF 就称为 Conditional random fields (CRF)。它的条件分布形式完全类似于 MRF 的分布形式,只不过多了一个观察集合 X。所以,CRF 本质上是给定了条件 (观察值 observations) 集合的 MRF.

  1. 特征函数的选择:特征函数的选取直接关系模型的性能。
  2. 参数估计:从已经标注好的训练数据集学习条件随机场模型的参数,即各特征函数的权重向量 λ。
  3. 模型推断:在给定条件随机场模型参数 λ 下,预测出最可能的状态序列。

MEMM和CRF

在 CRF 的序列标注问题中,我们要计算的是条件概率

P\left(y_{1}, \ldots, y_{n} \mid \boldsymbol{x}\right), \quad \boldsymbol{x}=\left(x_{1}, \ldots, x_{n}\right)

CRF 和 MEMM 的关键区别在于,MEMM 使用每个状态的指数模型来确定给定当前状态的下一状态的条件概率,而 CRF 则使用一个指数模型来表示整个标签序列的联合概率,这个概率条件依赖于给定的完整观察序列。二者区别仅在于分母(也就是归一化因子)的计算方式不同,CRF 的是全局归一化的,而 MEMM 的是局部归一化的。也就是说 CRF 是一个以观测序列X为全局条件的随机场。存在函数 f (y_1,\dots,y_n;\boldsymbol {x}) ,使得

P(y_1,\dots,y_n|\boldsymbol{x})=\frac{1}{Z(\boldsymbol{x})}\exp\Big(f(y_1,\dots,y_n;\boldsymbol{x})\Big)

可以得到对应得概率是

P(\boldsymbol{y} | \boldsymbol{x})=\frac{e^{f\left(y_{1}, y_{2}, \ldots, y_{n} ; \boldsymbol{x}\right)}}{\sum_{y_{1}, y_{2}, \ldots, y_{n} \in S^n} e^{f\left(y_{1}, y_{2}, \ldots, y_{n} ; \boldsymbol{x}\right)}}

CRF 的计算困难之处在于上式的分母项包含了所有可能路径 S^n 的求和,搜索空间非常庞大. 因此做出一些简化,假设输出之间的关联仅发生在相邻位置,并且关联是指数加性的, 也就是加入了马尔可夫假设:

\begin{aligned}f(y_1,\dots,y_n;\boldsymbol{x})=&h(y_1;\boldsymbol{x})+g(y_1,y_2;\boldsymbol{x})+h(y_2;\boldsymbol{x})+g(y_2,y_3;\boldsymbol{x})+h(y_3;\boldsymbol{x})\\ &+\dots+g(y_{n-1},y_n;\boldsymbol{x})+h(y_n;\boldsymbol{x})\end{aligned}\tag{1}

只需要对每一个标签和每一个相邻标签对分别打分,然后将所有打分结果求和得到总分。


Linear Chain CRF

尽管 CRF 已经做了一些简化假设,但一般来说,(1) 式所表示的概率模型还是过于复杂,难以求解。于是考虑到当前深度学习模型中,RNN 或者层叠 CNN 等模型已经能够比较充分捕捉各个y与输入x的联系,因此考虑函数g跟x无关,那么

\begin{aligned} f\left(y_{1}, y_{2}, \ldots, y_{n} ; \boldsymbol{x}\right) &=h\left(y_{1} ; \boldsymbol{x}\right)+g\left(y_{1}, y_{2}\right)+\cdots+g\left(y_{n-1}, y_{n}\right)+h\left(y_{n} ; \boldsymbol{x}\right) \\ &=h\left(y_{1} ; \boldsymbol{x}\right)+\sum_{k=2}^{n}\left(g\left(y_{k-1}, y_{k}\right)+h\left(y_{k} ; \boldsymbol{x}\right)\right) \end{aligned}

其中 g\left (y_{k-1}, y_{k}\right) 是一个有限的、待训练的转移参数矩阵,而单标签的打分函数 h (y_i;\boldsymbol {x}) 我们可以通过 RNN 或者 CNN 来建模。因此,该模型是可以建立的,其中概率分布变为

P(y_1,\dots,y_n|\boldsymbol{x})=\frac{1}{Z(\boldsymbol{x})}\exp\left(h(y_1;\boldsymbol{x})+\sum_{k=1}^{n-1}\Big[g(y_k,y_{k+1})+h(y_{k+1};\boldsymbol{x})\Big]\right)\tag{2}

其中 g\left(y_{k-1}, y_{k}\right) 是转移矩阵

可以得到对应得概率是
P(\boldsymbol{y} | \boldsymbol{x})=\frac{e^{f\left(y_{1}, y_{2}, \ldots, y_{n} ; \boldsymbol{x}\right)}}{\sum_{y_{1}, y_{2}, \ldots, y_{n} \in S^n} e^{f\left(y_{1}, y_{2}, \ldots, y_{n} ; \boldsymbol{x}\right)}}\\

直接引用 (Sutton, C. 2010) 的定义:

An Introduction to Conditional Random Fields, by Charles Sutton and Andrew McCallum


Linear-Chain CRF 特征函数的定义非常灵活,不同的形式用于不同的功能。比如对于 HMM 而言,不管输入怎么变,状态转换transition(i,j)的分值是一样的 \log p (y_t = j | y_{t−1} = i) ; 那么此时在 CRF 中,我们通过增加这样一个特征 1_{\{y_{t}=j\}} 1_{\{y_{t-1}=1\}} 1_{\{x_{t}=o\}} 使transition(i,j)分值依赖于当前的观察序列:

这种特征常常用于文本处理中,比如:

  1. 一个句子提供观察值 x_{i-1, i}
  2. 单词的标签 y_{i-1, i}

需要指出的是在线性链 CRF 的定义中每个 feature 的依赖值并不仅限于当前和上一时间步的观察值。事实上,因为 CRF 并不表达变量之间的依赖关系,我们可以让因子 \Psi_{t} 依赖于整个观察向量x并保持线性图结构,这时候的特征函数就是 f_{k}\left (y_{t}, y_{t-1}, \mathbf {x}\right) , 可以自由检视所有输入变量x,

这个特性可以拓展到所有 CRFs 而不仅限于线性链 CRF.

CRF 既具有判别式模型的优点,又考虑到长距离上下文标记间的转移概率,以序列化形式进行全局参数优化和解码的特点,解决了其他判别式模型 (如 MEMM) 难以避免的标记偏见问题。


隐马尔可夫模型 和 Linear-Chain CRF的联系

HMM 的生成式概率模型是p(y,x), 它的条件概率p(y|x)本质上就是选取了特定特征函数的 CRF. HMM和CRF的对应关系类似于Naive-Bayes和Logistics regression, 都是生成式和判别式的对比. HMM则采用生成式方法进行标签生成, CRF将各种特征组合在一起判断标签. HMM可以推演出特定形式的CRF. 把上式的HMM改写成如下形式:

\begin{aligned} p(\mathbf{y}, \mathbf{x})=& \frac{1}{Z} \prod_{t=1}^{T} \exp \left\{\sum_{i, j \in S} \theta_{i j} \mathbf{1}_{\left\{y_{t}=i\right\}} \mathbf{1}_{\left\{y_{t-1}=j\right\}}\right. \\\ &\left.+\sum_{i \in S} \sum_{o \in O} \mu_{o i} \mathbf{1}_{\left\{y_{t}=i\right\}} \mathbf{1}_{\left\{x_{t}=o\right\}}\right\} \end{aligned}\\


HMM是生成式的, 借鉴Naive Bayes 到 logistics regression的方式, 通过引入特征函数这个概念, f_{k}\left(y_{t}, y_{t-1}, x_{t}\right) , 对于每一个 (i, j) 跳转, 加入特征函数 f_{i j}\left(y, y^{\prime}, x\right)=\mathbf{1}_{\{y=i\}} \mathbf{1}_{\left\{y^{\prime}=j\right\}} , 对于每一个(状态-观察值)对 (i,o) , 加入特征函数 f_{i o}\left(y, y^{\prime}, x\right)=1_{\{y=i\}} \mathbf{1}_{\{x=o\}} . 以上特征函数统一表示为 f_k , 那么可以进一步把HMM写成:

p(\mathbf{y}, \mathbf{x})=\frac{1}{Z} \prod_{t=1}^{T} \exp \left\{\sum_{k=1}^{K} \theta_{k} f_{k}\left(y_{t}, y_{t-1}, x_{t}\right)\right\}\\

可以得出条件概率 p(y|x)

p(\mathbf{y} | \mathbf{x})=\frac{p(\mathbf{y}, \mathbf{x})}{\sum_{\mathbf{y}^{\prime}} p\left(\mathbf{y}^{\prime}, \mathbf{x}\right)}=\frac{\prod_{t=1}^{T} \exp \left\{\sum_{k=1}^{K} \theta_{k} f_{k}\left(y_{t}, y_{t-1}, x_{t}\right)\right\}}{\sum_{\mathbf{y}^{\prime}} \prod_{t=1}^{T} \exp \left\{\sum_{k=1}^{K} \theta_{k} f_{k}\left(y_{t}^{\prime}, y_{t-1}^{\prime}, x_{t}\right)\right\}}\\

所以当联合概率 p(y,x) 以HMM的形式因式分解, 则关联的条件分布 p(y|x) 就是一种特定形式的 Linear-chain CRF.

Graphical model of the HMM-like linear-chain CRF. by Sutton, C. 2010

CRF与Logistic Regression

CRF的概率计算与Logistic Regression (LR)的形式类似,
CRF: p(l | s)=\frac{\exp \left(\sum_{j=1}^{m} \sum_{i=1}^{n} \lambda_{j} f_{j}\left(s, i, l_{i}, l_{i-1}\right)\right)}{\sum_{l^{\prime}} \exp \left(\sum_{j=1}^{m} \sum_{i=1}^{n} \lambda_{j} f_{j}\left(s, i, l_{i}^{\prime}, l_{i-1}^{\prime}\right)\right)}\\

LR: P(y|x) = \frac{\exp \bigg( \sum\limits_{i=1}^{N} w_{i} \cdot f_{i}(x,y) \bigg)} {\sum\limits_{y' \in Y} \exp \bigg( \sum\limits_{i=1}^{N} w_{i} \cdot f_{i}(x,y') \bigg)}\\
在LR中, f_i(y, x) 是一个特征, w_i 是与该特征相关的权重。提取的特征是二元特征,取值0或1,通常称为指示函数(indicator func)。这些特征中的每一个都由与输入x和分类y相关联的函数计算。

实际上,CRF基本上就是逻辑回归的序列化:与逻辑回归是用于分类的对数线性模型不同,CRF是标签序列的对数线性模型。


谈谈生成式模型和判别式模型

Diagram of the relationship between naive Bayes, logistic regression, HMMs, linear-chain CRFs, generative models, and general CRFs. image from: An Introduction to Conditional Random Fields, by Charles Sutton and Andrew McCallum

再祭上这张图, 第一排都是生成式的, 第二排都是判别式的.

在朴素贝叶斯与Logistic Regression, 以及HMM和CRF之间, 又有生成式和判别式的区别.

  • 生成式模型描述标签向量y如何有概率地生成特征向量x, 即尝试构建x和y的联合分布 p(y,x) , 典型的模型有HMM,贝叶斯模型,MRF。生成式模型
  • 而判别模型直接描述如何根据特征向量x判断其标签y, 即尝试构建 p(y|x) 的条件概率分布, 典型模型如如LR, SVM,CRF,MEMM等.

原则上,任何类型的模型都可以使用贝叶斯规则转换为另一种类型,但实际上这些方法是不同的. 生成模型和判别模型都描述了 p(y,x) 的概率分布,但努力的方向不同。生成模型,例如朴素贝叶斯分类器和HMM,是一类可以因式分解为 p(y,x)=p(y)p(x|y) 的联合分布, 也就是说,它们描述了如何为给定标签的特征采样或“生成”值。生成式模型从统计的角度表示数据的分布情况,能够反映同类数据本身的相似度,不关心判别边界。生成式模型的优点是:

  • 实际上带的信息要比判别模型丰富, 研究单类问题比判别模型灵活性强
  • 能更充分的利用先验知识
  • 模型可以通过增量学习得到

缺点也很明显:

  • 学习过程比较复杂;
  • 在目标分类问题中准确度不高

而判别式模型, 比如 LR, 是一系列条件分布 p(y|x) . 也就是说,分类规则是直接建模的。原则上,判别模型也可通过为输入提供边际分布 p(x) 来获得联合分布 p(y,x) ,但很少需要这样。条件分布 p(y|x) 不包括 p(x) 的信息,在分类任务中无论如何也用不到。其次,对 p(x) 建模的困难之处在于它通常包含很多建模难度较高的有高度依赖性的特征。判别式模型寻找不同类别之间的最优分类面,反映的是异类数据之间的差异。优点是:

  • 分类边界更灵活,比使用纯概率方法或生产模型得到的更高级。
  • 能清晰的分辨出多类或某一类与其他类之间的差异特征
  • 在聚类、viewpoint changes, partial occlusion and scale variations中的效果较好
  • 适用于较多类别的识别

缺点是:

  • 不能反映训练数据本身的特性。
  • 能力有限,可以分类, 但无法把整个场景描述出来。

用 TensorFlow 实现 Bi-LSTM + CRF

很多序列标注问题, 如命名实体识别, 如果预先使用 Bi-LSTM 解码序列, 经过 Bi-LSTM 解码后的每一步隐含状态, 包含了很多信息, 包括中长距离依赖和语法解析等, 把这些隐含状态作为 CRF 的特征输入 CRF 层来解码, 可以得到一条最大概率的序列标注路径.

比如序列经过某个模块(如CNN, BERT, 或者单纯是Embedding层) 解码后的 output 输入给Bi-LSTM 层lstm_layer , 再把双向LSTM层的每一步隐含层作为特征输入给CRF层. TensorFlow中要使用CRF 需要用到的函数是tf.contrib.crf.crf_log_likelihood 和 tf.contrib.crf.crf_decode :

output_layer = lstm_layer(output, _true_length, is_training)
with tf.variable_scope("loss"):
    output_layer = tf.reshape(output_layer, [-1, hidden_size])
    logits = tf.matmul(output_layer, output_weights, transpose_b=True)
    logits = tf.nn.bias_add(logits, output_bias)
    logits = tf.reshape(logits, [-1, FLAGS.max_seq_length, num_labels])

    if FLAGS.use_crf:
      transition_params = tf.get_variable(
          "transition_params",
          shape=[num_labels, num_labels],
          initializer=tf.zeros_initializer())
      log_likelihood, transition_params = tf.contrib.crf.crf_log_likelihood(
          inputs=logits,
          tag_indices=labels,
          transition_params=transition_params,
          sequence_lengths=_true_length)      
      # NOTE CRF decode, decode_tags [batch_size, max_seq_len] 最大概率标注路径
      decode_tags, best_score = tf.contrib.crf.crf_decode(potentials=logits, 
          transition_params=transition_params, 
          # NOTE sequence_length: [batch_size] vector of true sequence lengths.
          sequence_length=_true_length)
      # A [batch_size] Tensor containing the -log_likelihood of each example
      per_example_loss = -log_likelihood
      predictions = decode_tags

CRF++

CRF++利用特征模板来批量自动化生成 CRF 特征, 参考 CRF++模型格式说明-码农场

比如

# Unigram
U00:%x[-2,0]
U01:%x[-1,0]
U02:%x[0,0]
U03:%x[1,0]
U04:%x[2,0]
U05:%x[-2,0]/%x[-1,0]/%x[0,0]
U06:%x[-1,0]/%x[0,0]/%x[1,0]
U07:%x[0,0]/%x[1,0]/%x[2,0]
U08:%x[-1,0]/%x[0,0]
U09:%x[0,0]/%x[1,0]
 
# Bigram
B

T**: %x[#, #]中的T表示模板类型(UB), 两个#分别表示相对的行偏移与列偏移。

Unigram template: 用于生成 unigram features. %x[#, #]生成一个 CRF 中的点(state)函数: f(s, o), 其中s为t时刻的标签(output),ot时刻的上下文.

  • 比如 \text{func1 = if (output == B-TIME and feature == "U02: 今") return 1 else return 0} 是由U02: %x[0, 0]在输入文件的第一行生成的点函数. 大致意思是, 如果第一个输入是'今', 而且其对应的label是'B-TIME', 那么返回1 , 也就是

Bigram template: 用于生成 bigram features, %x[#, #] 生成一个 CRF 中的边(Edge)函数 f(s_{t-1} , \space s_t , \space o) , 与 Unigram 类似, 只是还要考虑到t – 1时刻的标签,

  • 模板B默认生成 bigram 特征 f(s_{t-1} , \space s_t , )


参考资料

直接来分析定义好了:

隐马尔科夫模型中对观测序列x与隐状态序列y的联合概率建模,描述的是一种从隐变量产生观测的产生式过程。整个联合概率P(x,y)定义为每个局部概率的乘积:

P(\mathbf{x},\mathbf{y})=\prod_i P(y_i|y_{i-1})P(x_i|y_i)

概率在每个局部都会归一化(即P(y_i|y_{i-1},x)=1)。利用特征进行局部概率计算的最大熵马尔科夫模型(MEMM,即把HMM图模型中从y指向x的箭头都反过来)同样有类似的局部归一化性质。这样会带来所谓的标记偏置(label bias)问题(最近太忙,这里留个坑以后慢慢画图解释吧……想了解详情可以先读CRF原始论文[Lafferty et al., ICML 2001]里的相关讨论或者直接网搜)。

而条件随机场直接定义了条件概率P(y|x),概率是定义在整个序列上的:

P(\mathbf{y}|\mathbf{x})=\frac{1}{Z}\exp{(\mathbf{w}^\top\mathbf{F}(\mathbf{x},\mathbf{y}))}(=\frac{1}{Z}\exp{(\sum_i\sum_k\mathbf{w_k}^\top\mathbf{f_k}(\mathbf{x},y_{i-1},y_i))})

相应的图模型表示中没有局部的箭头,统一用无向边表示。这样模型定义的概率对于整个序列进行归一化,即所谓的“全局归一”。直觉上,只看到局部信息的概率估计,一般是不够准确的。只有序列完整的情况下定义概率才有意义。

由于HMM转移概率(P(y_i|y_{i-1}))或者线性链CRF特征定义(f(x,y_{i-1}),y_i)的局部性,二者都可以使用维特比算法来进行解码(即求出我们所关心的argmax_y P(y|x)),也都可以用前向后向算法计算局部边缘概率P(y_i,y_{i-1})。但局部边缘概率的用法完全不一样:HMM在利用大规模无标注数据做训练的EM算法(在HMM中也常称作Baum-Welch)需要计算这些概率,而CRF的梯度对应于经验期望和模型期望(一个指数级求和)的差,计算后者可以简化为求局部边缘概率。

============================= 更新 ===============================

简单填一下原答案留下的标记偏置问题(时间有限图就先不摆了):

以词性标注为例,假设待标记语句为All the students...,其中all在训练语料中主要被标记为PDT(predeterminer)和DT(determiner),而且从出现频次上看一般会有P(DT|all) > P(PDT|all)。根据原始MEMM的概率表达,上面的语句最终被标记为(1) PDT DT NNS ... 还是(2) DT DT NNS ... 的主要差异在于

P(y_0=PDT|y_{-1}=<START>, x_0=All)P(y_1=DT|y_0=PDT, x_1=the) 和

P(y_0=DT|y_{-1}=<START>, x_0=All)P(y_1=DT|y_0=DT, x_1=the) 谁更大。

那么问题来了:训练语料里所有的the都是以定冠词(DT)形式出现,所以P(y_1=DT|y_0=PDT, x_1=the) = P(y_1=DT|y_0=DT, x_1=the) = 1,于是无论x_1是the还是别的词,由于P(DT|all) > P(PDT|all)导致y_0都会被判定为DT。

喜欢图示的可以参阅CRF原始论文或者Hanah Wallach给出的另一个例子(参见dirichlet.net/pdf/walla,2.3.2节)。这些例子揭示的无非是一件事情:低熵(如P(DT|y_{t-1}=任何, x_t=the)=1)的局部状态转移概率分布会导致部分相关状态y概率最大的取值同当前步输入x_t直接没关系了。而原罪就是局部归一。

p.s. 标记偏置是MEMM在理论上存在的问题,但其重要程度可能和具体应用以及模型实现都有关系。02年EMNLP有篇文章(aclweb.org/anthology/W/ )表示,就词性标注这个具体任务而言,影响条件马尔科夫模型(MEMM)标注精度的根源在于模型的独立性假设,而不是标记偏置问题。后者完全可以通过更好的特征设计来避开。