如何用简单易懂的例子解释条件随机场(CRF)模型?它和HMM有什么区别?

做者:Scofield
连接:https://www.zhihu.com/question/35866596/answer/236886066
来源:知乎
著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。

陆陆续续把调研学习工做完成了,虽然历时有点久,如今put上来。评论里的同窗也等不及了时不时催我,因此不敢怠慢啊……html

总结的还算比较体系化,蛮长的,请读者慢慢看,确定有收获的。python

(好痛苦,这么多公式都要在知乎上重输;是在MD上写的,在知乎上没想到格式这么难看……)c++

——20180129git


几率图模型学习笔记:HMM、MEMM、CRF


1、Preface

2、Prerequisite

2.1 几率图 github

2.1.1 概览
2.1.2 有向图 vs. 无向图
2.1.3 马尔科夫假设&马尔科夫性
2.2 判别式模型 vs. 生成式模型
2.3 序列建模算法

3、HMM

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

4、MEMM

4.1 理解MEMM
4.2 模型运行过程app

4.2.1 学习过程
4.2.2 序列标注(解码)过程
4.2.3 序列几率过程
4.3 标注偏置? 框架

5、CRF

5.1 理解CRF
5.2 模型运行过程
5.2.1 学习过程
5.2.2 解码过程
5.2.3 序列几率过程
5.3 CRF++分析
5.4 LSTM+CRF dom

6、总结

Referrence


1、Preface

以前刚接触NLP时作相关的任务,也必然地涉及到了序列处理任务,而后天然要接触到几率图模型。当时在全网搜中文资料,陆续失望地发现居然真的没有讲得清楚的博文,发现基本是把李航老师书里或CRF tutorial等资料的文字论述和公式抄来抄去的。固然,没有说别人讲的是错的,只是以为,要是没有把东西说的让读者看得懂,那也是没意义啊。或者有些吧,就是讲了一大堆的东西,貌似也明白了啥,但仍是不能让我很好的理解CRF这些模型到底是个啥,完了仍是有一头雾水散不开的感受。试想,一堆公式扔过来,没有个感性理解的过渡,怎么可能理解的了。我甚至以为,若是博客让人看不懂,那说明要么本身没理解透要么就是思惟不清晰讲不清楚。因此默想,深水区攻坚仍是要靠本身,而后去作调研作research,因此就写了个这个学习记录。

因此几率图的研究学习思考列入了个人任务清单。不过平时的时间又很是的紧,只能陆陆续续的思考着,因此时间拖得也真是长啊。

这是个学习笔记。相比其余的学习模型,几率图貌似确实是比较难以理解的。这里我基本所有用本身的理解加上本身的语言习惯表达出来,off the official form,表达尽可能接地气。我会尽可能将我全部理解过程当中的每一个关键小细节都详细描述出来,以使对零基础的初学者友好。包括理论的前因后果,抽象具象化,模型的构成,模型的训练过程,会注重类比的学习。

根据现有资料,我是按照几率图模型将HMM,MEMM,CRF放在这里一块儿对比学习。之因此把他们拿在一块儿,是由于他们都用于标注问题。而且之因此放在几率图框架下,是彻底由于本身top-down思惟模式使然。另外,几率图下还有不少的模型,这儿只学习标注模型。

正儿八经的,我对这些个几率图模型有了彻悟,是从我明白了生成式模型与判别式模型的那一刻。一直在思考从几率图模型角度讲他们的区别到底在哪。

另外,篇幅略显长,但我们不要急躁,好好看完这篇具备良好的上下文的笔记,那确定是能理解的,或者就多看几遍。

我的学习习惯就是,要尽量地将一群没有结构的知识点融会贯通,再用一条树状结构的绳将之串起来,结构化,就是说要成体系,这样把绳子头一拎全部的东西都能拿起来。学习嘛,应该要是一个熵减的过程,卓有成效的学习应该是混乱度愈来愈小!这个思惟方式对我影响仍是蛮大的。

在正式内容以前,仍是先要明确下面这一点,最好脑子里造成一个定势:

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

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

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

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

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

最后提示一下,请务必按照标题层级结构和目录一级一级阅读,防止跟丢。

 

2、Prerequisite

2.1 几率图

以前刚接触CRF时,一上来试图越过一堆繁琐的几率图相关概念,不过sad to say, 这是后面的前驱知识,后面还得反过来补这个点。因此若想总体把握,系统地拿下这一块,应该仍是要越过这块门槛的。

固然了,一开始只需略略快速看一篇,后面可再返过来补查。

