用深度学习作命名实体识别(七)-CRF介绍

还记得以前介绍过的命名实体识别系列文章吗,能够从句子中提取出人名、地址、公司等实体字段,当时只是简单提到了BERT+CRF模型,BERT已经在上一篇文章中介绍过了,本文将对CRF作一个基本的介绍。本文尽量不涉及复杂晦涩的数学公式,目的只是快速了解CRF的基本概念以及其在命名实体识别等天然语言处理领域的做用。html

什么是CRF?

CRF,全称 Conditional Random Fields,中文名:条件随机场。是给定一组输入序列的条件下,另外一组输出序列的条件几率分布模型。算法

何时能够用CRF?

当输出序列的每个位置的状态,须要考虑到相邻位置的状态的时候。举两个例子:
一、假设有一堆小明平常生活的照片,可能的状态有吃饭、洗澡、刷牙等,大部分状况,咱们是可以识别出小明的状态的,可是若是你看到一张小明露出牙齿的照片,在没有相邻的小明的状态为条件的状况下,是很难判断他是在吃饭仍是刷牙的。这时,就能够用crf。
二、假设有一句话,这里假设是英文,咱们要判断每一个词的词性,那么对于一些词来讲,若是不知道相邻词的词性的状况下,是很难准确判断每一个词的词性的。这时,也能够用crf。网络

什么是随机场?

咱们先来讲什么是随机场。
The collection of random variables is called a stochastic process.A stochastic process that is indexed by a spatial variable is called a random field.
随机变量的集合称为随机过程。由一个空间变量索引的随机过程,称为随机场。
也就是说,一组随机变量按照某种几率分布随机赋值到某个空间的一组位置上时,这些赋予了随机变量的位置就是一个随机场。好比上面的例子中,小明的一系列照片分别是什么状态组成了一组位置,咱们从一组随机变量{吃饭、洗澡、刷牙}中取值,随机变量遵循某种几率分布,随机赋给一组照片的某一张的输出位置,并完成这组照片的全部输出位置的状态赋值后,这些状态和所在的位置全体称为随机场。dom

为何叫条件随机场?

回答这个问题须要先来看看什么是马尔可夫随机场,若是一个位置的赋值只和与它相邻的位置的值有关,与和它不相邻的位置的值无关,那么这个随机场就是一个马尔可夫随机场。这个假设用在小明和词性标注的例子中都是合适的,由于咱们经过前一张照片就能够判断当前露牙的照片是刷牙仍是吃饭,根据前一个词的词性就能够判断当前词的词性是否符合语法。
马尔可夫模型是根据隐含变量(词性)生成可观测状态(词),而条件随机场是根据观测状态(词)判别隐含变量(词性)。或者说条件随机场是给定了观测状态(输入序列)集合这个先验条件的马尔科夫随机场。上面例子中的给定的小明照片,给定的英文句子,这些都是随机场的先验条件。函数

CRF的数学描述   

设X与Y是随机变量,P(Y|X)是给定X时Y的条件几率分布,若随机变量Y构成的是一个马尔科夫随机场,则称条件几率分布P(Y|X)是条件随机场。在实际的应用中,好比上面的两个例子,咱们通常都要求X和Y有相同的结构,以下:
X=(X1,X2,...Xn),Y=(Y1,Y2,...Yn)
好比词性标注,咱们要求输出的词性序列和输入的句子中的每一个词是一一对应的。
X和Y有相同的结构的CRF就构成了线性链条件随机场(Linear chain Conditional Random Fields,简称 linear-CRF)。
上面的例子中没有提到命名实体识别,但其实命名实体识别的原理和上面的例子是同样的,也是用到了linear-CRF,后面会提到。学习

CRF如何提取特征?

CRF中有两类特征函数,分别是状态特征和转移特征,状态特征用当前节点(某个输出位置可能的状态中的某个状态称为一个节点)的状态分数表示,转移特征用上一个节点到当前节点的转移分数表示。其损失函数定义以下:

