ronghuaiyang · 2020年04月02日

BiLSTM上的CRF,用命名实体识别任务来解释CRF(3)推理

今天是第三部分,介绍如何推理新的句子。
作者:CreateMoMo
编译:ronghuaiyang
首发:AI公园公众号

2.6 为新的句子推理标签

在前面的章节中,我们学习了BiLSTM-CRF模型的结构和CRF损失函数的细节。你可以通过各种开源框架(Keras、Chainer、TensorFlow等)实现自己的BiLSTM-CRF模型。最重要的事情之一是模型的反向传播是在这些框架上自动计算的,因此你不需要自己实现反向传播来训练你的模型(即计算梯度和更新参数)。此外,一些框架已经实现了CRF层,因此将CRF层与你自己的模型结合起来非常容易,只需添加一行代码即可。

在本节中,我们将探索如何在模型准备好时在测试期间推断句子的标签。

步骤1:BiLSTM-CRF模型的Emission和transition得分

假设,我们有一个包含三个单词的句子:屏幕快照 2020-04-02 下午2.13.18.png

此外,我们已经从BiLSTM模型得到了Emission分数,从下面的CRF层得到了transition分数:

屏幕快照 2020-04-02 下午2.13.03.png

表示被标记为的得分。

屏幕快照 2020-04-02 下午2.13.07.png

是从标签i转换成标签j的得分。

步骤2:开始推理


如果你熟悉Viterbi算法,那么这一部分对你来说很容易。但如果你不熟悉,请不要担心。与前一节类似,我将逐步解释该算法。我们将从句子的左到右进行推理算法,如下图所示:

屏幕快照 2020-04-02 下午2.13.57.png

你会看到两个变量:obs和previous。previous存储前面步骤的最终结果。obs表示当前单词的信息。

屏幕快照 2020-04-02 下午2.14.43.png是历史最好得分,屏幕快照 2020-04-02 下午2.14.47.png是历史对应的索引。这两个变量的细节将在它们出现时进行解释。请看下面的图片:你可以把这两个变量当作狗在探索森林时沿路留下的“记号”,这些“记号”可以帮助狗找到回家的路。

屏幕快照 2020-04-02 下午2.14.14.png


屏幕快照 2020-04-02 下午2.15.49.png

现在,我们观察到第一个单词,现在,对于是很明显的。

比如,如果屏幕快照 2020-04-02 下午2.15.57.png,很显然,屏幕快照 2020-04-02 下午2.16.02.png的最佳的标签是屏幕快照 2020-04-02 下午2.16.56.png

因为只有一个单词,而且没有标签直接的转换,transition的得分没有用到。


屏幕快照 2020-04-02 下午2.16.08.png

  1. 把previous扩展成:

屏幕快照 2020-04-02 下午2.17.40.png

  1. 把obs扩展成:

屏幕快照 2020-04-02 下午2.17.54.png

  1. 把previous, obs和transition分数都加起来:

屏幕快照 2020-04-02 下午2.17.58.png

然后:

屏幕快照 2020-04-02 下午2.18.02.png
你可能想知道,当我们计算所有路径的总分时,与上一节没有什么不同。请耐心和细心,你很快就会看到区别。

为下一次迭代更改previous的值:

屏幕快照 2020-04-02 下午2.18.54.png

比如,如果我们的得分是:

屏幕快照 2020-04-02 下午2.18.59.png

我们的下个迭代的previous是:

屏幕快照 2020-04-02 下午2.19.04.png

previous有什么含义吗? previous列表存储了每个当前的单词的标签的最大的得分。

[Example Start]

举个例子:

我们知道在我们的语料中,我们总共只有2个标签
屏幕快照 2020-04-02 下午2.19.56.png
这两个标签的索引是0和1。