2.1.1 概览

在统计几率图(probability graph models)中,参考宗成庆老师的书,是这样的体系结构(我的很是喜欢这种类型的图):

在几率图模型中,数据(样本)由公式 [公式] 建模表示:

  • [公式] 表示节点,即随机变量(放在此处的,能够是一个token或者一个label),具体地,用 [公式] 为随机变量建模,注意 [公式] 如今是表明了一批随机变量(想象对应一条sequence,包含了不少的token), [公式] 为这些随机变量的分布;
  • [公式] 表示边,即几率依赖关系。具体咋理解,仍是要在后面结合HMM或CRF的graph具体解释。

2.1.2 有向图 vs. 无向图

上图能够看到,贝叶斯网络(信念网络)都是有向的,马尔科夫网络无向。因此,贝叶斯网络适合为有单向依赖的数据建模,马尔科夫网络适合实体之间互相依赖的建模。具体地,他们的核心差别表如今如何求 [公式] ,即怎么表示 [公式] 这个的联合几率。

1. 有向图

对于有向图模型,这么求联合几率: [公式]

举个例子,对于下面的这个有向图的随机变量(注意,这个图我画的仍是比较广义的):

应该这样表示他们的联合几率:

[公式]

应该很好理解吧。

2. 无向图

对于无向图,我看资料通常就指马尔科夫网络(注意,这个图我画的也是比较广义的)。

若是一个graph太大,能够用因子分解将 [公式] 写为若干个联合几率的乘积。咋分解呢,将一个图分为若干个“小团”,注意每一个团必须是“最大团”(就是里面任何两个点连在了一块,具体……算了不解释,有点“最大连通子图”的感受),则有:

 

[公式]

 

, 其中 [公式] ,公式应该不难理解吧,归一化是为了让结果算做几率。

因此像上面的无向图:

[公式]

其中, [公式] 是一个最大团 [公式] 上随机变量们的联合几率,通常取指数函数的:

[公式]

好了,管这个东西叫作势函数。注意 [公式] 是否有看到CRF的影子。

那么几率无向图的联合几率分布能够在因子分解下表示为:

[公式]

注意,这里的理解还蛮重要的,注意递推过程,敲黑板,这是CRF的开端!
这个由Hammersly-Clifford law保证,具体不展开。

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

这个也属于前馈知识。

1. 马尔科夫假设

额应该是齐次马尔科夫假设,这样假设:马尔科夫链 [公式] 里的 [公式] 老是只受 [公式] 一我的的影响。
马尔科夫假设这里至关于就是个2-gram。

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

2. 马尔科夫性

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

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

我以为这个不用展开。

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

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

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

好了,我要用本身的理解来转述二者的区别了below。

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

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

2. B批模型是这么工做的,他们先从训练样本数据中,将全部的数据的分布状况摸透,而后最终肯定一个分布,来做为个人全部的输入数据的分布,而且他是一个联合分布 [公式] (注意 [公式] 包含全部的特征 [公式][公式] 包含全部的label)。而后我来了新的样本数据(inference),好,经过学习来的模型的联合分布 [公式] ,再结合新样本给的 [公式] ,经过条件几率就能出来 [公式]
[公式]

好了,应该说清楚了。

1. 判别式模型

那么A批模型对应了判别式模型。根据上面的两句话的区别,能够知道判别模型的特征了,因此有句话说:判别模型是直接对 [公式]建模,就是说,直接根据X特征来对Y建模训练。

具体地,个人训练过程是肯定构件 [公式] 模型里面“复杂映射关系”中的参数,完了再去inference一批新的sample。

因此判别式模型的特征总结以下:

  1. [公式] 建模
  2. 对全部的样本只构建一个模型,确认整体判别边界
  3. 观测到输入什么特征,就预测最可能的label
  4. 另外,判别式的优势是:对数据量要求没生成式的严格,速度也会快,小数据量下准确率也会好些。

2. 生成式模型

一样,B批模型对应了生成式模型。而且须要注意的是,在模型训练中,我学习到的是X与Y的联合模型 [公式] ,也就是说,我在训练阶段是只对 [公式]建模,我须要肯定维护这个联合几率分布的全部的信息参数。完了以后在inference再对新的sample计算 [公式] ,导出 [公式] ,但这已经不属于建模阶段了。

结合NB过一遍生成式模型的工做流程。学习阶段,建模: [公式] (固然,NB具体流程去隔壁参考),而后 [公式]
另外,LDA也是这样,只是他更过度,须要肯定不少个几率分布,并且建模抽样都蛮复杂的。

