学习笔记:条件随机场(CRF)

到条件随机场(CRF),就不得不提最大熵(ME),可以说这两是最常见的概率无向图模型,并且同时都在NLP很多问题中大显身手,比如,在NLP中最基础的词性标注任务中,就经常使用ME和CRF。由于ME和CRF建模思想不同,也就导致ME和CRF是从不同角度来解决词性标注问题的,ME是将这一问题看作是分类问题的(即,输入当前词的特征,然后由ME模型给出一个类别标签),而CRF则是将其视为序列标注问题(CRF会对整个输出序列进行建模)。就这一问题而言,CRF效果一般会好于ME,但相应的计算量也会大一些。其实在后续内容中,我们还会看到CRF模型的表示和ME的表示在形式上非常相似,但是需要注意的是由于两者建模思想完全不同,所以实质是有很多区别,后续内容会详细介绍。更具体的,ME和CRF的关系可以从下图中看出,

想了解最大熵模型(ME)可以参考我的另一篇博客《最大熵模型及应用简介》

本文主要参考了李航的《统计学习方法》、周志华的《机器学习》和Daphne Koller的《Probabilistic Graphical Models》这三本书。
首先,我们先简单了解一下什么是概率图模型以及什么是概率无向图模型:


  • 概率图模型(来自Wikipedia):在概率论、统计学及机器学习中,概率图模型是用图论方法以表现数个独立随机变量之关系的一种建模法。其图中的任一节点为随机变量,若两节点间无边相接则意味此二变量彼此条件独立。
    两种常见的概率图模型是具有向性边的图及具无向性边的图。 若为具有向性边的图,该图显示了所有随机变量的合成概率函数的因子分区。根据图的有向性,概率图模型可以分成两大类,分别是贝叶斯网络马尔科夫网络。这两类网络均具有因子化和条件独立的性质,但条件独立的类型和将分布因子化的方式有所不同。

  • 概率无向图模型(来自《统计学习方法》):设有联合概率分布$P(Y)$,由无向图$G=(V,E)$表示,在图$G$中,结点表示随机变量,边表示随机变量之间的依赖关系。如果联合概率分布$P(Y)$满足成对、局部或全局马尔科夫性,就称此联合概率分布为概率无向图模型,或马尔科夫随机场(MRF)


有了上面的概念后,我们来看看什么是条件随机场(CRF):如果给定的MRF中每个随机变量下面还有观察值,我们要确定的是给定观察集合下MRF的分布,也就是条件分布,那么这个MRF就称为CRF(Conditional Random Field)。它的条件分布形式完全类似于MRF的分布形式,只不过多了一个观察集合$X=(x_1,x_2,…,x_n)$。
接下来的问题,就是如何参数化这个条件概率分布。根据上述定义,给定观察集合$X$后,输出集合$Y$实质是一个MRF,所以参数化这个条件概率的方法和MRF模型的参数化方法是一样的。然而,由于图中的交互影响是无向的,所以无法使用在给定其他节点时在一个节点上表示分布的标准CPD(注:这是贝叶斯网络的参数化方法),相反,我们需要更加对称的参数化方法。同时,也正是由于这种对称性存在,使得MRF模型的参数化更加困难,也更加难于理解(不像贝叶斯网络那样直观)。
在进一步介绍MRF参数化形式之前,先介绍一种分布——吉布斯分布(Gibbs Distribution)

然后再介绍一个定理:Hammersley-Clifford 定理
Hammersley-Clifford 定理指出:马尔科夫随机场和Gibbs分布是一致的,即概率无向图模型的联合概率分布P(Y)可以表示为如下形式:
$$P(Y)=\frac{1}{Z}\prod_c\Psi_c (Y_c)$$
$$Z=\sum_Y\prod_c\Psi_c (Y_c)$$
其中,$C$是无向图的最大团,$Y_c$是$C$的结点对应的随机变量,$\Psi_c(Y_c)$(势函数)是$C$上定义的严格正函数,乘积是在无向图所有的最大团上进行的。
周志华的《机器学习》一书中给出了Hammersley-Clifford 定理必要性证明(即Gibbs分布是马尔科夫随机场),感兴趣的可以推导一下充分性。
既然MRF可以拆分成多个因子的乘积的形式,那么同样的CRF中的条件概率分布$P(Y|X)$也可以由多个因子相乘来表示。更具体的,我们这里只研究线性链CRF,因为目前序列标注问题主要用的就是线性链CRF。什么是线性链CRF以及线性链CRF和其他模型的关系可以见下图,

