概率图模型学习笔记:HMM,MEMM,CRF

一、写在前面Preface

今天看到了之前收藏吃灰的一篇写的很好的概率图的学习笔记,自己也想总结一下,今天还有很多事情都没有完成,看到了之后就觉得可以花一些时间好好研究一下,总结一些这段时间的研究,因为之前在B站了完整看了sh大佬的视频讲解,对于HMM 还有MEMM,CRF也有一些自己的理解,今天正好趁着这个机会,一鼓做气都写一下,不往这段时间的投入,之后也不知道会不会用起,但希望想起来的时候我可以说,我曾经爱过~

因为接触了NLP相关的东西,不得不学习这些传统的序列模型,面试的时候也有人问我这些模型,但只可惜当时一知半解,就随便讲了一些自己是研究深度学习方面的,LSTM,RNN 之类的过关了,但知不足而后进,正是这个道理,概率图模型在我的理解中,就是使用图的性质,将概率进行结合,HMM,MEMM ,CRF 则是一种模型的假设,一步步递进更好的解决序列标注的问题。

这次借助大佬的文章,将我自己的理解写一下,仅供各位参考学习,如有不足,错误希望大家及时指明。概率图模型的彻悟是关于理解生成式模型和判别式模型的关系。
我一直保持记录博客的习惯,是将自己的理解输出,记录良好的文章,可以使我保持思路清晰,也可以反复看自己理解的程度,在之后新的理解也可以加进来。
学习是一个将没有结构的知识点融会贯通,使用一条绳子将知识点结构化,成为体系之后才可以牢牢的掌握,拿起绳子的一头,所有东西都能拿的起来学习是一个熵减的过程,卓有成效的学习是可以使得混乱度越来越小的!记住这个思维习惯。

统计学习的思维定势

统计机器学习所有的模型(个别instant model和优化算法以及其他的特种工程知识点除外)的工作流程都是如此:
a.训练模型参数,得到模型(由参数唯一确定),
b.预测给定的测试数据。
拿这个流程去挨个学习模型,思路上会非常顺畅。这一点可参见我另一篇文字介绍。

对初学者的关于机器学习的入门学习方式也顺带表达一下(empirical speaking):

a.完整特征工程竞赛
b.野博客理论入门理解
c.再回到代码深入理解模型内部
d.再跨理论,查阅经典理论巨作。这时感性理性都有一定高度,会遇到很多很大的理解上的疑惑,这时3大经典可能就可以发挥到最大作用了。

很多beginer,就比如说学CRF模型,然后一上来就摆一套复杂的公式,什么我就问,这能理解的了吗?这是正确的开启姿势吗?当然了,也要怪那些博主,直接整一大堆核心公式,实际上读者的理解门槛可能就是一个过渡性的细枝末节而已。没有上下文的教育肯定是失败的(这一点我又想吐槽国内绝大部分本科的院校教育模式)。所以说带有完整上下文信息以及过程来龙去脉交代清楚才算到位吧。

而不是一上来就死啃被人推荐的“经典资料”,这一点相信部分同学会理解。好比以前本科零基础学c++ JAVA,上来就看primr TIJ,结果浪费了时间精力一直在门外兜圈。总结方法吸取教训,应该快速上手代码,才是最高效的。经典最好是用来查阅的工具书,我目前是李航周志华和经典的那3本迭代轮询看了好多轮,经常会反复查询某些model或理论的来龙去脉;有时候要查很多相关的东西,看这些书还是难以贯通,然后发现有些人的博客写的会更容易去理解。所以另外,学习资料渠道也要充分才行。

二、预备知识Prerequisite

2.1 概率图

概率图是CRF HMM 的基础,我们需要对概率图有个整体的认知,这样学习的知识才不会是空中阁楼,如果看不懂,可以看过一遍之后在回过头看,就能看明白了,都是这么过来的。

2.1.1 概览

在统计概率图(probability graph models)中,参考宗成庆老师的书,是这样的体系结构(个人非常喜欢这种类型的图):
在这里插入图片描述
在概率图模型中,数据(样本)由公式 G = ( V , E ) G=(V,E) G=(V,E)建模表示:

  • V V V表示节点,即随机变量(放在此处的,可以是一个token或者一个label),具体地,用 Y = ( y 1 , ⋯ , y n ) Y=(y_1,⋯,y_n) Y=(y1,,yn)为随机变量建模,注意 Y Y Y现在是代表了一批随机变量(想象对应一条sequence,包含了很多的token), P ( Y ) P(Y) P(Y)为这些随机变量的分布;
  • E E E表示边,即概率依赖关系。具体咋理解,还是要在后面结合HMM或CRF的graph具体解释。