因此生成式总结下有以下特色:

  1. [公式] 建模
  2. 这里咱们主要讲分类问题,因此是要对每一个label( [公式] )都须要建模,最终选择最优几率的label为结果,因此没有什么判别边界。(对于序列标注问题,那只须要构件一个model)
  3. 中间生成联合分布,并可生成采样数据。
  4. 生成式模型的优势在于,所包含的信息很是齐全,我称之为“上帝信息”,因此不只能够用来输入label,还能够干其余的事情。生成式模型关注结果是如何产生的。可是生成式模型须要很是充足的数据量以保证采样到了数据原本的面目,因此速度相比之下,慢。

这一点明白后,后面讲到的HMM与CRF的区别也会很是清晰。
最后identity the picture below:

2.3 序列建模

为了号召零门槛理解,如今解释如何为序列问题建模。

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

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

  • 节点之间有关联依赖性/无关联依赖性
  • 序列的节点是随机的/肯定的
  • 序列是线性变化/非线性的
  • ……

对不一样的序列有不一样的问题需求,常见的序列建模方法总结有以下:

  1. 拟合,预测将来节点(或走势分析):

a. 常规序列建模方法:AR、MA、ARMA、ARIMA

b. 回归拟合

c. Neural Networks

2. 判断不一样序列类别,即分类问题:HMM、CRF、General Classifier(ML models、NN models)

3. 不一样时序对应的状态的分析,即序列标注问题:HMM、CRF、RecurrentNNs

在本篇文字中,咱们只关注在2. & 3.类问题下的建模过程和方法。

 

3、HMM

最先接触的是HMM。较早作过一个项目,关于声波手势识别,跟声音识别的机制同样,使用的正是HMM的一套方法。后来又用到了kalman filter,以后作序列标注任务接触到了CRF,因此整个几率图模型仍是接触的方面还蛮多。

3.1 理解HMM

在2.二、2.3中提序列的建模问题时,咱们只是讨论了常规的序列数据,e.g., [公式] ,像2.3的图片那样。像这种序列通常用马尔科夫模型就能够胜任。实际上咱们碰到的更多的使用HMM的场景是每一个节点 [公式] 下还附带着另外一个节点 [公式] ,正所谓隐含马尔科夫模型,那么除了正常的节点,还要将隐含状态节点也得建模进去。正儿八经地,将 [公式] 换成 [公式] ,而且他们的名称变为状态节点、观测节点。状态节点正是个人隐状态。

HMM属于典型的生成式模型。对照2.1的讲解,应该是要从训练数据中学到数据的各类分布,那么有哪些分布呢以及是什么呢?直接正面回答的话,正是HMM的5要素,其中有3个就是整个数据的不一样角度的几率分布:

  • [公式] ,隐藏状态集 [公式] , 个人隐藏节点不能随意取,只能限定取包含在隐藏状态集中的符号。
  • [公式] ,观测集 [公式] , 一样个人观测节点不能随意取,只能限定取包含在观测状态集中的符号。
  • [公式] ,状态转移几率矩阵,这个就是其中一个几率分布。他是个矩阵, [公式] (N为隐藏状态集元素个数),其中 [公式] 即第i个隐状态节点,即所谓的状态转移嘛。
  • [公式] ,观测几率矩阵,这个就是另外一个几率分布。他是个矩阵, [公式] (N为隐藏状态集元素个数,M为观测集元素个数),其中 [公式] 即第i个观测节点, [公式] 即第i个隐状态节点,即所谓的观测几率(发射几率)嘛。
  • [公式] ,在第一个隐状态节点 [公式] ,我得人工单独赋予,我第一个隐状态节点的隐状态是 [公式] 中的每个的几率分别是多少,而后 [公式] 就是其几率分布。

因此图看起来是这样的:

 

看的很清楚,个人模型先去学习要肯定以上5要素,以后在inference阶段的工做流程是:首先,隐状态节点 [公式] 是不能直接观测到的数据节点, [公式] 才是能观测到的节点,而且注意箭头的指向表示了依赖生成条件关系, [公式] 在A的指导下生成下一个隐状态节点 [公式] ,而且 [公式][公式] 的指导下生成依赖于该 [公式] 的观测节点 [公式] , 而且我只能观测到序列 [公式]

好,举例子说明(序列标注问题,POS,标注集BES):

input: "学习出一个模型,而后再预测出一条指定"

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

