隐马尔科夫模型HMM和条件随机场CRF公式笔记

本文深入探讨了隐马尔可夫模型(HMM)和条件随机场(CRF)在自然语言处理中的应用,特别是在词性标注任务中的作用。通过实例解释了HMM的马尔可夫链和发射、转换概率,以及CRF的特征向量和权重向量概念。同时,阐述了训练CRF模型以找到最可能的隐含序列,并讨论了在实际训练过程中使用负梯度的技巧。最后,作者分享了在实现CRF模型时遇到的问题及解决方案。
摘要由CSDN通过智能技术生成

 本笔记是根据李宏毅的HMM/CRF课做的,在学习之前已了解过相关的概念,不了解的可以看上一篇文章:隐马尔可夫模型HMM笔记——HMM原理介绍、python hmmlearn库的使用

一、隐马尔可夫模型HMM

在已知HMM的基本概念和两个假设后,这里给一个形象一点的例子。

如下图所示,如果要产生一个句子,根据HMM理论,我们首先给出一个词性的序列作为隐含序列:“PN V D N”,PN表示人名,V表示动词,D表示冠词,N是名词。

 

那么根据已有的隐含序列,可以写出“John saw the saw”这句话,每个词性决定了输出词的词性范围,而每个词性由前一个词性决定。

为了求得在我们需要的词性序列(隐含序列)下,得到“John saw the saw”这句话的概率,从以下三步进行计算:

(1)首先第一步,画出词性之间的马尔可夫链,如下图所示,这是一个有向图。(马尔可夫模型本身就是图模型中的有向图分类下的动态贝叶斯网咯)

从这个马尔可夫链中,我们可以看出每个词性节点出发向下一个节点的权重总和为1。可以求得我们所需的序列“PN V D N”的概率为0.0076。

(2)第二步,给定词性序列后,每个词性可输出的词汇有很多,并且输出每个词有对应的概率,那么在给定序列PN V D N”的情况下,输出“John saw the saw”的概率就是下边公式所示的0.00364。

(3)在知道了词性序列的概率P(y)和固定词性序列得到输出序列概率P(x|y)后,就可以得到能够输出这句话的联合概率P(x,y)。 

我们将这个公式一般化,就可以得到P(y)和P(x|y)的推广公式,其中P(y)又叫转换概率,P(x|y)又叫发射概率。

现在我们知道了输出某一句话的联合概率P(x,y)不过这个能做什么呢?

实际上,通过获得P(x,y)的计算方式,我们就可以应用在序列标注上,通过已知的X输出序列,获得隐含序列y。

得到也就是说,在给定已知的x序列下,获得的概率最大的y就是我们所需要的y序列,公式如下图所示,经过转换,因为分母P(x)的概率是与y独立的,因此就可以最终的序列y计算公式。

在这种方式中,如何得知哪个y才会导致P(y|x)最大,需要穷举所有的y,这就会导致资源消耗非常大。假设我们有s个tag(tag就是词性,用tag表示),序列y的长度为L,那么复杂度就是S^L。

为了解决这个穷举带来的复杂度问题,使用的方法就是维比特算法,这里不做扩展。

 二、条件随机场CRF

CRF算法与HMM的本质原理是基本一样的。P(x,y)=P(x)P(y|x)

联合概率P(x,y)的算法与HMM不同,它正比于一个权重向量和特征向量的乘积。那么为了写成等式的情况,这里可以除以一个定量R。

计算在已知x输出序列下,词性序列(隐含序列)y的概率,等于序列x,y的联合概率P(x,y)除以所有已知y'和x的联合概率,代入P(x,y)的公式,就可以把定量R小区,因分母中,对所有可能的y'求和是与x独立的,因此就可以把分母公式写做Z(x),只体现x变量。

在HMM中,P(x,y)是公式是连乘形式,在CRF中对P(x,y)进行log计算,将连乘变为相加的形式。

经过log计算后,另一步转换是,对logP(x|y)的求和进行一个形式上的改变,变成列举所有可能的tag(即公式标记的s)和词汇(即公式标记的t)进行求和,其中每个可能的tag和word要乘以他们在序列(x,y)中出现的频次。

这个转换可能有些让人迷惑,这里举一个小例子:

现在假设一个词性序列y和输出序列x,我们可以得到所有可能的词性tag和词汇word的组合,以及它们在序列(x,y)中出现的频次N(x,y)。

 因此可以得到所有可能的x,y对概率总和,在下列等式中,可以看到logP(the|D)出现了两次,因此乘以2,而没有出现的tag和word对,就乘以0,不会出现在公式中。

 小例子结束。

把logP(x,y)中的所有项都进行转换后,就可以把他们转变为向量相乘的格式,其中紫色项就是后来的权重向量,而红色项就是特征向量,这就是CRF中P(x,y)公式的转变由来。

特征向量这项包含了两部分,第一部分是tags和words之间的关系(在某tag下,某word在序列数据集中出现的频次),第二部分是tags之间的关系(在某前一tag下,下一个是某tag在序列数据集中出现的频次)

 

 三、CRF的训练

根据已有的序列训练集,想要找到在某x序列下,最有可能的y序列,通过训练w向量,使O(w)最大即可。

这里需要训练得到O(w)最大的原因是,O(w)是训练集中每个给定x下得到已知y的可能性最大。也就是说,对于训练集中的所有已有(x,y),在某一x输出序列中,刚好是训练集中对应的y隐含序列的可能性最大,那么这个优化得到的权重向量w就是训练后最符合训练集数据要求的。

根据CRF中对P(y|x)的定义(最上面提到的),把O(w)展开一下,就变成了两项相减,第一项是训练集中已有的x,y数据对,第二项是对所有的y'与x^n进行求和,而所有的y'都要求和的话,通常这些y'不会出现在训练集中。

 因此,最大化O(w)也就是尽量把第一项最大化,第二项最小化。

因为一般训练一个模型都是用的loss的梯度下降,而CRF方法用的就是梯度上升。所以实际上对于CRF输出的log值结果,也可以把它乘以一个-1,就可以用平常用的梯度下降的方法去训练它。

最后,谈一个我遇到的问题:对于CRF方法我是调用的pytorch-crf包里的CRF层,把它加到了pytorch提供的LSTM层后面,而训练方法就是用的一般的SGD随机梯度优化这些方法,所以在CRF输出结果后需要乘以一个-1,才能用SGD优化,这一步困扰了我很久,为了想要解决它我才开始看HMM和CRF的知识,也因此才有了这篇笔记~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

音无八重

谢谢老板!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值