©PaperWeekly 原创 · 作者|苏剑林

单位|追一科技

研究方向|NLP、神经网络

HMM、MEMM、CRF 被称为是三大经典概率图模型,在深度学习之前的机器学习时代,它们被广泛用于各种序列标注相关的任务中。一个有趣的现象是,到了深度学习时代,HMM 和 MEMM 似乎都“没落”了,舞台上就只留下 CRF。

相信做 NLP 的读者朋友们就算没亲自做过也会听说过 BiLSTM+CRF 做中文分词、命名实体识别等任务,却几乎没有听说过 BiLSTM+HMM、BiLSTM+MEMM 的,这是为什么呢?

今天就让我们来学习一番 MEMM,并且通过与 CRF 的对比,来让我们更深刻地理解概率图模型的思想与设计。

模型推导

从 MEMM 全称 Maximum Entropy Markov Model,中文名可译为“最大熵马尔可夫模型”。不得不说,这个名字可能会吓退 80% 的初学者:最大熵还没搞懂,马尔可夫也不认识,这两个合起来怕不是天书?而事实上,不管是 MEMM 还是 CRF,它们的模型都远比它们的名字来得简单,它们的概念和设计都非常朴素自然,并不难理解。

回顾 CRF

作为对比,我们还是来回顾一下 CRF。说是“回顾”,是因为笔者之前已经撰文介绍过 CRF 了,如果对 CRF 还不是很了解的读者,可以先去阅读旧作简明条件随机场CRF介绍 | 附带纯Keras实现。简单起见,本文介绍的 CRF 和 MEMM 都是最简单的“线性链”版本。

本文都是以序列标注为例,即输入序列 x=(x1,x2,…,xn),希望输出同样长度的标签序列 y=(y1,y2,…,yn),那么建模的就是概率分布:

CRF 把 y 看成一个整体,算一个总得分,计算公式如下:

这个打分函数的特点就是显式地考虑了相邻标签的关联,其实 g(yk−1,yk) 被称为转移矩阵。现在得分算出来了,概率就是得分的 softmax,所以最终概率分布的形式设为:

如果仅局限于概念的话,那么 CRF 的介绍到此就结束了。总的来说,就是将目标序列当成一个整体,先给目标设计一个打分函数,然后对打分函数进行整体的 softmax,这个建模理念跟普通的分类问题是一致的。CRF 的困难之处在于代码实现,因为上式的分母项包含了所有路径的求和,这并不是一件容易的事情,但在概念理解上,笔者相信并没有什么特别困难之处。

更朴素的 MEMM

现在我们来介绍 MEMM,它可以看成一个极度简化的 seq2seq 模型。对于目标 (1) ,它考虑分解:

然后假设标签的依赖只发生在相邻位置,所以:

接着仿照线性链 CRF 的设计,我们可以设:

至此,这就得到了 MEMM 了。由于 MEMM 已经将整体的概率分布分解为逐步的分布之积了,所以算 loss 只需要把每一步的交叉熵求和。

两者的关系

将式 (6) 代回式 (5) ,我们可以得到:

对比式 (7) 和式 (3),我们可以发现,MEMM 跟 CRF 的区别仅在于分母(也就是归一化因子)的计算方式不同,CRF 的式 (3) 我们称之为是全局归一化的,而 MEMM 的式 (7) 我们称之为是局部归一化的。

模型分析

这一节我们来分析 MEMM 的优劣、改进与效果。

MEMM 的优劣

MEMM 的一个明显的特点是实现简单、速度快,因为它只需要每一步单独执行 softmax,所以 MEMM 是完全可以并行的,速度跟直接逐步 Softmax 基本一样。

而对于 CRF,式 (3) 的分母并不是那么容易算的,它最终转化为一个递归计算,可以在 O(n) 的时间内算出来(具体细节还请参考简明条件随机场CRF介绍 | 附带纯Keras实现),递归就意味着是串行的,因此当我们模型的主体部分是高度可并行的架构(比如纯 CNN 或纯 Attention 架构)时,CRF 会严重拖慢模型的训练速度。后面我们有比较 MEMM 和 CRF 的训练速度(当然,仅仅是训练慢了,预测阶段 MEMM 和 CRF 的速度都一样)。

