作者:CreateMoMo

编译:ronghuaiyang

导读

今天是第二部分,给大家推导一下CRF的损失函数如何计算,思路很清楚。

回顾

在前一节中,我们知道CRF层可以从训练数据集中学习一些约束,以确保最终预测的实体标签序列是有效的。

约束条件可以是:

  • 句子中第一个单词的标签应该以“B-”或“O”开头,而不是“I-”

  • “B-label1 I-label2 I-label3 I-…”,在这个模式中,label1、label2、label3…应该是相同的命名实体标签。例如,“B-Person I-Person”是有效的,但是“B-Person I-Organization”是无效的。

  • “O I-label”无效。一个命名实体的第一个标签应该以“B-”而不是“I-”开头,换句话说,有效的模式应该是“O B-label”

阅读本文之后,你将了解为什么CRF层可以学习这些约束。

2. CRF层

在CRF层的损失函数中,我们有两种类型的分数。这两个分数是CRF层的关键概念

2.1 Emission得分

第一个是emission分数。这些emission分数来自BiLSTM层。例如,如图2.1所示,标记为B-Person的w0的分数为1.5。

为了方便起见,我们将给每个标签一个索引号,如下表所示。

我们用













来表示emission分数。i是word的索引,







是label的索引。如图2.1所示,=1,即w1作为B-Organization的得分为0.1。

2.2 Transition得分

我们使用
















来表示transition分数。例如,表示标签的transition,




















得分为0.9。因此,我们有一个transition得分矩阵,它存储了所有标签之间的所有得分。

为了使transition评分矩阵更健壮,我们将添加另外两个标签,START和END。START是指一个句子的开头,而不是第一个单词。END表示句子的结尾。

下面是一个transition得分矩阵的例子,包括额外添加的START和END标签。

如上表所示,我们可以发现transition矩阵已经学习了一些有用的约束。

  • 句子中第一个单词的标签应该以“B-”或“O”开头,而不是“I-”开头**(从“START”到“I- person或I- organization”的transition分数非常低)**

  • “B-label1 I-label2 I-label3 I-…”,在这个模式中,label1、label2、label3…应该是相同的命名实体标签。例如,“B-Person I-Person”是有效的,但是“B-Person I-Organization”是无效的。(例如,从“B-Organization”到“I-Person”的分数只有0.0003,比其他分数低很多)

  • “O I-label”无效。一个被命名实体的第一个标签应该以“B-”而不是“I-”开头,换句话说,有效的模式应该是“O B-label”(同样,


















    的分数非常小)

你可能想问一个关于矩阵的问题。在哪里或如何得到transition矩阵

实际上,该矩阵是BiLSTM-CRF模型的一个参数。在训练模型之前,可以随机初始化矩阵中的所有transition分数。所有的随机分数将在你的训练过程中自动更新。换句话说,CRF层可以自己学习这些约束。我们不需要手动构建矩阵。随着训练迭代次数的增加,分数会逐渐趋于合理。

2.3 CRF损失函数

CRF损失函数由真实路径得分和所有可能路径的总得分组成。在所有可能的路径中,真实路径的得分应该是最高的。

例如,如果我们的数据集中有如下表所示的这些标签:

我们还是有一个5个单词的句子。可能的路径是:

  • 1) START B-Person B-Person B-Person B-Person B-Person END

  • 2) START B-Person I-Person B-Person B-Person B-Person END

  • 10) START B-Person I-Person O B-Organization O END

  • N) O O O O O O O

假设每条可能的路径都有一个分数







,并且总共有N条可能的路径,所有路径的总分数是。(在第2.4节中,我们将解释如何计算







,你也可以把它当作这条路径的分数。)

如果我们说第10条路径是真正的路径,换句话说,第10条路径是我们的训练数据集提供的黄金标准标签。在所有可能的路径中,得分









应该是百分比最大的。

在训练过程中,我们的BiLSTM-CRF模型的参数值将会一次又一次的更新,以保持增加真实路径的分数百分比。

现在的问题是:1)如何定义一个路径的分数?2)如何计算所有可能路径的总分?3)当我们计算总分时,我们需要列出所有可能的路径吗?(这个问题的答案是否定的。)

在下面的小节中,我们将看到如何解决这些问题。

2.4 实际路径得分

在2.3节中,我们假设每条可能的路径都有一个得分







,并且有N条可能的路径,所有路径的总得分为

显然,在所有可能的路径中,一定有一条是真实路径。对于这个例子来说,第1.2节中句子的实际路径是**“START B-Person I-Person O B-Organization O END”**。其他的是不正确的,如“START B-Person B-Organization O I-Person I-Person B-Person”。












是第i条路径的得分。

在训练过程中,CRF损失函数只需要两个分数:真实路径的分数和所有可能路径的总分数。所有可能路径的分数中,真实路径分数所占的比例会逐渐增加

计算实际路径分数












非常简单。

这里我们主要关注的是









的计算。