其中,input里面全部的char构成的字表,造成观测集 [公式] ,由于字序列在inference阶段是我所能看见的;标注集BES构成隐藏状态集 [公式] ,这是我没法直接获取的,也是个人预测任务;至于 [公式] ,这些几率分布信息(上帝信息)都是我在学习过程当中所肯定的参数。

而后通常初次接触的话会疑问:为何要这样?……好吧,就应该是这样啊,根据具备同时带着隐藏状态节点和观测节点的类型的序列,在HMM下就是这样子建模的。

下面来点高层次的理解:

  1. 根据几率图分类,能够看到HMM属于有向图,而且是生成式模型,直接对联合几率分布建模 [公式] (注意,这个公式不在模型运行的任何阶段能体现出来,只是咱们都去这么来表示HMM是个生成式模型,他的联合几率 [公式] 就是这么计算的)。
  2. 而且B中 [公式] ,这意味着o对i有依赖性。
  3. 在A中, [公式] ,也就是说只遵循了一阶马尔科夫假设,1-gram。试想,若是数据的依赖超过1-gram,那确定HMM确定是考虑不进去的。这一点限制了HMM的性能。

3.2 模型运行过程

模型的运行过程(工做流程)对应了HMM的3个问题。

3.2.1 学习训练过程

对照2.1的讲解,HMM学习训练的过程,就是找出数据的分布状况,也就是模型参数的肯定。

主要学习算法按照训练数据除了观测状态序列 [公式] 是否还有隐状态序列 [公式] 分为:

  • 极大似然估计, with 隐状态序列
  • Baum-Welch(前向后向), without 隐状态序列

感受不用作不少的介绍,都是很实实在在的算法,看懂了就能理解。简要提一下。

1. 极大似然估计

通常作NLP的序列标注等任务,在训练阶段确定是有隐状态序列的。因此极大似然估计法是很是经常使用的学习算法,我见过的不少代码里面也是这么计算的。比较简单。

  • step1. 算A

[公式]

  • step2. 算B

[公式]

  • step3. 直接估计 [公式]

好比说,在代码里计算完了就是这样的:

 
 
 

 

2. Baum-Welch(前向后向)

就是一个EM的过程,若是你对EM的工做流程有经验的话,对这个Baum-Welch一看就懂。EM的过程就是初始化一套值,而后迭代计算,根据结果再调整值,再迭代,最后收敛……好吧,这个理解是没有捷径的,去隔壁钻研EM吧。

这里只提一下核心。由于咱们手里没有隐状态序列 [公式] 信息,因此我先必须给初值 [公式] ,初步肯定模型,而后再迭代计算出 [公式] ,中间计算过程会用到给出的观测状态序列 [公式] 。另外,收敛性由EM的XXX定理保证。

3.2.2 序列标注(解码)过程

好了,学习完了HMM的分布参数,也就肯定了一个HMM模型。须要注意的是,这个HMM是对我这一批所有的数据进行训练所获得的参数。

序列标注问题也就是“预测过程”,一般称为解码过程。对应了序列建模问题3.。对于序列标注问题,咱们只须要学习出一个HMM模型便可,后面全部的新的sample我都用这一个HMM去apply。

咱们的目的是,在学习后已知了 [公式] ,如今要求出 [公式] ,进一步

[公式]

再直白点就是,我如今要在给定的观测序列下找出一条隐状态序列,条件是这个隐状态序列的几率是最大的那个。

 

具体地,都是用Viterbi算法解码,是用DP思想减小重复的计算。Viterbi也是满大街的,不过要说的是,Viterbi不是HMM的专属,也不是任何模型的专属,他只是刚好被知足了被HMM用来使用的条件。谁知,如今你们都把Viterbi跟HMM捆绑在一块儿了, shame。

Viterbi计算有向无环图的一条最大路径,应该还好理解。如图:

 

关键是注意,每次工做热点区只涉及到t 与 t-1,这对应了DP的无后效性的条件。若是对某些同窗仍是很难理解,请参考这个答案下@Kiwee的回答吧。

3.2.3 序列几率过程

我经过HMM计算出序列的几率又有什么用?针对这个点我把这个问题详细说一下。

实际上,序列几率过程对应了序列建模问题2.,即序列分类。
在3.2.2第一句话我说,在序列标注问题中,我用一批完整的数据训练出了一支HMM模型便可。好,那在序列分类问题就不是训练一个HMM模型了。我应该这么作(结合语音分类识别例子):

