以前咱们介绍过BERT+CRF来进行命名实体识别,并对其中的BERT和CRF的概念和做用作了相关的介绍,然对于CRF中的最优的标签序列的计算原理,咱们只提到了维特比算法,并无作进一步的解释,本文将对维特比算法作一个通俗的讲解,以便你们更好的理解CRF为何可以获得最优的标签序列。git
经过阅读本文你将能回答以下问题:github
首先,让咱们简单回顾一下BERT和CRF在命名实体识别中各自的做用:
命名实体识别中,BERT负责学习输入句子中每一个字和符号到对应的实体标签的规律,而CRF负责学习相邻实体标签之间的转移规则。详情能够参考这篇文章CRF在命名实体识别中是如何起做用的?。该文章中咱们对CRF作了简单易懂的介绍,其中提到CRF的损失函数计算要用到最优路径,由于CRF的损失函数是求最优路径的几率占全部路径几率和的比例,而咱们的目标是最大化这个比例。那么这里就涉及到计算最优路径的问题。这里的路径在命名实体识别的例子中,就是最终输出的与句子中的字或符号一 一对应的标签序列。不一样标签序列的顺序组成了不一样的路径。而CRF就是要找出最正确的那条标签序列路径,也就是说这条标签路径的几率将是全部路径中最大的,那么咱们能够穷举出全部可能的标签路径,计算出每条路径的几率和,而后比较出最大的那条,可是这样作的代价太大了,因此crf选择了一种称为维特比的算法来求解此类问题。算法
维特比算法(英语:Viterbi algorithm)是一种动态规划算法。它用于寻找最有可能产生观测事件序列的维特比路径。函数
看看下面这个命名实体识别的例子:
学习
上图共有5层(观测序列的长度),每层3个节点(状态的个数),咱们的目标就是找到从第一层到第五层的最优路径。
首先,咱们分别计算红、黄、蓝三个节点的输入连线的几率,以红色节点举例,咱们先假设红色节点在最优路径上,那么输入到该节点的三条连线中,几率最大的那条必定在最优路径上,同理,咱们再分别假设黄色和蓝色节点在最优路径上,咱们也能各找到一条几率最大的连线,这样就获得了下面的图:
而后,咱们接着刚才的思路继续找后面一层的三条最优的连线:
假设找到的最优连线以下:
而后,接着在后面的层应用这个方法:
此时,看上面最后一张图,咱们有了3条候选最优路径,分别是棕色、绿色和紫色,用标签来表达以下:
那么哪条才是最优路径呢?
就是看哪条路径的几率和最大,那条路径就是最优路径。
可是在实际实现的时候,通常会在计算各层的最优候选连线的时候,就记录下前继连线的几率和,并记录下对应的状态节点索引(这里将已经计算出的结果记录下来供后续使用的方式,就是维特比算法被称为动态规划算法的缘由),这样到最后一层的时候,最后一层各候选连线中几率最大的,就是在最优路径上的那条连线了,而后从这条连线回溯,找出完整的路径就是最优路径了。3d
一直在说几率最大的路径,那么这个几率具体指什么呢?
还记得上一篇文章介绍条件随机场(CRF)的时候提到,条件随机场实际上是给定了观测序列的马尔可夫随机场,在一阶马尔可夫模型中,定义了如下三个概念:blog
CRF中给定了观测序列作为先验条件,对应到上面的例子就是:
其中的几率数值一样是随便假设的,为了方便举例。索引
下图中红色节点的几率(能够当作是一个虚拟的开始节点到该节点的连线的几率)的计算方式以下:
初始状态为B-P的几率Π(B-P) * 该节点的观测几率P(小|B-P)
下图中红色节点的三条连线几率的计算方式以下:
上一层对应节点的几率 * 上层对应节点到该节点的转移几率 * 该节点的观测几率P(明|B-P)
其它层之间的节点连线的几率同理计算可得,而后经过上面介绍的维特比算法过程就能够计算出最优路径了。token
ok,本篇就这么多内容啦~,感谢阅读O(∩_∩)O。
事件