选取真实路径,“START B-Person I-Person O B-Organization O END”,我们以前用过,例如:

  • 我们有一个5个单词的句子,w1,w2,w3,w4, w4,w5

  • 我们增加了两个额外的单词来表示一个句子的开始和结束,w0,w6











  • 由两部分组成:

Emission得分





















  • 是第index个单词被label标记的分数

  • 这些得分来自之前的BiLSTM输出。

  • 对于















    ,












    ,我们可以把它们设为0。

Transition得分
























  • 是从 label1到label2的transition分数

  • 这些分数来自CRF层。换句话说,这些transition分数实际上是CRF层的参数。

综上所述,现在我们可以计算出









以及路径得分












下一步是如何计算所有可能路径的总分

2.5 所有可能的路径的得分

如何逐步计算一个toy例子一个句子的所有可能的路径的总分。

在上一节中,我们学习了如何计算一个路径(即












)的标签路径得分。到目前为止,我们还有一个需要解决的问题,就是如何得到所有路径的总分()。

衡量总分最简单的方法是:列举所有可能的路径并将它们的分数相加。是的,你可以用这种方法计算总分。然而,这是非常低效的。训练的时间将是难以忍受的。

在探索以下内容之前,我建议你先准备一张白纸和一支笔,并按照示例中列出的步骤进行操作。我相信这将有助于你更好地理解算法的细节。此外,你应该知道如何用你喜欢的编程语言实现它。

步骤1: 回想一下CRF损失函数

在p 2.3中,我们将CRF损失函数定义为:

现在我们把loss函数变成log loss函数:

因为当我们训练一个模型时,通常我们的目标是最小化我们的损失函数,我们加上一个负号:

在上一节中,我们已经知道如何计算实际路径得分,现在我们需要找到一个有效的解决方案来计算









































步骤2: 回忆一下Emission和Transition得分

为了简化,我们假设我们从这个句子中训练我们的模型,它的长度只有3:























此外,在我们的数据集中,我们有两个标签:





















我们还有Bi-LSTM层输出的Emission分数:












表示







被标记为







的得分。

此外,Transition分数来自CRF层:

![1585055587948](CRF Layer on the Top of BiLSTM - 2.assets/1585055587948.png)










是从标签i到标签j的transition得分。

步骤3: 开始战斗(准备好纸笔)

记住:我们的目标是:










































这个过程就是分数的累加。其思想与动态规划相似(如果你不知道什么是动态编程,也可以继续阅读本文)。我将逐步解释这个例子。但我强烈建议你学习动态规划算法。简而言之,计算w0的所有可能路径的总分。然后,我们用总分来计算w0→w1。最后,我们使用最新的总分来计算w0→w1→w2。我们需要的是最后的总分。

在接下来的步骤中,你将看到两个变量:obspreviousprevious存储前面步骤的最终结果。obs表示当前单词的信息。


















































如果我们的句子只有一个单词







,我们就没有前面步骤的结果,因此previous是None。另外,我们只能观察到第一个词










































是上述的Emission分数。

你可能会想,







的所有可能路径的总分是多少?答案很简单:



































































  1. previous展开成:

  1. obs展开成:



















































你可能想知道,为什么我们需要把previousobs扩展成矩阵。因为矩阵可以提高计算的效率。在下面的过程中,你将很快看到这一点。

  1. previous, obs以及transition得分求和:

然后:

为下一个迭代修改previous的值:

实际上,第二次迭代已经完成。如果有人想知道如何计算所有可能路径的总分(label1→label1, label1→label2, label2→label1, label2→label2),从w0到w1,可以做如下计算。

我们使用新的previous中的元素:

你发现了吗?这正是我们的目标:









































在这个等式中,我们可以看到:






















:

如果你读到这里了,你已经快要读完了,实际上,在这个迭代里,我们做的事情是和上个迭代一样的。
























  1. previous扩展成:

  1. obs扩展成:



















































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

然后:

为下一个迭代计算 previous的值:

就像下一个迭代描述的一样,我们使用新的previous中的元素来计算total score:

恭喜

我们达到了目标,









































,我们的toy句子有三个单词,label set有两个label,所以一共应该有8种可能的label path。


在你享用一杯咖啡或一块甜蛋糕休息之前,请允许我说几句话。虽然你发现这个过程相当复杂,但是实现这个算法要容易得多。使用计算机的优点之一是可以完成一些重复性的工作。现在你可以自己实现CRF损失函数,并开始训练自己的模型。

—END—

英文原文:https://createmomo.github.io/2017/09/23/CRF_Layer_on_the_Top_of_BiLSTM_2

交流学习,进群备注:昵称-学校(公司)-方向,进入DL&NLP交流群。

方向有很多:机器学习、深度学习,python,情感分析、意见挖掘、句法分析、机器翻译、人机对话、知识图谱、语音识别等。