根据上述MRF参数化的方法,我们只需要在最大团上定义势函数$\Psi_c(Y_c)$即可。同时由于线性链CRF是线性的,随意最大团实际上就是相邻两个节点,因此,线性链CRF可以表示成如下形式,
$$P(y│x)=\frac{1}{Z(x)} exp(\sum_{i,k}\lambda_kt_k(y_{i-1},y_i,x,i)+\sum_{i,l}\mu_ls_l(y_i,x,i))$$
其中,$Z(x)=\sum_y exp(\sum_{i,k}\lambda_kt_k(y_{i-1},y_i,x,i)+\sum_{i,l}\mu_ls_l(y_i,x,i))$
式子中,$t_k$和$s_l$是特征函数($t_k$是转移特征,$s_l$是状态特征),$λ_k$和$μ_l$是对应的权值。$Z(x)$是规范化因子,求和是在所有可能的输出序列上进行的。需要额外说明一下,这只是线性链CRF的一种形式,相当于我们用$e^{f(x)}$来作为势函数,而$f(x)$用的是特征函数(特征函数同最大熵的特征函数一样,$\in{0,1}$)的线性求和的形式,所以这算是比较simple的模型。事实上,很多CRF的升级版,比如将深度神经网络学到的特征表示替代上述式子中的特征函数(e.g,Ma et al., 2016),由于引入了神经网络,所以这里的$f(x)$不再是线性的了。因而,势函数的形式可以是多样的,但后续讨论中我们只对这种简单的定义形式进行研究。
上述CRF表示形式只是为了方便理解,我们将特征函数拆分成了两部分——转移特征$t_k$和状态特征$s_l$,接下来我们对这一表示形式进行简化。
为了方便起见,首先将转移特征和状态特征及其权重用统一的符号表示,设有$K_1$个转移特征,$K_2$个状态特征,$K=K_1+K_2$,记
$$
f_k(y_(i-1),y_i,x,i)=
\begin{cases}
t_k(y_{i-1},y_i,x,i)&&k=1,2,3,…,K_1\\
s_l(y_i,x,i)&&k=K_1+l;l=1,2,3,…,K_2
\end{cases}
$$
然后,对转移与状态特征在各个位置i求和,记作
$$f_k(y,x)=\sum_(i=1)^nf_k(y_(i-1),y_i,x,i)\quad k=1,2,3,…,K$$
用$w_k$表示特征$f_k(y,x)$的权重,即
$$w_k=
\begin{cases}
\lambda_k&&k=1,2,3,…,K_1\\
\mu_l&&k=K_1+l;l=1,2,3,…,K_2
\end{cases}
$$
于是,条件随机场的计算公式可以表示为
$$\begin{align}&&P(y│x)=\frac{1}{Z(x)}exp⁡(\sum_{k=1}^Kw_kf_k(y,x))\\
&&Z(x)=\sum_yexp⁡(\sum_{k=1}^Kw_kf_k(y,x))\end{align}$$
公式推导这一步,我们会发现一个很神奇的事情,将CRF的表示形式进行简化后,条件概率分布$P(y|x)$和最大熵中的条件概率分布在表示形式上非常相似,几乎就是同一个公式,只是特征函数的不一样以及$Z(x)$的计算不一样。看到这里,或许我们会认为最大熵和CRF很相似,其实是不然的。也许我们会像如果将最大熵模型中的特征函数定义成和CRF的特征函数一致,是不是可以认为最大熵就变成CRF了?事实并不是这样的,以序列标注任务为例,即使最大熵模型的特征函数可以定义成和CRF一样,考虑上一个标注结果$y_{i-1}$,但事实上模型在输出时依旧只关注当前的$y_i$,也就是说CRF通过维特比解码得到一个全局最优解,而最大熵模型仅仅只是使得每个$y_i$最优。所以,CRF和最大熵有着本质的区别,CRF是对整个序列进行建模的而最大熵只是对每个单独的标注样例进行建模的(从$Z(x)$的计算也可以看成,CRF模型中$Z(x)$是对整个序列所有输出情况进行求和,而最大熵仅仅只是对有多少中标注类别进行求和),因而在序列标注任务上CRF会优于最大熵模型,但计算开销也会更大一些。

学习算法(参数估计)