CRF损失函数的计算,须要用到真实路径分数(包括状态分数和转移分数),其余全部可能的路径的分数(包括状态分数和转移分数)。这里的路径用词性来举例就是一句话对应的词性序列,真实路径表示真实的词性序列,其余可能的路径表示其余的词性序列。
这里的分数就是指softmax以前的几率,或称为未规范化的几率。softmax的做用就是将一组数值转换成一组0-1之间的数值,这些数值的和为1,这样就能够表示几率了。spa

对于词性标注来讲,给定一句话和其对应的词性序列,那么其似然性的计算公式(CRF的参数化公式)以下,图片出自条件随机场CRF
3d

  • l表示某个词上定义的状态特征的个数,k表示转移特征的个数,i表示词在句子中的位置。
  • tk和sl分别是转移特征函数和状态特征函数。
  • λk和μl分别是转移特征函数和状态特征函数的权重系数,经过最大似然估计能够获得。
  • 上面提到的状态分数和转移分数都是非规范化的对数几率,因此几率计算都是加法,这里加上一个exp是为了将对数几率转为正常几率。实际计算时还会除以一个规范化因子Z(x),其实就是一个softmax过程。

在只有CRF的状况下,上面说的2类特征函数都是人工设定好的。通俗的说就是人工设定了观测序列的特征。
人为设定状态特征模板,好比设定“某个词是名词”等。
人为设定转移特征模板,好比设定“某个词是名词时,上一个词是形容词”等。
给定一句话的时候,就根据上面设定的特征模板来计算这句话的特征分数,计算的时候,若是这句话符合特征模板中的特征规则,则那个特征规则的值就为1,不然就为0。
实体识别的表现取决于2种特征模板设定的好坏。
因此若是咱们能使用深度神经网络的方式,特征就能够由模型本身学习获得,这就是使用BERT+CRF的缘由。htm

命名实体识别中的BERT和CRF是怎么配合的?

由BERT学习序列的状态特征,从而获得一个状态分数,该分数直接输入到CRF层,省去了人工设置状态特征模板。
这里的状态特征是说序列某个位置可能对应的状态(命名实体识别中是指实体标注),
状态分数是每一个可能的状态的softmax前的几率(又称非规范化几率,或者直接称做分数),
实体标注一般用BIO标注,B表示词的开始,I表示词的延续,O表示非实体词,好比下面的句子和其对应的实体标注(假设咱们要识别的是人名和地点):
小 明 爱 北 京 的 天 安 门 。
B-Person I-Person O B-Location I-Location O B-Location I-Location I-Location Oblog

也就是说BERT层学到了句子中每一个字符最可能对应的实体标注是什么,这个过程是考虑到了每一个字符左边和右边的上下文信息的,可是输出的最大分数对应的实体标注依然可能有误,不会100%正确的,出现B后面直接跟着B,后者标注以I开头了,都是有可能的,而下降这些明显不符规则的问题的状况的发生几率,就能够进一步提升BERT模型预测的准确性。此时就有人想到用CRF来解决这个问题。

CRF算法中涉及到2种特征函数,一个是状态特征函数,计算状态分数,一个是转移特征函数,计算转移分数。前者只针对当前位置的字符能够被转换成哪些实体标注,后者关注的是当前位置和其相邻位置的字符能够有哪些实体标注的组合。BERT层已经将状态分数输出到CRF层了,因此CRF层还须要学习一个转移分数矩阵,该矩阵表示了全部标注状态之间的组合,好比咱们这里有B-Person I-Person B-Location I-Location O 共5种状态,有时候还会在句子的开始和结束各加一个START 和 END标注,表示一个句子的开始和结束,那么此时就是7种状态了,那么2个状态(包括本身和本身)之间的组合就有7*7=49种,上面说的转移分数矩阵中的元素就是这49种组合的分数(或称做非规范化几率),表示了各个组合的可能性。这个矩阵一开始是随机初始化的,经过训练后慢慢会知道哪些组合更符合规则,哪些更不符合规则。从而为模型的预测带来相似以下的约束:

  • 句子的开头应该是“B-”或“O”,而不是“I-”。
  • “B-label1 I-label2 I-label3…”,在该模式中,类别1,2,3应该是同一种实体类别。好比,“B-Person I-Person” 是正确的,而“B-Person I-Organization”则是错误的。
  • “O I-label”是错误的,命名实体的开头应该是“B-”而不是“I-”。