2.1.2 有向图 vs. 无向图

上图可以看到,贝叶斯网络(信念网络)都是有向的,马尔科夫网络无向。所以,贝叶斯网络适合为有单向依赖的数据建模,马尔科夫网络适合实体之间互相依赖的建模。具体地,他们的核心差异表现在如何求 P = ( Y ) P=(Y) P=(Y),即怎么表示 Y = ( y 1 , ⋯ , y n ) Y=(y_1,⋯,y_n) Y=y1,,yn这个的联合概率。

1. 有向图

对于有向图模型,这么求联合概率:
P ( x 1 , ⋯ , x n ) = ∑ i = 0 P ( x i ∣ π ( x i ) ) P(x_1,⋯,x_n)=\sum_{i=0}{P(x_i|π(x_i))} P(x1,,xn)=i=0P(xiπ(xi))
举个例子,对于下面的这个有向图的随机变量(注意,这个图我画的还是比较广义的):

在这里插入图片描述

应该这样表示他们的联合概率:
P ( x 1 , ⋯ , x n ) = P ( x 1 ) ⋅ P ( x 2 ∣ x 1 ) ⋅ P ( x 3 ∣ x 2 ) ⋅ P ( x 4 ∣ x 2 ) ⋅ P ( x 5 ∣ x 3 , x 4 ) P(x_1,⋯,x_n)=P(x_1)·P(x_2|x_1)·P(x_3|x_2)·P(x_4|x_2)·P(x_5|x_3,x_4) P(x1,,xn)=P(x1)P(x2x1)P(x3x2)P(x4x2)P(x5x3,x4)
应该很好理解吧。

2. 无向图

对于无向图,我看资料一般就指马尔科夫网络(注意,这个图我画的也是比较广义的)。
在这里插入图片描述
如果一个graph太大,可以用因子分解将 P = ( Y ) P=(Y) P=(Y)写为若干个联合概率的乘积。咋分解呢,将一个图分为若干个“小团”,注意每个团必须是“最大团”(就是里面任何两个点连在了一块,具体……算了不解释,就是最大连通子图),则有:

P ( Y ) = 1 Z ( x ) ∏ c ψ c ( Y c ) P(Y)=\frac{1}{Z(x)}\prod_{c}{ψ_c(Y_c)} P(Y)=Z(x)1cψc(Yc)
, 其中 Z ( x ) = ∑ Y ∏ c ψ c ( Y c ) Z(x)=\sum_{Y}\prod_c{ψ_c(Y_c)} Z(x)=Ycψc(Yc),公式应该不难理解吧,归一化是为了让结果算作概率。

所以像上面的无向图:

P ( Y ) = 1 Z ( x ) ( ψ 1 ( X 1 , X 3 , X 4 ) ⋅ ψ 2 ( X 2 , X 3 , X 4 ) ) P(Y)=\frac{1}{Z(x)}(ψ_1(X_1,X_3,X_4)·ψ_2(X_2,X_3,X_4)) P(Y)=Z(x)1(ψ1(X1,X3,X4)ψ2(X2,X3,X4))
其中,$ψ_c(Y_c)ψ_c(Y_c) $是一个最大团C上随机变量们的联合概率,一般取指数函数的:

ψ c ( Y c ) = e − E ( Y c ) = e ∑ k λ k f k ( c , y ∣ c , x ) ψ_c(Y_c)=e^{−E(Y_c)}=e^{∑_kλ_kf_k(c,y|c,x)} ψc(Yc)=eE(Yc)=ekλkfk(c,yc,x)

好了,管这个东西叫做势函数。注意 e ∑ k λ k f k ( c , y ∣ c , x ) e^{∑_kλ_kf_k(c,y|c,x)} ekλkfk(c,yc,x) 是否有看到CRF的影子。