下面,我们来介绍一下CRF模型的学习算法。
这里我们只讨论拟牛顿法(BFGS算法)。
对于条件随机场模型,
$$P_w (y│x)=\frac{1}{(\sum_yexp⁡(\sum_{k=1}^Kw_kf_k(y,x)))}exp⁡(\sum_{k=1}^Kw_kf_k(y,x))$$
需要学习的优化目标函数是
$$
\begin{align}
min_{w\in R^n}f⁡(w) &= -L(w)=-\sum_{x,y}\tilde{P}(x,y)logP_w(y|x)) \\
&=\sum_x\tilde{P}(x)log\sum_yexp⁡(\sum_{k=1}^Kw_kf_k(y,x)-∑_{x,y}\tilde{P}(x,y)\sum_{k=1}^Kw_kf_k (y,x)
\end{align}
$$
其梯度函数是
$$g(w)=\sum_{x,y}\tilde{P}(x)P_w(y│x)f(x,y)-E_\tilde{P}(f)$$


条件随机场模型学习的BFGS算法。
输入:特征函数$f_1,f_2,…,f_n$,经验分布$\tilde{P}(X,Y)$
输出:最优参数值$\hat{w}$;最优模型$P_\hat{w}(y|x)$
(1) 选定初始点$w^{(0)}$,取$B_0$为正定对称矩阵,置$k=0$
(2) 计算$g_k=g(x^{(k)})$。若$g_k=0$,则停止计算;否则转(3)
(3) 由$B_kp_k=-g_k$求出$p_k$
(4) 一维搜索:求$\lambda_k$使得
$$f(x^{(k)}+\lambda_kp_k)=lim_{λ≥0}⁡f(x^{(k)}+\lambda p_k)$$
(5) 置$w^{(k+1)}=w^{(k)}+\lambda_kp_k$
(6) 计算$g_{k+1}=g(x^{(k+1)})$,若$g_{k+1}=0$,则停止计算;否则,按如下公式计算$B_{k+1}$,
$$B_{k+1}=B_k+\frac{y_ky_k^T}{y_k^T\delta_k}-\frac{B_k\delta_k\delta_k^TB_k}{\delta_k^TB_k\delta_k}$$
其中,$$y_k=g_{k+1}-g_k,\delta_k=w^{(k+1)}-w^{(k)}$$
(7) 置$k=k+1$,转(3)

条件随机场的预测算法(维特比算法)


维特比算法是一个典型的动态规划算法,算法主要就是用于寻找最优路径,比较常用于隐马尔可夫模型的解码中。其实维特比算法的思想和dijkstra算法在思想上是差不多的,都是利用之前节点的最优值来更新当前节点,只不过维特比算法所针对的图比较特殊一些(图是有向的,时间戳$t_i$下的所有节点和$t_{i-1}$的节点是全连接的,寻找从$t_0$到$t_n$最优路径),这就使得维特比算法实现起来比较dijkstra算法要简单一些(不需要用到最小堆)。
$$F_i(y_{i-1},y_i,x)=(f_1(y_{i-1},y_i,x,i),f_2(y_{i-1},y_i,x,i),…,f_K(y_{i-1},y_i,x,i))^T$$
输入:模型特征向量$F(y,x)$和权重向量$w$,观察序列$x=(x_1,x_2,…,x_n)$
输出:最优路径$y^*=(y_1^*,y_2^*,…,y_n^*)$
(1) 初始化
$$\delta_1(j)=w\cdot F_1(y_0=start,y_1=j,x),\quad j=1,2,3,…,m$$
(2) 递推,对$i=1,2,…,n$
$$
\begin{align}
\delta_i(l) &= max_{1≤j≤m}\{\delta_{i-1}(j)+w\cdot F_i(y_{i-1}=j,y_i=l,x)\},\quad l=1,2,..,m\\
\Psi_i(l) &= arg max_{1≤j≤m}\{\delta_{i-1}(j)+w\cdot F_i (y_{i-1}=j,y_i=l,x)\},\quad l=1,2,..,m
\end{align}
$$
(3) 终止
$$
\begin{align}
max_y⁡(w\cdot F(y,x)) &=max_{1≤j≤m}\delta_n(j)\\
y_n^* &= arg⁡ max_{1≤j≤m}⁡\delta_n(j)
\end{align}
$$
(4) 返回路径
$$y_i^*=\Psi_{i+1}(y_{i+1}^* ),\quad i=n-1,n-2,…,1$$


PS:想对CRF有更深入研究的可以参考一下这份资料《An Introduction to Conditional Random Fields》