矩阵示意以下:

为何不能经过人工来判断标注规则并编写好修正逻辑呢?
由于人工虽然能判断出预测的标注先后关系是否符合规则,可是没法知道如何对不符合规则的预测进行调整,好比咱们知道句子的开头应该是“B-”或“O”,而不是“I-”,可是到底是B-仍是O呢?并且对于标注状态很是多的场景下,人工编写的工做量和逻辑是很是大且复杂的。

CRF损失函数的计算,须要用到真实路径分数(包括状态分数和转移分数),其余全部可能的路径的分数(包括状态分数和转移分数)。其中真实路径的状态分数是根据训练获得的BERT模型的输出计算出来的,转移分数是从CRF层提供的转移分数矩阵获得的。其余路径的状态分数和转移分数其实也是这样计算的。

最后咱们来看下真实路径的计算原理,实际上是使用了维特比算法。

维特比算法

概念:用相邻两个层的最优路径来组成最终从起始层到结束层的最优路径。最优路径是指从上一层的各个节点到达当前层的某个节点的全部路径中,几率最大 or 距离最短(或者其余理由,具体自行定义) 的路径。
核心理念:从上一层的各个节点到达当前层的某个节点的路径的几率最大,则该节点必定在最大路径上。由于后续再计算状态转移的时候,该节点到下一个某状态节点(或称为目标节点)的几率必定也是大于其余节点到下一个某状态节点的几率的,至于会到哪个目标节点,只取决于当前节点到目标节点的转移分数以及目标节点的状态分数,但不管到哪一个节点,当前节点在最优路径上这个判断是毋庸置疑的了。以下图:


H,F之间的转移几率是固定的,包括H->H和F->F,都来自于转移分数矩阵,好比上图蓝色框中的0.084 * 0.3 * 0.6是来自H0.084节点,该节点是上一层计算获得的最大几率的路径上的节点,你可能会想,若是这一层计算H->F的几率比F->F的几率小怎么办,维特比算法是否是就不是全局最优解了?其实这一层计算H->F的几率比F->F的几率小的状况不会出现,咱们来看这一层(蓝色框)两个状态转移几率的计算:

  • H->F 0.084 * 0.3 * 0.6
  • F->F 0.027 * 0.6 * 0.6
    因为最后一个数字表示到最后一层F节点的状态分数,因此都是0.6,那么比较的时候能够不考虑,因而获得下面的计算式子:
  • 0.084 * 0.3 第一个数字是上一层求出的分数,这个分数是全部路径中的最大值,这个最大值的计算:0.084=0.3 * 0.3 * 0.3
  • 0.027 * 0.6 第一个数字是上一层求出的分数,这个分数的计算:0.027=0.04 * 0.6 * 0.3
    根据上面的逻辑,获得下面的式子:
  • 0.084 * 0.3 = 0.3 * 0.3 * 0.3 * 0.3
  • 0.027 * 0.6 = 0.04 * 0.6 * 0.3 * 0.6

这里的第一项的0.3和0.04分别表示上一层的H和F节点的状态分数,咱们分别设为a和b,如今已知a * 0.3 * 0.3=0.084,b * 0.6 * 0.3=0.027,0.084>0.027,因此后面再来一次转移,也就是0.084 * 0.3也必定是大于0.027 * 0.6的,若是还有更多层的话,后面的计算仍是一个乘以0.3,一个乘以0.6吗,固然是的,由于0.3是H转移到F的转移几率,0.6是F转移到F的转移几率,这个转移几率是固定的。

因此当前层状态分数最大的节点,必定在最优路径上,以此递推到最后一层后,反过来追溯每次记录下来的几率最大的节点,就能够获得一条最优的路径了。
上图的最优路径是:Start-H-H-F

总结

命名实体识别中,BERT负责学习输入句子中每一个字和符号到对应的实体标签的规律,而CRF负责学习相邻实体标签之间的转移规则。

ok,本篇就这么多内容啦~,感谢阅读O(∩_∩)O。

相关文章
相关标签/搜索