关于HMM和CRF的文章很多,但是大多数都是一上来就直接讲概率学习问题、预测问题。而没有交代这两个算法适用于解决哪些问题,有什么内在的关系,算法又是依据什么思路想出来的。这篇文章就试图回答这些问题。文章会讲解模型训练的一些计算细节和训练思路,但更多的是想通过理清这些过程,来实现从具象到抽象的理解过程。如果直接上来就讲抽象的认识,记忆和理解都会不够深刻。
在NLP任务中,词性识别是很早期的一个经典任务,HMM就是为了解决这个问题而诞生的,当然它也适用于所有具有隐状态的序列事件,通过观测序列来找出序列中各个事件背后的隐状态。
HMM和CRF都是概率模型和图模型的结合。HMM由贝叶斯模型发展而来,其精华在于能对具有隐状态的事物的变化过程建模,它的局限性在于当利用当前事物的状态来预测隐状态时,假设太多,一是假设事件的观测值只和当前的隐状态有关,二是假设事件的隐状态只和前一个事件隐状态有关。但是事实上并不是这样。比如就文本而言,一个词的生成可能和前面的好几个隐状态都有关系,像介词后面会加名词,那么介词这个隐状态就影响到了文本到底会生成哪一个名词。
下面简单交代一下使用HMM主要需要解决的三大问题。它们分别是训练模型时的参数学习问题,然后运用模型时的概率计算问题和预测状态问题。每个问题中具体参数代表的含义,以及计算过程大家可以参考别的帖子,毕竟这方面已经有很多很好的帖子,重新把已有的东西再说一遍也没有意义。
1.1 模型学习问题
已知观测序列
1.2 模型概率计算问题
给定了模型λ=(A,B,π)和观测序列
为了简单说明,我们假设事件只有2种隐状态A和B,从时刻t到时刻t+1,假设时刻t+1隐状态为
1.3 预测问题
所谓预测问题,就是已知模型和观测序列
在这里我们先来想一下动态规划的精髓,什么情况下能用动态规划。那就是全局最优路径一定包含局部最优路径。这是什么意思呢?依然假设事件有2种隐状态A和B,时刻t的两种隐状态,都可能到达
,即文本序列中,当前时刻的任意隐状态都可以到达下一时刻的任意隐状态,这时候路径是连通的,也就意味着算法可以找到局部最优路径,也就意味着可以用动态规划,而用于预测问题中(inference)的动态规划就是维特比算法!
一个反例是这样:
如果路径如上图所示,第二层的节点和第三层的一部分节点之间没有连通(节点间的转移概率未知),那就无法使用动态规划了。而现在的情况如下图所示,每一层节点之间状态转移的概率都已知。
比如在考虑t+1时刻的状态A时,会计算t时刻的各个状态,在我们例子中是
维特比算法大大改善了算法的时间复杂度,原来的穷举法时间复杂度为O(2^N),N是文本序列的长度,而维特比的时间复杂度为O(N*(m^2)),其中m表示隐状态的数量,之所以是m^2,是因为维比特每次只需要考虑两个观测变量之间的隐变量的转移概率
具体计算过程可以参考以下的链接:
隐马尔科夫模型HMM(四)维特比算法解码隐藏状态序列 - 刘建平Pinard - 博客园www.cnblogs.com2.1 CRF是怎么来的?
我们知道HMM的缺陷在于它假设某个观测结果只受当前隐状态的影响,那么我们能否改变模型,让某个观测结果能受到多个隐状态的影响呢?于是我们尝试将模型变成下面的模型:
这样一来,我们原来的表达式
对于式子中的每一项
也就是MEMM模型,它改变了依赖关系,认为隐状态取决于前一个时刻的隐状态和整个观测序列,那么模型表达式将变成
这样的计算方法会有什么问题呢?我们可以看到隐状态1只有两种转移可能,而隐状态2却有5种转移可能,而各种转移概率之和需要等于1,这使得在计算连乘时,隐状态2天然就没有优势,无法准确的反映出真实的转移概率。这就是所谓的标签偏置问题。所以我们希望用分数,而不是概率来衡量隐状态之间转移的可能性。因此我们将模型改变成
这就是我们的CRF模型!CRF考虑的是节点之间双向联系的紧密程度,而HMM和MEMM考虑的则是单向的依赖关系。
2.2 CRF的参数学习问题和隐状态预测
那么节点间的联系怎么衡量呢,在这里我们使用无向图的对数线性模型(log-linear model)来衡量节点间的联系。具体表达式如下:
当我们不考虑序列时,我们在上图中衡量节点关系的对数线性函数
当我们考虑时序时,由于将无向图中的节点分成了几个子团,在CRF模型中,我们将整个观测序列
再仔细看特征函数
2.2.1 参数学习问题
得到了模型的表达式,我们就需要求解参数,类似于HMM使用EM算法求解参数,只不过CRF是使用求导的方法求转移特征和状态特征的权重。
通过计算可知,要求出对
那么分子怎么求呢?我们求导的是某个子团内部两个隐状态之间的特征权重,因此分子计算只涉及到两个相邻隐状态,这也是下图中从(2)到(3)转换的依据。
而第(3)到第(4)步中两个求和符号
2.2.2 隐状态预测问题
这里和HMM的预测问题类似,都是使用维特比算法来寻找前一个最佳隐状态,通过计算出最大概率来回溯隐状态。
3.1 计算上的区别
在HMM单向依赖关系下,使用的是不同隐状态之间的转移概率,以及发射概率来分别表示观测节点和隐状态之间、隐状态和隐状态之间的依赖程度,所以这是我们要求的参数。而在CRF把整个观测序列当做一个节点,考虑这个节点和两个隐状态以及隐状态之间双向的联系程度,这个联系程度使用一个打分函数来衡量,而这个打分函数则需要用多个维度的特征,所以每个特征的权重w是CRF要求的参数。
3.2 适用场景上的区别
HMM模型是一个有向图,有向图即节点之间有明确关系的图,而CRF是无向图,无向图即节点间并没有明确的关系,只知道相互有关联,并且整个图中的节点根据一些内在的性质能被划分为不同的子团。此外,无向图更有利于优化模型,比如上面的MEMM由于不同的隐状态转移的状态数量会不同,概率需要归一化,造成了计算上的不合理,而使用CRF因为约束更宽泛,可以使用更为一般的函数来表示两个隐状态之间的关系。
讲到这里,我们下次在面对问题做模型选择的时候,就应该考虑这个场景的事件间关系是否明确,比如是否单向依赖,某个事件的出现是否只和前一个事件相关,还是和别的所有事件都相关,整个场景属于无向还是有向图。从而决定使用什么模型来解决问题。
3.3 两个模型之间的联系
HMM其实是CRF的特殊形式,CRF的一般性体现在两点,一是CRF考虑了多个特征值,并且用分数来衡量特征值,而非像HMM使用概率衡量。二是CRF考虑了整个观测序列(子团的构成部分)来决定当前的隐状态,而非像HMM只使用当前的观测状态。
如果CRF模型中的
讲完了HMM和CRF,我们回过头来看一下文章的头图,HMM是生成式模型,CRF是判别式模型,那么这两个模型的定义是什么,又有什么区别呢?我们用HMM和CRF做例子来详细说明
4.1 生成式模型和判别式模型的区别
生成式模型的表达式为
而判别式模型的表达式是
4.2 生成式模型和判别式模型的联系
生成式模型可以表示成