至于劣势,自然也是有的。前面我们提到过,MEMM 可以看成是一个极度简化的 seq2seq 模型。既然是这样,那么普通 seq2seq 模型有的弊端它都有。seq2seq 中有一个明显的问题是 exposure bias,对应到 MEMM 中,它被称之为 label bias,大概意思是:在训练 MEMM 的时候,对于当前步的预测,都是假设前一步的真实标签已知。

这样一来,如果某个标签 A 后面只能接标签 B ,那么模型只需要通过优化转移矩阵就可以实现这一点,而不需要优化输入 x 对 B 的影响(即没有优化好 f(B;x));然而,在预测阶段,真实标签是不知道的,我们可能无法以较高的置信度预测前一步的标签 A ,而由于在训练阶段,当前步的 f(B;x) 也没有得到强化,所以当前步 B 也无法准确预测,这就有可能导致错误的预测结果。

双向 MEMM

label bias可能不好理解,但我们可以从另外一个视角看 MEMM 的不足:事实上,相比 CRF,MEMM 明显的一个不够漂亮的地方就是它的不对称性——它是从左往右进行概率分解的。

笔者的实验表明,如果能解决这个不对称性,能够稍微提高 MEMM 的效果。笔者的思路是:将 MEMM 也从右往左做一遍,这时候对应的概率分布是:

然后也算一个交叉熵,跟从左往右的式 (7) 的交叉熵平均,作为最终的 loss。这样一来,模型同时考虑了从左往右和从右往左两个方向,并且也不用增加参数,弥补了不对称性的缺陷。作为区分,笔者类比 Bi-LSTM 的命名,将其称为 Bi-MEMM。

注:Bi-MEMM 这个名词并不是在此处首次出现,据笔者所查,首次提出 Bi-MEMM 这个概念的,是论文 Bidirectional Inference with the Easiest-First Strategy for Tagging Sequence Data [1],里边的 Bi-MEMM 是指一种 MEMM 的双向解码策略,跟本文的 Bi-MEMM 含义并不相同。

实验结果演示

为了验证和比较 MEMM 的效果,笔者将 CRF 和 MEMM 同时写进了 bert4keras [2] 中,并且写了中文分词 [3] 和中文命名实体识别 [4] 两个脚本。在这两个脚本中,从 CRF 切换到 MEMM 非常简单,只需将 ConditionalRandomField 替换为 MaximumEntropyMarkovModel 。

详细的实验数据就不贴出来了,反正就是一些数字罢了,下面直接给出一些相对比较的结果:

1. 相同的实验参数下,Bi-MEMM 总是优于 MEMM,MEMM 总是优于 Softmax;

2. 相同的实验参数下,CRF 基本上不差于 Bi-MEMM;

3. 当编码模型能力比较强时,CRF 与 Bi-MEMM 效果持平;当编码模型较弱时,CRF 优于 Bi-MEMM,幅度约为 0.5% 左右;

4. 用 12 层 bert base 模型作为编码模型时,Bi-MEMM 比 CRF 快 25%;用 2 层 bert base 模型作为编码模型时,Bi-MEMM 比 CRF 快 1.5 倍。

注:由于笔者发现 Bi-MEMM 效果总比 MEMM 略好,并且两者的训练时间基本无异,所以 bert4keras 里边的 MaximumEntropyMarkovModel 默认就是 Bi-MEMM。

思考与拓展

根据上面的结论,在深度学习时代,MEMM 的“没落”似乎就可以理解了——MEMM 除了训练速度快点之外,相比 CRF 似乎也就没什么好处了,两者的预测速度是一样的,而很多时候我们主要关心预测速度和效果,训练速度稍微慢点也无妨。

这两个模型的比较结果是有代表性的,可以说这正是所有全局归一化和局部归一化模型的差异:全局归一化模型效果通常好些,但实现通常相对困难一些;局部归一化模型效果通常不超过全局归一化模型,但胜在易于实现,并与易于拓展。 

如何易于拓展?这里举两个方向的例子。

第一个例子,假如标签数很大的时候,比如用序列标注的方式做文本纠错或者文本生成时(相关例子可以参考论文 Fast Structured Decoding for Sequence Models [5]),标签的数目就是词表里边的词汇数 |V| ,就算用了 subword 方法,词汇数少说也有一两万,这时候转移矩阵的参数量就达到数亿(),难以训练。