【实践】BiLSTM上的CRF,用命名实体识别任务来解释CRF(2)损失函数相关推荐

  1. 知识图谱 基于CRF的命名实体识别模型

    基于CRF的命名实体识别模型 条件随机场 CRF ​ 条件随机场 CRF 是在已知一组输入随机变量条件的情况下,输出另一组随机变量的条件概率分布模型:其前提是假设输出随机变量构成马尔可夫随机场:条件随 ...

  2. 【项目实战课】基于BiLSTM+CRF的命名实体识别实战

    欢迎大家来到我们的项目实战课,本期内容是<基于BiLSTM+CRF的命名实体识别实战>.所谓项目课,就是以简单的原理回顾+详细的项目实战的模式,针对具体的某一个主题,进行代码级的实战讲解. ...

  3. Python3.7+Tensorflow2.0(TF2)实现Bilstm+mask-self-attention+CRF实现命名实体识别

    一.他说的是对的 前几天看到一篇关于大连理工大学的研三学长的去世新闻,仔细看了他的遗书,很是泪目.他说同样的条件,做出的实验结果是不同的. 在训练我这个模型的时候,深深体会到了这个感受,有时候收敛,有 ...

  4. 用CRF做命名实体识别——NER系列(三)

    在上一篇文章<用隐马尔可夫模型(HMM)做命名实体识别--NER系列(二)>中,我们使用HMM模型来做命名实体识别,将问题转化为统计概率问题,进行求解.显然,它的效果是非常有限的. 在深度 ...

  5. NLP入门(八)使用CRF++实现命名实体识别(NER)

    CRF与NER简介   CRF,英文全称为conditional random field, 中文名为条件随机场,是给定一组输入随机变量条件下另一组输出随机变量的条件概率分布模型,其特点是假设输出随机 ...

  6. 逐行讲解CRF实现命名实体识别(NER)

    文章标题 本文概述 NER介绍 代码详解 任务 导入库 加载数据集 构造特征字典 数据处理 模型训练 模型验证 模型参数 备注 随机搜索RandomizedSearchCV 本文概述 使用sklear ...

  7. CRF用于命名实体识别(快速上手实现)

    写在前面 最近在看命名实体识别相关的模型,实验室正好有中医典籍文本的命名实体标注数据集,拿来练练构建一个简单的CRF模型,顺便记录下来,代码可以作为一个参考,手中有标注数据集就可以使用这段代码来训练自 ...

  8. PyTorch 高级实战教程:基于 BI-LSTM CRF 实现命名实体识别和中文分词

    20210607 https://blog.csdn.net/u011828281/article/details/81171066 前言:译者实测 PyTorch 代码非常简洁易懂,只需要将中文分词 ...

  9. 使用CRF++实现命名实体识别

    [定义] CRF++是著名的条件随机场的开源工具,也是目前综合性能最佳的CRF工具,采用C++语言编写而成.其最重要的功能是采用了特征模板.这样就可以自动生成一系列的特征函数,而不用我们自己生成特征函 ...

  10. 中文命名实体识别,HMM,CRF,BiLSTM,BiLSTM+CRF的具体实现

    向AI转型的程序员都关注了这个号

最新文章

  1. python生成器单线程_【Python】迭代器、生成器、yield单线程异步并发实现详解
  2. Asp.net中的两种刷新父窗体方法
  3. Javascript模式阅读笔记 · 简介
  4. 可变和不可变的数据类型
  5. RouteOS的DHCP服务器配置
  6. centos mysql 访问_centos下mysql开启远程访问
  7. Java8新特性学习_001_(Lambda表达式,函数式接口,方法引用,Stream类,Optional类)
  8. 使用 ExpandableListView 实现折叠ListView
  9. Atitit ocr的艺术 艾提拉著 目录 1. OCR可以说是一门非常“古老”的技术,在上世纪50年代到90年代, 1 1.1. 场景文字识别技术(Scene Text Recognition,
  10. vue中使用保利威视频播放器
  11. C语言全局变量,局部变量,静态局部变量的区分
  12. 音视频中的帧I 帧,B帧,P帧,IDR帧理解
  13. 今天发布《看图玩儿》看图软件
  14. python函数调用:带()和不带()的区别
  15. java coap_分布式项目(三)CoAp client and server
  16. PHP开发的H5即时通讯聊天系统源码 带群聊 可封装APP
  17. 智慧城市建设主要包括哪些方面
  18. vue简单的金额计算
  19. 计算机电源不通电 维修,电脑忽然不通电,换了电源也不行,是哪里坏了?
  20. 利用形状图层绘制八卦图

热门文章

  1. struts2入门之action获取表单提交数据
  2. 30天C#基础巩固------了解委托,string练习
  3. js动态改变iframe的高度
  4. javascript 忍者秘籍读书笔记(二)
  5. 【转】到底什么时候应该用MQ
  6. C#中级-Windows Service程序安装注意事项
  7. DB查询语句的编写和执行顺序
  8. maven新建的项目,不自动引入依赖包
  9. QT 的信号与槽机制介绍(转载)
  10. 什么是“5个9”(99.999%)的可靠性?