那么概率无向图的联合概率分布可以在因子分解下表示为:
P ( Y ) = 1 Z ( x ) ∏ c ψ c ( Y c ) = 1 Z ( x ) ∏ c e ∑ k λ k f k ( c , y ∣ c , x ) = 1 Z ( x ) e ∑ c ∑ k λ k f k ( y i , y i − 1 , x , i ) P(Y )=\frac{1}{Z(x)} \prod_{c}\psi_{c}(Y_{c} ) = \frac{1}{Z(x)} \prod_{c} e^{\sum_{k}\lambda_{k}f_{k}(c,y|c,x)} = \frac{1}{Z(x)} e^{\sum_{c}\sum_{k}\lambda_{k}f_{k}(y_{i},y_{i-1},x,i)} P(Y)=Z(x)1cψc(Yc)=Z(x)1cekλkfk(c,yc,x)=Z(x)1eckλkfk(yi,yi1,x,i)
注意,这里的理解还蛮重要的,注意递推过程,敲黑板,这是CRF的开端!
这个由Hammersly-Clifford law保证,具体不展开。

2.1.3 马尔科夫假设&马尔科夫性

这个也属于前馈知识。

1. 马尔科夫假设

额应该是齐次马尔科夫假设,这样假设:马尔科夫链 ( x 1 , ⋯ , x n ) (x_1,⋯,x_n) x1,,xn)里的 x i x_i xi总是只受 x i − 1 x_{i−1} xi1一个人的影响。
马尔科夫假设这里相当于就是个1-gram。

马尔科夫过程呢?即,在一个过程中,每个状态的转移只依赖于前n个状态,并且只是个n阶的模型。最简单的马尔科夫过程是一阶的,即只依赖于 前一个状态。

2. 马尔科夫性

马尔科夫性是是保证或者判断概率图是否为概率无向图的条件。

三点内容:a. 成对,b. 局部,c. 全局。

我觉得这个不用展开。

2.2 判别式(generative)模型 vs. 生成式(discriminative)模型

在监督学习下,模型可以分为判别式模型与生成式模型。

重点来了。上面有提到,我理解了HMM、CRF模型的区别是从理解了判别式模型与生成式模型的那刻,并且瞬间对其他的模型有一个恍然大悟。我记得是一年前就开始纠结这两者的区别,但我只能说,栽在了一些烂博客上,大部分都没有自己的insightful理解,也就是一顿官话,也真是难以理解。后来在知乎上一直琢磨别人的答案,然后某日早晨终于豁然开朗,就是这种感觉。

好了,我要用自己的理解来转述两者的区别了below。

先问个问题,根据经验,A批模型(神经网络模型、SVM、perceptron、LR、DT……)与B批模型(NB、LDA……),有啥区别不?(这个问题需要一些模型使用经验)应该是这样的:

  1. A批模型是这么工作的,他们直接将数据的Y(或者label),根据所提供的features,学习,最后画出了一个明显或者比较明显的边界(具体怎么做到的?通过复杂的函数映射,或者决策叠加等等mechanism),这一点线性LR、线性SVM应该很明显吧。

  2. B批模型是这么工作的,他们先从训练样本数据中,将所有的数据的分布情况摸透,然后最终确定一个分布,来作为我的所有的输入数据的分布,并且他是一个联合分布 P ( X , Y ) P(X,Y) P(X,Y)注意X包含所有的特征 x i x_i xi,Y包含所有的label)。然后我来了新的样本数据(inference),好,我通过我学习来的模型的联合分布 P ( X , Y ) P(X,Y) P(X,Y),再结合新样本给的X,通过条件概率就能出来Y:
    P ( Y ∣ X ) = P ( X , Y ) P ( X ) P(Y|X)=\frac{P(X,Y)}{P(X)} P(YX)=P(X)P(X,Y)
    好了,应该说清楚了。

1. 判别式模型

那么A批模型对应了判别式模型。根据上面的两句话的区别,可以知道判别模型的特征了,所以有句话说:判别模型是直接对P(Y|X)P(Y|X)建模,就是说,直接根据X特征来对Y建模训练。

具体地,我的训练过程是确定构件P(Y|X)P(Y|X)模型里面“复杂映射关系”中的参数,完了再去inference一批新的sample。

所以判别式模型的特征总结如下:

对P(Y|X)P(Y|X)建模
对所有的样本只构建一个模型,确认总体判别边界
观测到输入什么特征,就预测最可能的label
另外,判别式的优点是:对数据量要求没生成式的严格,速度也会快,小数据量下准确率也会好些。

2. 生成式模型

同样,B批模型对应了生成式模型。并且需要注意的是,在模型训练中,我学习到的是X与Y的联合模型P(X,Y)P(X,Y),也就是说,我在训练阶段是只对P(X,Y)P(X,Y)建模,我需要确定维护这个联合概率分布的所有的信息参数。完了之后在inference再对新的sample计算P(Y|X)P(Y|X),导出Y ,但这已经不属于建模阶段了。