读者可能会想到低秩分解,不错,低秩分解可以将转移矩阵的参数量控制为 2d|V| ,其中 d 是分解的中间层维度。不幸的是,对于 CRF 来说,低秩分解不能改变归一化因子计算量大的事实,因为 CRF 的归一化因子依然需要恢复为 |V| × |V| 的转移矩阵才能计算下去,所以对于标签数目巨大的场景,CRF 无法直接使用。

但幸运的是,对于 MEMM 来说,低秩分解可以有效低降低训练时的计算量,从而依然能够有效的使用。bert4keras 里边所带的 MaximumEntropyMarkovModel 已经把低秩序分解集成进去了,有兴趣的读者可以查看源码了解细节。

第二个例子,上述介绍的 CRF 和 MEMM 都只考虑相邻标签之间的关联,如果我要考虑更复杂的邻接关联呢?比如同时考虑  跟  的关联?

这时候 CRF 的全局归一化思路就很难操作了,归根结底还是归一化因子难算;但如果是 MEMM 的局部归一化思路就容易进行。事实上,笔者之前设计的信息抽取分层标注思路,也可以说是一种跟 MEMM 类似的局部归一化的概率图模型,它考虑的关联就更复杂化了。

文章小结

本文介绍并简单推广了跟 CRF 一样同为概率图经典案例的 MEMM,它与 CRF 的区别主要是归一化方式上的不一样,接着笔者从实验上对两者做了简单的比较,得出 MEMM 训练更快但效果不优于 CRF 的结论。尽管如此,笔者认为 MEMM 仍有可取之处,所以最后构思了 MEMM 的一些拓展。

相关链接

[1] https://www.aclweb.org/anthology/H05-1059/

[2] https://github.com/bojone/bert4keras

[3] https://github.com/bojone/bert4keras/blob/master/examples/task_sequence_labeling_cws_crf.py

[4] https://github.com/bojone/bert4keras/blob/master/examples/task_sequence_labeling_ner_crf.py

[5] https://arxiv.org/abs/1910.11555

点击以下标题查看更多往期内容:

#投 稿 通 道#

 让你的论文被更多人看到 

如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。

总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。

PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学习心得技术干货。我们的目的只有一个,让知识真正流动起来。

???? 来稿标准:

• 稿件确系个人原创作品,来稿需注明作者个人信息(姓名+学校/工作单位+学历/职位+研究方向)

• 如果文章并非首发,请在投稿时提醒并附上所有已发布链接

• PaperWeekly 默认每篇文章都是首发,均会添加“原创”标志

???? 投稿邮箱:

• 投稿邮箱:hr@paperweekly.site

• 所有文章配图,请单独在附件中发送

• 请留下即时联系方式(微信或手机),以便我们在编辑发布时和作者沟通

????

现在,在「知乎」也能找到我们了

进入知乎首页搜索「PaperWeekly」

点击「关注」订阅我们的专栏吧

关于PaperWeekly

PaperWeekly 是一个推荐、解读、讨论、报道人工智能前沿论文成果的学术平台。如果你研究或从事 AI 领域,欢迎在公众号后台点击「交流群」,小助手将把你带入 PaperWeekly 的交流群里。

▽ 点击 | 阅读原文 | 查看作者博客