目标:识别声音是A发出的仍是B发出的。
HMM建模过程:
1. 训练:我将全部A说的语音数据做为dataset_A,将全部B说的语音数据做为dataset_B(固然,先要分别对dataset A ,B作预处理encode为元数据节点,造成sequences),而后分别用dataset_A、dataset_B去训练出HMM_A/HMM_B
2. inference:来了一条新的sample(sequence),我不知道是A的仍是B的,没问题,分别用HMM_A/HMM_B计算一遍序列的几率获得 [公式] ,比较二者大小,哪一个几率大说明哪一个更合理,更大几率做为目标类别。

 

因此,本小节的理解重点在于,如何对一条序列计算其总体的几率。即目标是计算出 [公式] 。这个问题前辈们在他们的经典中说的很是好了,好比参考李航老师整理的:

  • 直接计算法(穷举搜索)
  • 前向算法
  • 后向算法

后面两个算法采用了DP思想,减小计算量,即每一次直接引用前一个时刻的计算结果以免重复计算,跟Viterbi同样的技巧。

仍是那句,由于这篇文档不是专门讲算法细节的,因此不详细展开这些。毕竟,全部的科普HMM、CRF的博客貌似都是在扯这些算法,妥妥的街货,就不搬运了。

 

4、MEMM

MEMM,即最大熵马尔科夫模型,这个是在接触了HMM、CRF以后才知道的一个模型。说到MEMM这一节时,得转换思惟了,由于如今这MEMM属于判别式模型。

不过有一点很尴尬,MEMM貌似被使用或者讲解引用的不及HMM、CRF。

4.1 理解MEMM

这里仍是啰嗦强调一下,MEMM正由于是判别模型,因此不废话,我上来就直接为了肯定边界而去建模,好比说序列求几率(分类)问题,我直接考虑找出函数分类边界。这一点跟HMM的思惟方式发生了很大的变化,若是不对这一点有意识,那么很难理解为何MEMM、CRF要这么作。

HMM中,观测节点 [公式] 依赖隐藏状态节点 [公式] ,也就意味着个人观测节点只依赖当前时刻的隐藏状态。但在更多的实际场景下,观测序列是须要不少的特征来刻画的,好比说,我在作NER时,个人标注 [公式] 不只跟当前状态 [公式] 相关,并且还跟先后标注 [公式] 相关,好比字母大小写、词性等等。

为此,提出来的MEMM模型就是可以直接容许“定义特征”,直接学习条件几率,即 [公式] , 整体为:

[公式]

而且, [公式] 这个几率经过最大熵分类器建模(取名MEMM的缘由):

[公式]

重点来了,这是ME的内容,也是理解MEMM的关键: [公式] 这部分是归一化; [公式]特征函数,具体点,这个函数是须要去定义的; [公式] 是特征函数的权重,这是个未知参数,须要从训练阶段学习而得。

好比我能够这么定义特征函数:

[公式]

其中,特征函数 [公式] 个数可任意制定, [公式]

 

因此整体上,MEMM的建模公式这样:

[公式]

 

是的,公式这部分之因此长成这样,是由ME模型决定的。

请务必注意,理解判别模型定义特征两部分含义,这已经涉及到CRF的雏形了。

因此说,他是判别式模型,直接对条件几率建模。 上图:

 

MEMM须要两点注意:

  1. 与HMM的 [公式] 依赖 [公式] 不同,MEMM当前隐藏状态 [公式] 应该是依赖当前时刻的观测节点 [公式] 和上一时刻的隐藏节点 [公式]
  2. 须要注意,之因此图的箭头这么画,是由MEMM的公式决定的,而公式是creator定义出来的。

好了,走一遍完整流程。

step1. 先预约义特征函数 [公式]
step2. 在给定的数据上,训练模型,肯定参数,即肯定了MEMM模型
step3. 用肯定的模型作序列标注问题或者序列求几率问题。

4.2 模型运行过程

MEMM模型的工做流程也包括了学习训练问题、序列标注问题、序列求几率问题。

4.2.1 学习训练过程

一套MEMM由一套参数惟一肯定,一样地,我须要经过训练数据学习这些参数。MEMM模型很天然须要学习里面的特征权重λ。

不过跟HMM不用的是,由于HMM是生成式模型,参数即为各类几率分布元参数,数据量足够能够用最大似然估计。而判别式模型是用函数直接判别,学习边界,MEMM即经过特征函数来界定。但一样,MEMM也有极大似然估计方法、梯度降低、牛顿迭代发、拟牛顿降低、BFGS、L-BFGS等等。各位应该对各类优化方法有所了解的。

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

4.2.2 序列标注过程