previous[0]是以第0个标签为结尾的路径的最大得分,类似的previous[1]是以第1个标签为结尾的路径的最大得分。在每个迭代中,变量previous存储了以每个标签为结尾的路径的最大得分。换句话说,在每个迭代中,我们只保留了每个标签的最佳路径的信息
屏幕快照 2020-04-02 下午2.20.15.png
具有小得分的路径信息会被丢掉。

[Example End]

回到我们的主任务:

同时,我们还有两个变量用来存储历史信息(得分和索引),屏幕快照 2020-04-02 下午2.21.17.png屏幕快照 2020-04-02 下午2.21.27.png

在这个迭代中,我们把最佳得分加上,为了方便,每个标签的最大得分会加上下划线。

屏幕快照 2020-04-02 下午2.21.22.png

另外,对应的列的索引存在里。

屏幕快照 2020-04-02 下午2.21.32.png

屏幕快照 2020-04-02 下午2.22.32.png


屏幕快照 2020-04-02 下午2.23.04.png

  1. 把previous扩展成:

屏幕快照 2020-04-02 下午2.23.12.png

  1. 把obs扩展成:

屏幕快照 2020-04-02 下午2.23.16.png

  1. 把previous, obs和transition 分数都加起来:

屏幕快照 2020-04-02 下午2.23.20.png

然后:

屏幕快照 2020-04-02 下午2.23.26.png

为下一次迭代更改previous的值:

屏幕快照 2020-04-02 下午2.23.30.png

这次迭代我们得到的分数是:

屏幕快照 2020-04-02 下午2.23.35.png

我们得到最新的previous:

屏幕快照 2020-04-02 下午2.23.42.png

实际上,previous[0]和previous[1]中最大的那个就是预测的最佳路径。

同时,每个标签和索引的最大得分会加到屏幕快照 2020-04-02 下午2.21.17.png 上和屏幕快照 2020-04-02 下午2.21.27.png上。

屏幕快照 2020-04-02 下午2.26.02.png

步骤3:找到具有最高得分的最佳路径

这是最后一步!你就快完成了!在此步骤中,将使用屏幕快照 2020-04-02 下午2.21.17.png屏幕快照 2020-04-02 下午2.21.27.png来查找得分最高的路径。我们将从最后一个到第一个的元素检查这两个列表中。


屏幕快照 2020-04-02 下午2.27.00.png

首先,检查屏幕快照 2020-04-02 下午2.21.17.png屏幕快照 2020-04-02 下午2.21.27.png的最后一个元素:(0.8,0.9)和(1,0)。0.9表示当label为屏幕快照 2020-04-02 下午2.27.37.png时,我们可以得到最高的路径分数0.9。我们还知道屏幕快照 2020-04-02 下午2.27.37.png的索引是1,因此检查(1,0)[1]=0的值。索引“0”表示前一个标签为屏幕快照 2020-04-02 下午2.27.47.png(屏幕快照 2020-04-02 下午2.27.47.png的索引为0),因此我们可以得到是的最佳路径是屏幕快照 2020-04-02 下午2.29.45.png

屏幕快照 2020-04-02 下午2.27.53.png

其次,我们继续向后移动并得到屏幕快照 2020-04-02 下午2.14.47.png:(1,1)的元素。从上一段我们知道w1的label是屏幕快照 2020-04-02 下午2.27.47.png(index是0),因此我们可以检查(1,1)[0]=1。因此,我们可以得到这部分的最佳路径屏幕快照 2020-04-02 下午2.31.05.png

恭喜!我们这个例子中的最佳路径是屏幕快照 2020-04-02 下午2.31.39.png

—END—

英文原文:https://createmomo.github.io/2017/11/24/CRF-Layer-on-the-Top-of-BiLSTM-6/


推荐阅读


关注图像处理,自然语言处理,机器学习等人工智能领域,请点击关注AI公园专栏
欢迎关注微信公众号
AI公园 公众号二维码.jfif
推荐阅读
关注数
8244
内容数
210
关注图像处理,NLP,机器学习等人工智能领域
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息