zoukankan      html  css  js  c++  java
  • Viterbi(维特比)算法在CRF(条件随机场)中是如何起作用的?

    之前我们介绍过BERT+CRF来进行命名实体识别,并对其中的BERT和CRF的概念和作用做了相关的介绍,然对于CRF中的最优的标签序列的计算原理,我们只提到了维特比算法,并没有做进一步的解释,本文将对维特比算法做一个通俗的讲解,以便大家更好的理解CRF为什么能够得到最优的标签序列。

    通过阅读本文你将能回答如下问题:

    • 什么是维特比算法?
    • 为什么说维特比算法是一种动态规划算法?
    • 维特比算法具体怎么实现?

    首先,让我们简单回顾一下BERT和CRF在命名实体识别中各自的作用:

    命名实体识别中,BERT负责学习输入句子中每个字和符号到对应的实体标签的规律,而CRF负责学习相邻实体标签之间的转移规则。详情可以参考这篇文章CRF在命名实体识别中是如何起作用的?。该文章中我们对CRF做了简单易懂的介绍,其中提到CRF的损失函数计算要用到最优路径,因为CRF的损失函数是求最优路径的概率占所有路径概率和的比例,而我们的目标是最大化这个比例。那么这里就涉及到计算最优路径的问题。这里的路径在命名实体识别的例子中,就是最终输出的与句子中的字或符号一 一对应的标签序列。不同标签序列的顺序组成了不同的路径。而CRF就是要找出最正确的那条标签序列路径,也就是说这条标签路径的概率将是所有路径中最大的,那么我们可以穷举出所有可能的标签路径,计算出每条路径的概率和,然后比较出最大的那条,但是这样做的代价太大了,所以crf选择了一种称为维特比的算法来求解此类问题。

    维特比算法(英语:Viterbi algorithm)是一种动态规划算法。它用于寻找最有可能产生观测事件序列的维特比路径。

    看看下面这个命名实体识别的例子:

    上图共有5层(观测序列的长度),每层3个节点(状态的个数),我们的目标就是找到从第一层到第五层的最优路径。

    首先,我们分别计算红、黄、蓝三个节点的输入连线的概率,以红色节点举例,我们先假设红色节点在最优路径上,那么输入到该节点的三条连线中,概率最大的那条一定在最优路径上,同理,我们再分别假设黄色和蓝色节点在最优路径上,我们也能各找到一条概率最大的连线,这样就得到了下面的图:

    然后,我们接着刚才的思路继续找后面一层的三条最优的连线:

    假设找到的最优连线如下:

    然后,接着在后面的层应用这个方法:

    此时,看上面最后一张图,我们有了3条候选最优路径,分别是棕色、绿色和紫色,用标签来表达如下:

    那么哪条才是最优路径呢?

    就是看哪条路径的概率和最大,那条路径就是最优路径。

    但是在实际实现的时候,一般会在计算各层的最优候选连线的时候,就记录下前继连线的概率和,并记录下对应的状态节点索引(这里将已经计算出的结果记录下来供后续使用的方式,就是维特比算法被称为动态规划算法的原因),这样到最后一层的时候,最后一层各候选连线中概率最大的,就是在最优路径上的那条连线了,然后从这条连线回溯,找出完整的路径就是最优路径了。

    一直在说概率最大的路径,那么这个概率具体指什么呢?

    还记得上一篇文章介绍条件随机场(CRF)的时候提到,条件随机场其实是给定了观测序列的马尔可夫随机场,在一阶马尔可夫模型中,定义了以下三个概念:

    • 状态集合Q,对应到上面的例子就是:
      {B-P, I-P, O}
    • 初始状态概率向量Π,对应到上面的例子就是:
      {B-P:0.3, I-P:0.2, O:0.5}
      这里的概率数值是随便假设的,仅为了方便举例说明。
    • 状态转移概率矩阵A:

    CRF中给定了观测序列做为先验条件,对应到上面的例子就是:

    其中的概率数值同样是随便假设的,为了方便举例。

    下图中红色节点的概率(可以看成是一个虚拟的开始节点到该节点的连线的概率)的计算方式如下:

    初始状态为B-P的概率Π(B-P) * 该节点的观测概率P(小|B-P)

    下图中红色节点的三条连线概率的计算方式如下:

    上一层对应节点的概率 * 上层对应节点到该节点的转移概率 * 该节点的观测概率P(明|B-P)

    其它层之间的节点连线的概率同理计算可得,然后通过上面介绍的维特比算法过程就可以计算出最优路径了。

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

  • 相关阅读:
    dotnet core 获取 MacAddress 地址方法
    dotnet core 获取 MacAddress 地址方法
    dotnet core 发布只带必要的依赖文件
    dotnet core 发布只带必要的依赖文件
    Developing Universal Windows Apps 开发UWA应用 问答
    Developing Universal Windows Apps 开发UWA应用 问答
    cmd 如何跨驱动器移动文件夹
    cmd 如何跨驱动器移动文件夹
    C++ 驱动开发 error LNK2019
    C++ 驱动开发 error LNK2019
  • 原文地址:https://www.cnblogs.com/anai/p/11938089.html
Copyright © 2011-2022 走看看