仍是跟HMM同样的,用学习好的MEMM模型,在新的sample(观测序列 [公式] )上找出一条几率最大最可能的隐状态序列 [公式]

只是如今的图中的每一个隐状态节点的几率求法有一些差别而已,正确将每一个节点的几率表示清楚,路径求解过程仍是同样,采用viterbi算法。

4.2.3 序列求几率过程

跟HMM举的例子同样的,也是分别去为每一批数据训练构建特定的MEMM,而后根据序列在每一个MEMM模型的不一样得分几率,选择最高分数的模型为wanted类别。

应该能够不用展开,吧……

4.3 标注偏置?

MEMM讨论的最多的是他的labeling bias 问题。

1. 现象

是从街货上烤过来的……

 

用Viterbi算法解码MEMM,状态1倾向于转换到状态2,同时状态2倾向于保留在状态2。 解码过程细节(须要会viterbi算法这个前提):

P(1-> 1-> 1-> 1)= 0.4 x 0.45 x 0.5 = 0.09 ,
P(2->2->2->2)= 0.2 X 0.3 X 0.3 = 0.018,
P(1->2->1->2)= 0.6 X 0.2 X 0.5 = 0.06,
P(1->1->2->2)= 0.4 X 0.55 X 0.3 = 0.066

可是获得的最优的状态转换路径是1->1->1->1,为何呢?由于状态2能够转换的状态比状态1要多,从而使转移几率下降,即MEMM倾向于选择拥有更少转移的状态。

2. 解释缘由

直接看MEMM公式:

[公式]

[公式] 求和的做用在几率中是归一化,可是这里归一化放在了指数内部,管这叫local归一化。 来了,viterbi求解过程,是用dp的状态转移公式(MEMM的没展开,请参考CRF下面的公式),由于是局部归一化,因此MEMM的viterbi的转移公式的第二部分出现了问题,致使dp没法正确的递归到全局的最优。

[公式]

 

5、CRF

我以为一旦有了一个清晰的工做流程,那么循序渐进地,没有什么很难理解的地方,由于总体框架已经成竹在胸了,剩下了也只有添砖加瓦小修小补了。有了上面的过程基础,CRF也是相似的,只是有方法论上的细微区别。

5.1 理解CRF

