paddle 图标注_概率图(3):序列模型HMM和CRF

HMM

HMM的表示

隐马模型的概率图如下(出自PRML图13.5)。

代表的是满足马尔科夫链的隐变量序列,也就是每个时刻的状态只跟前一个时刻有关,而
代表的是观测变量序列,受到隐状态的影响。

35514aa976ab46218c6dc98a0168a714.png

因此,由上述的概率图,可以写出对应的联合概率分布。假设状态序列有N个观测值(当然,因为是序列数据,以T为变量的写法会更常见,不过为了统一,HMM这块都参考PRML里面的notation来解释),则:

92207c441a57d79ac8166f6c5af8802a.png

其中,马尔科夫链的相关参数称为转移矩阵(transition matrix)A,即

,其中第一个值因为没有前置,所以需要一个单独的参数
,即
;而观测值的概率分布称为发射矩阵(emission matrix)B,当然说这个是矩阵,其实隐含了一个前提设定,即
是离散分布,所以可以用矩阵表示。在实际使用时,为了兼顾连续分布的情况,一般不会以
这种通常的矩阵方式来描述,而是用
表示,代表将观测值
代入
对应的概率密度函数中得到的结果。

综上,整个HMM的参数可以表示成

HMM的训练

虽然HMM中有隐状态,但是做参数估计的时候,如果有必要且成本可以接受的话,是可以给观测序列标记对应的隐状态的。比如基于HMM做中文分词或词性标注,可以在中文分词训练数据中标明每个字的位置状态(即BEMS-词首/词尾/词中/单字),在词性标注训练数据中明确指出每个词的词性。这种情况下,训练就变成了一个有监督的过程。那么这个训练过程就可以简单的用极大似然估计求解,直接得到解析解(跟朴素贝叶斯求解时的情况类似,似然函数是连乘项,取log后是各参数独立的加和项,非常容易求)。

但是还有一些情况,隐状态确实是无法标注的。比如在语音识别中,会利用HMM构建声学模型,观测值是声音信号分帧之后经过特征抽取形成的特征向量,隐状态代表了音素状态。比如最简单的单音素三状态表示,分别是起始状态(与前一音素可能存在关联),中间状态(稳定),结尾状态(与后一音素可能存在关联)。音素状态又可以对应到音素,最终通过词典对应到词。这里的因素状态就是无法人为识别的。因此这个时候就需要利用无监督学习,那么含有隐变量的模型自然用到的是EM算法。用EM算法求解HMM是一个特定的算法,即Baum-Welch算法。由于我个人工作内容与语音无关,用到无监督训练的场景几乎没有,所以也不仔细了解这个推导的细节了。

不过在无监督训练中有一个步骤,需要计算给定(当前的)模型参数时某个观测序列出现的概率,这个问题一般也会作为HMM的一个单独问题拿出来讨论,这里简单说下。这个问题如果按照加法公式展开就是:

这样展开成最基本的联合概率分布,根据模型参数一定是能够算的。但是这种计算方法,假设隐状态有k种取值,公式中求和项展开后就有

项,这个计算量过大不能接受。因此,需要用一些方法来减少计算量,也就是前向算法和后向算法。

前向算法定义了一个

函数:

那么整个序列的概率就是:

然后定义起始项:

最后我们通过找到关于

的一个递推关系来减少计算量:

//将
从联合概率中剥离
//加
凑出
需要的部分

//
从联合概率中剥离

后向算法也是通过递推关系,但是递推的方向相反。首先定义一个

函数:

那么整个序列的概率就是:

然后因为是反向操作,所以递推关系首项对应了序列的最后一个位置

。由于
无法写出直接的表达式,可以基于
这个关系得到,当
时,等式左边就等于
项,由此可得:

然后递推关系如下(推导从略,类似上面前向关系一样可以凑出来):

HMM的预测

HMM的预测,也叫做解码,即给定一批观测数据,需要求出最有可能对应的隐状态。

描述一下问题:

也就是说要找到一组隐状态取值,使得整个联合概率分布最大。后面为了表述便捷,把这个联合分布记为

显然,把所有可能的z组合代入是不可行的低效蛮力计算,因此常规操作就是用基于动态规划的Viterbi算法。

Viterbi算法计算的是篱笆网络有向图的最短路径。先把我们的问题映射到最短路径问题中:

f4452039f6bd2f0d2fb4cf26e32a3e3e.png

假设图上的每个节点对应任一时刻z的一个取值,节点之间的边的权重(距离)对应了红字,那么如果从起始点沿着任意一条路径走到末尾,得到的路径之和等价于任意一种z的取值组合代入问题得到的对数概率值,即