CRF用过了,不妨再了解下更快的MEMM?相关推荐

  1. 协程为什么比多线程快?在什么情况下更快?

    协程在什么情况下更快? 据我所知,是在多线程IO时. 协程是单线程异步,但是为什么在多线程IO时协程更快? IO的操作对象(一个文件.一个变量.一块内存空间)可能只能处理一个线程的需求,但是有多个线程 ...

  2. 受损骨骼可能在类似地球的重力条件下更快愈合

    2019独角兽企业重金招聘Python工程师标准>>> 北京时间9月21日消息,据国外媒体报道,一项新研究指出,重力和身体锻炼可能是受损骨骼痊愈的关键. 成功的长期太空旅行--比如长 ...

  3. python撤回上一条命令_python 中执行上一句话,请教问题,怎么也才能使python执行完上一个命令,再执行下一条语句...

    请教问题,怎么也才能使python执行完上一个命令,再执行下一条语句 正常的批处理文件执行完毕就2113会自动退出,连exit都不5261需要. 你是不是看见执行时4102窗口光标一闪一闪或者闪都不闪 ...

  4. 一个球从100米高度自由落下,每次落地后反弹回原高度的一半; * 再落下,求在第几次之后反弹高度小于0.1米, * 并计算在这一次落地时共经过多少米?...

    package com.db2;/*** 一个球从100米高度自由落下,每次落地后反弹回原高度的一半: * 再落下,求在第几次之后反弹高度小于0.1米,* 并计算在这一次落地时共经过多少米?* * @ ...

  5. ACMNO.14一球从M米高度自由下落,每次落地后返回原高度的一半,再落下。 它在第N次落地时反弹多高?共经过多少米? 保留两位小数 输入 M N 输出 它在第N次落地时反弹多高?共经过多少米

    题目描述 一球从M米高度自由下落,每次落地后返回原高度的一半,再落下.它在第N次落地时反弹多高?共经过多少米? 保留两位小数 输入 M N 输出 它在第N次落地时反弹多高?共经过多少米? 保留两位小数 ...

  6. /* * 编程第二题(20分): 一球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下。求它在第十次落地时,共经过多少米?第十次反弹多高? */

    题目: /* * 编程第二题(20分): 一球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下.求它在第十次落地时,共经过多少米?第十次反弹多高? */ 我是用java做的 public ...

  7. android子线程没有运行完,android假如主线程依赖子线程A的执行结果,如何让A执行完成,之后主线程再往下执行呢?...

    /* String ObjectResult="原先的结果"; //使用VOLLY框架(与问题无关) JsonObjectRequest jsonObjectRequest = n ...

  8. 一球从M米高度自由下落,每次落地后返回原高度的一半,再落下。 它在第N次落地时反弹多高?共经过多少米? 保留两位小数...

    问题 1019: [编程入门]自由下落的距离计算 时间限制: 1Sec 内存限制: 128MB 提交: 7252 解决: 4190 题目描述 一球从M米高度自由下落,每次落地后返回原高度的一半,再落下 ...

  9. C语言学习之一个球从100m高度自由落下,每次落地后反弹回原高度的一半,再落下,再反弹。求它在第10次落地时共经过多少米,第10次反弹多高。

    一个球从100m高度自由落下,每次落地后反弹回原高度的一半,再落下,再反弹.求它在第10次落地时共经过多少米,第10次反弹多高. #include <stdio.h> void main( ...

最新文章

  1. iOS 走近商城 APP(三 WKWebView 商品规格选择框架封装)
  2. Vim 在 windows 环境下的初步配置
  3. Linux杂项设备驱动
  4. 什么牌子的平板电脑好_台式电脑哪个牌子好
  5. 深入浅出Nintex——更新PeopleandGroup类型的Field
  6. 如何批量删除.svn文件
  7. AI未来 - 李开复 - 未来8成的工作受影响 - 读后感
  8. LC-3 汇编语言 指令集
  9. GPRS通信原理+中国移动micro sim 卡,实现经过tcp/ip 传输数据到服务器
  10. 给定某数字A(1≤A≤9)以及非负整数N(0≤N≤100000),求数列之和S=A+AA+AAA+⋯+AA⋯A(N个A)。例如A=1,N=3时,S=1+11+111=123。
  11. 什么是云中台系统_什么是云中的超融合?
  12. 毕马威《2021年中国证券业调查报告》:金融科技和数字化将成为发展核心
  13. hevc_nvenc 详细分析2 ——preset分析
  14. Cocos2dx 之 cocosbuilder的使用
  15. 自动驾驶入门技术(4)—— 摄像头
  16. 管家婆软件五大实用小技巧,不会用太可惜了
  17. c语言调用dll实例 结构体传参,Matlab调用Dll,对于自定义结构体数组如何传参? - 程序语言 - 小木虫 - 学术 科研 互动社区...
  18. 中文为什么没有词干提取_词干中没有小写字母
  19. 【心情分享】时间的魅力
  20. 利用html-minifier和uglify-js对前端HTML/CSS/JS文件进行压缩

热门文章

  1. soc 设计soc设计 uml实务手册_采用 USB4 技术升级 SoC 设计
  2. 原创-互联网技术图谱
  3. 迭代器、for循环本质、生成器、常用内置方法整理
  4. 练习4.4、4.5、4.6、4.7
  5. maven中jar下载失败
  6. 数据库事务的四大特性以及事务的隔离级别详解
  7. Node.js 文件系统流pipe到Http响应流中
  8. Linux 下比较文件内容并相同部分、不同部分
  9. Android Studio的配置问题——Intel HAXM is required to run this AVD,VT-x is disabled in BIOS;
  10. 计算机网络.doc,计算机网络network.doc