请看第一张几率图模型构架图,CRF上面是马尔科夫随机场(马尔科夫网络),而条件随机场是在给定的随机变量 [公式] (具体,对应观测序列 [公式] )条件下,随机变量 [公式] (具体,对应隐状态序列 [公式] 的马尔科夫随机场。
广义的CRF的定义是: 知足 [公式] 的马尔科夫随机场叫作条件随机场(CRF)。

不过通常说CRF为序列建模,就专指CRF线性链(linear chain CRF):

 

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

[公式]

而在线性链CRF示意图中,每个( [公式] )对为一个最大团,即在上式中 [公式] 。而且线性链CRF知足 [公式]

因此CRF的建模公式以下:

[公式]

我要敲黑板了,这个公式是很是很是关键的,注意递推过程啊,我是怎么从 [公式] 跳到 [公式] 的。

不过仍是要多啰嗦一句,想要理解CRF,必须判别式模型的概念要深刻你心。正由于是判别模型,因此不废话,我上来就直接为了肯定边界而去建模,由于我创造出来就是为了这个分边界的目的的。好比说序列求几率(分类)问题,我直接考虑找出函数分类边界。因此才为何会有这个公式。因此再看到这个公式也别懵逼了,he was born for discriminating the given data from different classes. 就这样。不过待会还会具体介绍特征函数部分的东西。

 

除了建模总公式,关键的CRF重点概念在MEMM中已强调过:判别式模型特征函数

1. 特征函数

上面给出了CRF的建模公式:

[公式]

  • 下标i表示我当前所在的节点(token)位置。
  • 下标k表示我这是第几个特征函数,而且每一个特征函数都附属一个权重 [公式] ,也就是这么回事,每一个团里面,我将为 [公式] 构造M个特征,每一个特征执行必定的限定做用,而后建模时我再为每一个特征函数加权求和。
  • [公式] 是用来归一化的,为何?想一想LR以及softmax为什么有归一化呢,同样的嘛,造成几率值。
  • 再来个重要的理解。 [公式] 这个表示什么?具体地,表示了在给定的一条观测序列 [公式] 条件下,我用CRF所求出来的隐状态序列 [公式] 的几率,注意,这里的I是一条序列,有多个元素(一组随机变量),而至于观测序列 [公式] ,它能够是一整个训练语料的全部的观测序列;也能够是在inference阶段的一句sample,好比说对于序列标注问题,我对一条sample进行预测,可能能获得 [公式]J条隐状态I,但我确定最终选的是最优几率的那条(by viterbi)。这一点但愿你能理解。

对于CRF,能够为他定义两款特征函数:转移特征&状态特征。 咱们将建模总公式展开:

[公式]

 

其中:

  • [公式] 为i处的转移特征,对应权重 [公式] ,每一个 [公式] 都有J个特征,转移特征针对的是先后token之间的限定。
    • 举个例子:

[公式]

  • sl为i处的状态特征,对应权重μl,每一个tokeni都有L个特征
    • 举个例子:

[公式]

 

不过通常状况下,咱们不把两种特征区别的那么开,合在一块儿:

[公式]

 

知足特征条件就取值为1,不然没贡献,甚至你还可让他打负分,充分惩罚。

再进一步理解的话,咱们须要把特征函数部分抠出来:

[公式]

 

是的,咱们为 [公式] 打分,知足条件的就有所贡献。最后将所得的分数进行log线性表示,求和后归一化,便可获得几率值……完了又扯到了log线性模型。如今稍做解释:

log-linear models take the following form:
[公式]

我以为对LR或者sotfmax熟悉的对这个应该秒懂。而后CRF完美地知足这个形式,因此又能够纳入到了log-linear models之中。

5.2 模型运行过程

模型的工做流程,跟MEMM是同样的:

  • step1. 先预约义特征函数 [公式]
  • step2. 在给定的数据上,训练模型,肯定参数 [公式]
  • step3. 用肯定的模型作序列标注问题或者序列求几率问题

可能仍是没作到100%懂,结合例子说明:

……

5.2.1 学习训练过程

一套CRF由一套参数λ惟一肯定(先定义好各类特征函数)。

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

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

5.2.2 序列标注过程

仍是跟HMM同样的,用学习好的CRF模型,在新的sample(观测序列 [公式] )上找出一条几率最大最可能的隐状态序列 [公式]

只是如今的图中的每一个隐状态节点的几率求法有一些差别而已,正确将每一个节点的几率表示清楚,路径求解过程仍是同样,采用viterbi算法。

啰嗦一下,咱们就定义i处的局部状态为 [公式] ,表示在位置i处的隐状态的各类取值可能为I,而后递推位置i+1处的隐状态,写出来的DP转移公式为:

[公式]

这里没写规范因子 [公式] 是由于不规范化不会影响取最大值后的比较。

具体仍是不展开为好。

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表示标注集元素个数。

好比训练好的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)
727701 U00:(1000–5000A)
2626520 U00:(10a)
2626689 U00:(10b)
……
2842814 U07:layer/thicknesses/Using
2847533 U07:layer/thicknesses/are
2848651 U07:layer/thicknesses/in
331539 U07:layer/to/the
1885871 U07: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. 预测解码

结果是这样的:

Nuclear B TAS
theory ETAS
devoted O
major O
efforts O
……

5.4 LSTM+CRF

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

一、perspectively

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

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

二、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在timestep上把每个hiddenstate的tensor输入给CRF,让LSTM负责在CRF的特征限定下,依照新的loss function,学习出一套新的非线性变换空间。

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

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

这个代码比较早,CRF层中的transition matrix以及score的计算都是python from scratch. 目前tf 1.4早已将crf加入contrib中,4行代码便可实现LSTM拼接CRF的效果。

 

3. CRF in TensorFlow V.S. CRF in discrete toolkit

发现有的同窗仍是对general 实现的CRF工具包代码,与CRF拼接在LSTM网络以后的代码具体实现(如在TensorFlow),理解的稀里糊涂的,因此还得要再次稍做澄清。

在CRF相关的工具包里,CRF的具体实现是采用上述理论提到的为特征打分的方式统计出来的。统计的特征分数做为每一个token对应的tag的类别的分数,输入给CRF解码便可。

而在TensorFlow中,LSTM每一个节点的隐含表征vector:Hi的值做为CRF层对应的每一个节点的统计分数,再计算每一个序列(句子)的总体得分score,做为损失目标,最后inference阶段让viterbi对每一个序列的transition matrix去解码,搜出一条最优路径。

关键区别在于,在LSTM+CRF中,CRF的特征分数直接来源于LSTM传上来的Hi的值;而在general CRF中,分数是统计来的。全部致使有的同窗认为LSTM+CRF中其实并无实际意义的CRF。其实按刚才说的,Hi自己当作特征分数造成transition matrix再让viterbi进行路径搜索,这整个其实就是CRF的意义了。因此LSTM+CRF中的CRF没毛病。

 

 