(其实不用log,把加法换成乘法也是一样,也就是路径之和改成路径之积即可,只是用求和来讨论的话,理解成本稍低一点点)。

如果要用动态规划求解这个最短路径,那么需要得出递推方程。假设整条最短路径Q已经找到,这个路径会经过某个时刻n的一个节点

,那么在Q中从起点到
的这段路径也必然是起点到
的最短路径,否则可以找到一条更短的路径替换,使得Q变得更短。

因此递推方程也可以得到:

其中

代表起点到
的最短路径,d函数获取两个节点之间的距离,即:

且第一个状态时可以直接求S:

那么最终的最大概率就是:

对应最后一个状态的取值应该是:

最后通过回溯得到每个时刻的取值。这个时候需要定义一个辅助变量

,代表
路径对应的n-1时刻应该取的状态值:

// 去掉了与j无关的部分

假设已经知道第

个时刻是取值应该是
,那么第n个状态的取值应该就是:

CRF

CRF的表示

CRF中文名条件随机场,条件的意思说明直接求条件概率,是个判别模型,即

,随机场则说明这是一个无向图模型。我们一般使用的是线性链的条件随机场,假设序列长度为n,其概率图模型如下图所示(统计学习方法图11.4):

b0a3c3ee8e0433f6e61f8fc2afffe8f0.png

可以看到在图上,

三者形成了一个因子,可以据此定义函数。假设根据每个因子设计K个方法,即:

15aeab29f93da89bcd31ab1ddf94f13e.png

并且第k组方法有统一的权重

,那么就可以写出CRF的表达形式:

650059f86cc9c7d1b4b72c014b607465.png

如果把这里的f和w全部以向量形式表示,那么可以进一步简写为:

bebc5c7771f0c9e86874e6b961473d25.png

CRF一般用在NLP序列标注问题中,对于方法的设计上完全由使用者自主控制。

  • 比如把CRF当做独立模型使用,在CRF++这个工具里面,用户需要自己定义特征函数,称为特征模板,具体的例子可以参考相关的知乎问题。
  • 又比如,通过特定的方法设计,CRF可以做到和HMM等价的含义(也就是对应到转移概率和发射概率两部分)。具体的方法可以参考Edwin Chen的blog,以及李宏毅老师2015年课程里面关于序列标注问题的lecture。

在如今的深度学习时代,CRF主要是通过嫁接在LSTM上面得到了延续。这个时候基本的特征抽取工作其实就交给底层的网络来完成,CRF更多的是实现前后关系的约束,这样一来也不需要手动设计特征模板的过程。比如在基于Bi-LSTM+CRF来做NER的方法里面[1],LSTM层直接输出原始的识别结果分布给CRF,条件概率表示成:

46345a42c4a3fd880c056e8d479dc0d9.png

特征函数前面去掉了标准的w权重设定,并且被整体定义为两部分,一部分用矩阵A表示,代表前后两个位置输出结果的转移概率,第二部分就是LSTM输出的分数P:

5da5fa3942ef103765f320fa52f5bdbf.png

CRF的训练

CRF由于是判别模型,没有隐变量,所以其训练过程比较显然是能通过极大似然估计来计算的。这里继续沿用上面论文中的公式,其对数自然函数可以写成:

7e0adc26db031bad1ab968ec45732242.png

可以看到分母项的logadd部分,需要遍历所有可能的y序列组合,当序列长度和y的取值较多时,这个可能性是非常大的。这种形式如果搁在word2vec这样的问题里面,基本上就要搞负采样之类的替代方法来解决。但是CRF也可以类似HMM那样推导出一个前向后向计算公式,递归的计算某种y序列组合下的函数值,所以是可以直接计算的。在pytorch的tutorial中就是用了相关的方法进行实现,知乎上也有相应的解读。但本篇写作期间,时间实在有限,所以这部分就不展开了。

CRF的预测

虽然CRF可以学到一个判别模型,但是直接输出这个模型的概率分布就不像用在逻辑回归里面那样有必要了。对于序列问题,一般只关心最大值即可:

3b04e2528d369bc16a88d0862a63e0a4.png

对于CRF的预测问题来说,也满足Viterbi算法的适用条件。首先要对F函数进行拆解表示:

e4a0ae308823a7b732a222c0e41b4dab.png

比如对照Bi-LSTM+CRF,可以看出来对应关系:

然后递推公式方面还是类似,而且由于目标函数本来就是求和项,不需要为了方便理解做log变换了。只不过在notation表示上,可以把隐变量z换成目标变量y:

其中d函数的定义就是:

余下的计算过程参考HMM预测部分即可。

参考

  1. ^Neural Architectures for Named Entity Recognition
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值