结合NB过一遍生成式模型的工作流程。学习阶段,建模:P(X,Y)=P(X|Y)P(Y)P(X,Y)=P(X|Y)P(Y)(当然,NB具体流程去隔壁参考),然后P(Y|X)=P(X,Y)P(X)P(Y|X)=P(X,Y)P(X)。
另外,LDA也是这样,只是他更过分,需要确定很多个概率分布,而且建模抽样都蛮复杂的。

所以生成式总结下有如下特点:

对P(X,Y)P(X,Y)建模
这里我们主要讲分类问题,所以是要对每个label(yiyi)都需要建模,最终选择最优概率的label为结果,所以没有什么判别边界。(对于序列标注问题,那只需要构件一个model)
中间生成联合分布,并可生成采样数据。
生成式模型的优点在于,所包含的信息非常齐全,我称之为“上帝信息”,所以不仅可以用来输入label,还可以干其他的事情。生成式模型关注结果是如何产生的。但是生成式模型需要非常充足的数据量以保证采样到了数据本来的面目,所以速度相比之下,慢。
这一点明白后,后面讲到的HMM与CRF的区别也会非常清晰。
最后identity the picture below:
在这里插入图片描述

2.3 序列建模

为了号召零门槛理解,现在解释如何为序列问题建模。
在这里插入图片描述

序列包括时间序列以及general sequence,但两者无异。连续的序列在分析时也会先离散化处理。常见的序列有如:时序数据、本文句子、语音数据、等等。

广义下的序列有这些特点:

节点之间有关联依赖性/无关联依赖性
序列的节点是随机的/确定的
序列是线性变化/非线性的
……
对不同的序列有不同的问题需求,常见的序列建模方法总结有如下:

拟合,预测未来节点(或走势分析):
常规序列建模方法:AR、MA、ARMA、ARIMA
回归拟合
Neural Networks
判断不同序列类别,即分类问题:HMM、CRF、General Classifier(ML models、NN models)
不同时序对应的状态的分析,即序列标注问题:HMM、CRF、RecurrentNNs
在本篇文字中,我们只关注在2. & 3.类问题下的建模过程和方法。

三、HMM
3.1 理解HMM
3.2 模型运行过程
3.2.1 学习过程
3.2.2 序列标注(解码)过程
3.2.3 序列概率过程

四、MEMM
4.1 理解MEMM
4.2 模型运行过程
4.2.1 学习过程
4.2.2 序列标注过程
4.2.3 序列概率过程
4.3 标注偏置?

五、CRF

我觉得一旦有了一个清晰的工作流程,那么按部就班地,没有什么很难理解的地方,因为整体框架已经胸有成竹了,剩下了也只有添砖加瓦小修小补了。有了上面的过程基础,CRF也是类似的,只是有方法论上的细微区别。

5.1 理解CRF

请看第一张概率图模型构架图,CRF上面是马尔科夫随机场(马尔科夫网络),而条件随机场是在给定的随机变量X(具体,对应观测序列 o 1 , ⋯   , o i o_{1}, \cdots, o_{i} o1,,oi)条件下,随机变量Y(具体,对应隐状态序列 i 1 , ⋯   , i i i_{1}, \cdots, i_{i} i1,,ii)的马尔科夫随机场。
广义的CRF的定义是: 满足 P ( Y v ∣ X , Y w , w ≠ v ) = P ( Y v ∣ X , Y w , w ∼ v ) P(Y_{v}|X,Y_{w},w \neq v) = P(Y_{v}|X,Y_{w},w \sim v) P(YvX,Yw,w=v)=P(YvX,Yw,wv)的马尔科夫随机场叫做条件随机场(CRF)。

不过一般说CRF为序列建模,就专指CRF线性链(linear chain CRF):
在这里插入图片描述

在2.1.2中有提到过,概率无向图的联合概率分布可以在因子分解下表示为:

P ( Y ∣ X ) = 1 Z ( x ) ∏ c ψ c ( Y c ∣ X ) = 1 Z ( x ) ∏ c e ∑ k λ k f k ( c , y ∣ c , x ) = 1 Z ( x ) e ∑ c ∑ k λ k f k ( y i , y i − 1 , x , i ) P(Y | X)=\frac{1}{Z(x)} \prod_{c}\psi_{c}(Y_{c}|X ) = \frac{1}{Z(x)} \prod_{c} e^{\sum_{k}\lambda_{k}f_{k}(c,y|c,x)} = \frac{1}{Z(x)} e^{\sum_{c}\sum_{k}\lambda_{k}f_{k}(y_{i},y_{i-1},x,i)} P(YX)=Z(x)1cψc(YcX)=Z(x)1cekλkfk(c,yc,x)=Z(x)1eckλkfk(yi,yi1,x,i)
而在线性链CRF示意图中,每一个( I 1   O i I_1~O_i I1 Oi)对为一个最大团,即在上式中c = i。并且线性链CRF满足 P ( I i ∣ O , I 1 , ⋯   , I n ) = P ( I i ∣ O , I i − 1 , I i + 1 ) P(I_{i}|O,I_{1},\cdots, I_{n}) = P(I_{i}|O,I_{i-1},I_{i+1}) P(IiO,I1,,In)=P(IiO,Ii1,Ii+1)

所以CRF的建模公式如下:

Z ( O ) ∏ i ψ i ( I i ∣ O ) = 1 Z ( O ) ∏ i e ∑ k λ k f k ( O , I i − 1 , I i , i ) = 1 Z ( O ) e ∑ i ∑ k λ k f k ( O , I i − 1 , I i , i ) {Z(O)} \prod_{i}\psi_{i}(I_{i}|O ) = \frac{1}{Z(O)} \prod_{i} e^{\sum_{k}\lambda_{k}f_{k}(O,I_{i-1},I_{i},i)} = \frac{1}{Z(O)} e^{\sum_{i}\sum_{k}\lambda_{k}f_{k}(O,I_{i-1},I_{i},i)} Z(O)iψi(IiO)=Z(O)1iekλkfk(O,Ii1,Ii,i)=Z(O)1eikλkfk(O,Ii1,Ii,i)

我要敲黑板了,这个公式是非常非常关键的,注意递推过程啊,我是怎么从∏∏跳到e∑e∑的。
不过还是要多啰嗦一句,想要理解CRF,必须判别式模型的概念要深入你心。正因为是判别模型,所以不废话,我上来就直接为了确定边界而去建模,因为我创造出来就是为了这个分边界的目的的。比如说序列求概率(分类)问题,我直接考虑找出函数分类边界。所以才为什么会有这个公式。所以再看到这个公式也别懵逼了,he was born for discriminating the given data from different classes. 就这样。不过待会还会具体介绍特征函数部分的东西。
除了建模总公式,关键的CRF重点概念在MEMM中已强调过:判别式模型、特征函数。

  1. 特征函数
    上面给出了CRF的建模公式:

P ( I ∣ O ) = 1 Z ( O ) e ∑ i T ∑ k M λ k f k ( O , I i − 1 , I i , i ) P(I | O)=\frac{1}{Z(O)} e^{\sum_{i}^{T}\sum_{k}^{M}\lambda_{k}f_{k}(O,I_{i-1},I_{i},i)} P(IO)=Z(O)1eiTkMλkfk(O,Ii1,Ii,i)
下标i表示我当前所在的节点(token)位置。
下标k表示我这是第几个特征函数,并且每个特征函数都附属一个权重 λ k λ_k λk,也就是这么回事,每个团里面,我将为 t o k e n i token_i tokeni构造M个特征,每个特征执行一定的限定作用,然后建模时我再为每个特征函数加权求和。
Z ( O ) Z(O) Z(O)是用来归一化的,为什么?想想LR以及softmax为何有归一化呢,一样的嘛,形成概率值。
再来个重要的理解。 P ( I ∣ O ) P(I|O) P(IO)这个表示什么?具体地,表示了在给定的一条观测序列 O = ( o 1 , ⋯ , o i ) O=(o_1,⋯,o_i) O=(o1,,oi)条件下,我用CRF所求出来的隐状态序列 I = ( i 1 , ⋯ , i i ) I=(i1,⋯,ii) I=(i1,,ii)的概率,注意,这里的I是一条序列,有多个元素(一组随机变量),而至于观测序列 O = ( o 1 , ⋯ , o i ) O=(o_1,⋯,o_i) O=(o1,,oi),它可以是一整个训练语料的所有的观测序列;也可以是在inference阶段的一句sample,比如说对于序列标注问题,我对一条sample进行预测,可能能得到Pj(I|O)(j=1,…,J)Pj(I|O)(j=1,…,J)J条隐状态I,但我肯定最终选的是最优概率的那条(by viterbi)。这一点希望你能理解。
对于CRF,可以为他定义两款特征函数:转移特征&状态特征。
我们将建模总公式展开:

P(I|O)=1Z(O)e∑Ti∑Mkλkfk(O,Ii−1,Ii,i)=1Z(O)e[∑Ti∑Jjλjtj(O,Ii−1,Ii,i)+∑Ti∑Llμlsl(O,Ii,i)]
P(I|O)=1Z(O)e∑iT∑kMλkfk(O,Ii−1,Ii,i)=1Z(O)e[∑iT∑jJλjtj(O,Ii−1,Ii,i)+∑iT∑lLμlsl(O,Ii,i)]
其中:

tj 为 i 处 的 转 移 特 征 , 对 应 权 重 t j 为i处的转移特征,对应权重tj itj为i处的转移特征,对应权重\lambda_{j},每个,每个token_{i}KaTeX parse error: Expected '}', got 'EOF' at end of input: …n是‘I’,0other sl为i处的状态特征,对应权重sl 为 i 处 的 状 态 特 征 , 对 应 权 重 μ l , 每 个 , 每 个 t o k e n i 为i处的状态特征,对应权重\mu_{l},每个,每个token_{i} iμl,,tokeni都有L个特征
举个例子:
sl=1(o,i)={10满足特定状态条件,比如当前token的POS是‘V’,other
sl=1(o,i)={1满足特定状态条件,比如当前token的POS是‘V’,0other
不过一般情况下,我们不把两种特征区别的那么开,合在一起:
P(I|O)=1Z(O)e∑Ti∑Mkλkfk(O,Ii−1,Ii,i)
P(I|O)=1Z(O)e∑iT∑kMλkfk(O,Ii−1,Ii,i)
满足特征条件就取值为1,否则没贡献,甚至你还可以让他打负分,充分惩罚。

再进一步理解的话,我们需要把特征函数部分抠出来:
Score=∑iT∑kMλkfk(O,Ii−1,Ii,i)
Score=∑iT∑kMλkfk(O,Ii−1,Ii,i)
是的,我们为tokenitokeni打分,满足条件的就有所贡献。最后将所得的分数进行log线性表示,求和后归一化,即可得到概率值……完了又扯到了log线性模型。现在稍作解释:

log-linear models take the following form:
P(y|x;ω)=exp(ω·ϕ(x,y))∑y′∈Yexp(ω·ϕ(x,y′))
P(y|x;ω)=exp(ω·ϕ(x,y))∑y′∈Yexp(ω·ϕ(x,y′))
我觉得对LR或者sotfmax熟悉的对这个应该秒懂。然后CRF完美地满足这个形式,所以归入到了log-linear models之中。

5.2 模型运行过程
模型的工作流程,跟MEMM是一样的:

step1. 先预定义特征函数fa(o,i)fa(o,i),
step2. 在给定的数据上,训练模型,确定参数λkλk
step3. 用确定的模型做序列标注问题或者序列求概率问题。
可能还是没做到100%懂,结合例子说明:

……
5.2.1 学习训练过程
一套CRF由一套参数λλ唯一确定(先定义好各种特征函数)。

同样,CRF用极大似然估计方法、梯度下降、牛顿迭代、拟牛顿下降、IIS、BFGS、L-BFGS等等。各位应该对各种优化方法有所了解的。其实能用在log-linear models上的求参方法都可以用过来。

嗯,具体详细求解过程貌似问题不大。

5.2.2 序列标注过程
还是跟HMM一样的,用学习好的CRF模型,在新的sample(观测序列o1,⋯,oio1,⋯,oi)上找出一条概率最大最可能的隐状态序列i1,⋯,iii1,⋯,ii。

只是现在的图中的每个隐状态节点的概率求法有一些差异而已,正确将每个节点的概率表示清楚,路径求解过程还是一样,采用viterbi算法。

啰嗦一下,我们就定义i处的局部状态为δi(I)δi(I),表示在位置i处的隐状态的各种取值可能为I,然后递推位置i+1处的隐状态,写出来的DP转移公式为:
δi+1=max1≤j≤m{δi(I)+∑iT∑kMλkfk(O,Ii−1,Ii,i)}
δi+1=max1≤j≤m{δi(I)+∑iT∑kMλkfk(O,Ii−1,Ii,i)}

这里没写规范因子Z(O)Z(O)是因为不规范化不会影响取最大值后的比较。
具体还是不展开为好。

5.2.3 序列求概率过程
跟HMM举的例子一样的,也是分别去为每一批数据训练构建特定的CRF,然后根据序列在每个MEMM模型的不同得分概率,选择最高分数的模型为wanted类别。只是貌似很少看到拿CRF或者MEMM来做分类的,直接用网络模型不就完了不……

应该可以不用展开,吧……

5.3 CRF++分析

本来做task用CRF++跑过baseline,后来在对CRF做调研时,非常想透析CRF++的工作原理,以identify以及verify做的各种假设猜想。当然,也看过其他的CRF实现源码。

所以干脆写到这里来,结合CRF++实例讲解过程。

有一批语料数据,并且已经tokenized好了:

Nuclear
theory
devoted
major
efforts
……

并且我先确定了13个标注元素:

B_MAT
B_PRO
B_TAS
E_MAT
E_PRO
E_TAS
I_MAT
I_PRO
I_TAS
O
S_MAT
S_PRO
S_TAS

1. 定义模板

按道理应该是定义特征函数才对吧?好的,在CRF++下,应该是先定义特征模板,然后用模板自动批量产生大量的特征函数。我之前也蛮confused的,用完CRF++还以为模板就是特征,后面就搞清楚了:每一条模板将在每一个token处生产若干个特征函数。

CRF++的模板(template)有U系列(unigram)、B系列(bigram),不过我至今搞不清楚B系列的作用,因为U模板都可以完成2-gram的作用。

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]
B

所以,U00 - U09 我定义了10个模板。

2. 产生特征函数

是的,会产生大量的特征。
U00 - U04的模板产生的是状态特征函数;U05 - U09的模板产生的是转移特征函数。

在CRF++中,每个特征都会try每个标注label(这里有13个),总共将生成 N ∗ L = i ∗ k ′ ∗ L N∗L=i∗k^′∗L NL=ikL个特征函数以及对应的权重出来。N表示每一套特征函数 N = i ∗ k ′ N=i∗k^′ N=ik,L表示标注集元素个数。

比如训练好的CRF模型的部分特征函数是这样存储的:

22607 B
790309 U00:%
3453892 U00:%)
2717325 U00:&
2128269 U00:’t
2826239 U00:(0.3534
2525055 U00:(0.593–1.118
197093 U00:(1)
2079519 U00:(1)L=14w2−12w−FμνaFaμν
2458547 U00:(1)δn=∫−∞En+1ρ˜(E)dE−n
1766024 U00:(1.0g
2679261 U00:(1.1wt%)
1622517 U00:(100)
727701U00:(1000–5000A)
2626520 U00:(10a)
2626689 U00:(10b)
……
2842814U07:layer/thicknesses/Using
2847533 U07:layer/thicknesses/are
2848651 U07:layer/thicknesses/in
331539 U07:layer/to/the
1885871U07:layer/was/deposited ……(数量非常庞大)

其实也就是对应了这样的一个特征函数:

func1 = if (output = B and feature=”U02:一”) return 1 else return 0
func2 = if (output = M and feature=”U02:一”) return 1 else return 0
func3 = if (output = E and feature=”U02:一”) return 1 else return 0
func4 = if (output = S and feature=”U02:一”) return 1 else return 0

比如模板U06会从语料中one by one逐句抽出这些各个特征:

一/个/人/……
个/人/走/……

3. 求参

对上述的各个特征以及初始权重进行迭代参数学习。

在CRF++ 训练好的模型里,权重是这样的:

0.3972716048310705
0.5078838237171732
0.6715316559507898
-0.4198827647512405
-0.4233310655891150
-0.4176580083832543
-0.4860489836004728
-0.6156475863742051
-0.6997919485753300
0.8309956709647820
0.3749695682658566
0.2627347894057647
0.0169732441379157
0.3972716048310705
0.5078838237171732
0.6715316559507898 ……(数量非常庞大,与每个label的特征函数对应,我这有300W个)

4. 预测解码

这个就看不到viterbi怎么走的了。
结果是这样的:

Nuclear B_TAS
theory E_TAS
devoted O
major O
efforts O ……

5.4 LSTM+CRF

LSTM+CRF这个组合其实我在知乎上答过问题,然后顺便可以整合到这里来。

1、perspectively

大家都知道,LSTM已经可以胜任序列标注问题了,为每个token预测一个label(LSTM后面接:分类器);而CRF也是一样的,为每个token预测一个label。

但是,他们的预测机理是不同的。CRF是全局范围内统计归一化的条件状态转移概率矩阵,再预测出一条指定的sample的每个token的label;LSTM(RNNs,不区分here)是依靠神经网络的超强非线性拟合能力,在训练时将samples通过复杂到让你窒息的高阶高纬度异度空间的非线性变换,学习出一个模型,然后再预测出一条指定的sample的每个token的label。

2、LSTM+CRF

既然LSTM都OK了,为啥researchers搞一个LSTM+CRF的hybrid model?

哈哈,因为a single LSTM预测出来的标注有问题啊!举个segmentation例子(BES; char level),plain LSTM 会搞出这样的结果:

input: “学习出一个模型,然后再预测出一条指定”

expected output: 学/B 习/E 出/S 一/B 个/E 模/B 型/E ,/S 然/B 后/E 再/E 预/B 测/E……

real output: 学/B 习/E 出/S 一/B 个/B 模/B 型/E ,/S 然/B 后/B 再/E 预/B 测/E ……

看到不,用LSTM,整体的预测accuracy是不错indeed, 但是会出现上述的错误:在B之后再来一个B。这个错误在CRF中是不存在的,因为CRF的特征函数的存在就是为了对given序列观察学习各种特征(n-gram,窗口),这些特征就是在限定窗口size下的各种词之间的关系。然后一般都会学到这样的一条规律(特征):B后面接E,不会出现E。这个限定特征会使得CRF的预测结果不出现上述例子的错误。当然了,CRF还能学到更多的限定特征,那越多越好啊!

好了,那就把CRF接到LSTM上面,把LSTM在time_step上把每一个hidden_state的tensor输入给CRF,让LSTM负责在CRF的特征限定下,依照新的loss function,学习出一套新的非线性变换空间。

最后,不用说,结果还真是好多了呢。

LSTM+CRF codes, here. Go just take it.

六、总结

1. 总体对比

应该看到了熟悉的图了,现在看这个图的话,应该可以很清楚地get到他所表达的含义了。这张图的内容正是按照生成式&判别式来区分的,NB在sequence建模下拓展到了HMM;LR在sequence建模下拓展到了CRF。
在这里插入图片描述

2. HMM vs. MEMM vs. CRF

将三者放在一块做一个总结:

  1. HMM -> MEMM:
    HMM模型中存在两个假设:一是输出观察值之间严格独立,二是状态的转移过程中当前状态只与前一状态有关。但实际上序列标注问题不仅和单个词相关,而且和观察序列的长度,单词的上下文,等等相关。MEMM解决了HMM输出独立性假设的问题。因为HMM只限定在了观测与状态之间的依赖,而MEMM引入自定义特征函数,不仅可以表达观测之间的依赖,还可表示当前观测与前后多个状态之间的复杂依赖。
  2. MEMM -> CRF:
    1. CRF不仅解决了HMM输出独立性假设的问题,还解决了MEMM的标注偏置问题,MEMM容易陷入局部最优是因为只在局部做归一化,而CRF统计了全局概率,在做归一化时考虑了数据在全局的分布,而不是仅仅在局部归一化,这样就解决了MEMM中的标记偏置的问题。使得序列标注的解码变得最优解。
    2. HMM、MEMM属于有向图,所以考虑了x与y的影响,但没讲x当做整体考虑进去(这点问题应该只有HMM)。CRF属于无向图,没有这种依赖性,克服此问题。

有了这道开胃菜,接下来,读者可以完成这些事情:完善细节算法、阅读原著相关论文达到彻底理解、理解相关拓展概念、理论创新……

六、总结 Referrence

《统计学习方法》,李航
《统计自然语言处理》,宗成庆
《 An Introduction to Conditional Random Fields for Relational Learning》, Charles Sutton, Andrew McCallum
《Log-Linear Models, MEMMs, and CRFs》,ichael Collins

https://www.zhihu.com/question/35866596
https://www.cnblogs.com/en-heng/p/6201893.html
https://www.cnblogs.com/en-heng/p/6201893.html
https://github.com/timvieira/crf
https://github.com/shawntan/python-crf
http://videolectures.net/cikm08_elkan_llmacrf/
https://www.jianshu.com/p/55755fc649b1
https://www.cnblogs.com/pinard/p/7068574.html
https://www.zhihu.com/question/20279019
http://www.hankcs.com/ml/crf-code-analysis.html
http://blog.csdn.net/aws3217150/article/details/69212445
http://www.hankcs.com/nlp/the-crf-model-format-description.html
https://www.cnblogs.com/syx-1987/p/4077325.html
原文链接:https://blog.csdn.net/Scotfield_msn/article/details/79195517

猜你喜欢

转载自blog.csdn.net/weixin_42462804/article/details/106274886