6、总结

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:
  • CRF不只解决了HMM输出独立性假设的问题,还解决了MEMM的标注偏置问题,MEMM容易陷入局部最优是由于只在局部作归一化,而CRF统计了全局几率,在作归一化时考虑了数据在全局的分布,而不是仅仅在局部归一化,这样就解决了MEMM中的标记偏置的问题。使得序列标注的解码变得最优解。
  • HMM、MEMM属于有向图,因此考虑了x与y的影响,但没讲x当作总体考虑进去(这点问题应该只有HMM)。CRF属于无向图,没有这种依赖性,克服此问题。

 

3. Machine Learning models vs. Sequential models

为了一次将几率图模型理解的深入到位,咱们须要再串一串,更深度与原有的知识体系融合起来。

机器学习模型,按照学习的范式或方法,以及加上本身的理解,给常见的部分的他们整理分了分类(主流上,都喜欢从训练样本的歧义型分,固然也能够从其余角度来):

1、监督:{

1.1 分类算法(线性和非线性):{

    感知机

    KNN

    几率{
        朴素贝叶斯(NB)
        Logistic Regression(LR)
        最大熵MEM(与LR同属于对数线性分类模型)
    }

    支持向量机(SVM)

    决策树(ID三、CART、C4.5)

    assembly learning{
        Boosting{
            Gradient Boosting{
                GBDT
                xgboost(传统GBDT以CART做为基分类器,xgboost还支持线性分类器,这个时候xgboost至关于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题);xgboost是Gradient Boosting的一种高效系统实现,并非一种单一算法。)
            }
            AdaBoost
        }   
        Bagging{
            随机森林
        }
        Stacking
    }

    ……
}

1.2 几率图模型:{
    HMM
    MEMM(最大熵马尔科夫)
    CRF
    ……
}


1.3 回归预测:{
    线性回归
    树回归
    Ridge岭回归
    Lasso回归
    ……
}

……  
}


2、非监督:{
2.1 聚类:{
    1. 基础聚类
        K—mean
        二分k-mean
        K中值聚类
        GMM聚类
    2. 层次聚类
    3. 密度聚类
    4. 谱聚类()
}

2.2 主题模型:{
    pLSA
    LDA隐含狄利克雷分析
}

2.3 关联分析:{
    Apriori算法
    FP-growth算法
}

2.4 降维:{
    PCA算法
    SVD算法
    LDA线性判别分析
    LLE局部线性嵌入
}

2.5 异常检测:
……
}

3、半监督学习

4、迁移学习

 

(注意到,没有把神经网络体系加进来。由于NNs的范式很灵活,不太适用这套分法,largely, off this framework)

Generally speaking,机器学习模型,尤为是有监督学习,通常是为一条sample预测出一个label,做为预测结果。 但与典型常见的机器学习模型不太同样,序列模型(几率图模型)是试图为一条sample里面的每一个基本元数据分别预测出一个label。这一点,每每是beginner伊始难以理解的。

具体的实现手段差别,就是:ML models经过直接预测得出label;Sequential models是给每一个token预测得出label还没完,还得将他们每一个token对应的labels进行组合,具体的话,用viterbi来挑选最好的那个组合。

 

over

 

 

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

 

hope those hlpe!

欢迎留言!

有错误之处请多多指正,谢谢!

 

Referrences:

《统计学习方法》,李航

《统计天然语言处理》,宗成庆

《 An Introduction to Conditional Random Fields for Relational Learning》, Charles Sutton, Andrew McCallum

《Log-Linear Models, MEMMs, and CRFs》,ichael Collins

 

如何用简单易懂的例子解释条件随机场(CRF)模型?它和HMM有什么区别?

【中文分词】最大熵马尔可夫模型MEMM - Treant - 博客园

【中文分词】最大熵马尔可夫模型MEMM - Treant - 博客园

timvieira/crf

shawntan/python-crf

Log-linear Models and Conditional Random Fields

如何轻松愉快地理解条件随机场(CRF)?

条件随机场CRF(三) 模型学习与维特比算法解码

crf++里的特征模板得怎么理解?

CRF++代码分析-码农场

CRF++源码解读 - CSDN博客

CRF++模型格式说明-码农场

标注偏置问题(Label Bias Problem)和HMM、MEMM、CRF模型比较<转>

相关文章
相关标签/搜索