深度学习利用篇-自然语言解决-命名实体辨认[9]:BiLSTM+CRF实现命名实体辨认、实体、关系、属性抽取实战我的项目合集(含智能标注)

1.命名实体辨认介绍

命名实体辨认(Named Entity Recoginition, NER)旨在将一串文本中的实体辨认进去,并标注出它所指代的类型,比方人名、地名等等。具体地,依据MUC会议规定,命名实体辨认工作包含三个子工作:

  • 实体名:人名、地名、机构名等
  • 工夫表达式:日期、工夫、持续时间等
  • 数字表达式:百分比、度量衡、钱、基数等

咱们来看这句话,百度于2021年3月23日正式回香港上市,这句话中"百度"是个机构名,"香港"是个地名,"2021年3月23日"是个日期,命名实体辨认工作可能通过建模的形式来帮忙咱们主动地发现这些实体。

命名实体辨认是一项比拟要害的NLP工作,具备宽泛的利用场景,例如在对话用意了解(NLU)中,通过提取出相应的实体词,可能帮忙零碎更加精确地了解用户的需要,比方依据用户的问题提取出"天气","北京","明天"这样的词汇,大概率就能晓得用户在问些什么;在微博场景中,利用命名实体辨认提取出微博短文中重要的实体词,也有利于微博信息的汇总,或者事件热度的统计。

NER工作个别会被建模成序列标注工作,也就是说,模型的输出是待辨认的一串文本序列,模型的输入就是该文本序列对应的标签序列,不同于文本分类工作,这是一种序列到序列的工作。咱们来举个例子:

B-PersonI-PersonOOB-OrganizationI-OrganizationI-OrganizationI-OrganizationOO

这句话中的每个字别离对应着一个标签, 模型的输出就是上边的文本,模型的输入就是上面的标签序列,咱们通过这样的标签序列就能辨认出原始文本中的实体。
具体地,上边这串文本中,"姚明"对应着Person实体,其中"姚"字是"Person"实体的起始字,所以设置标签为"B-person",其中标签前边的B代表Begin这个单词;"明"字是"Person"实体的两头字,所以设置标签为"I-Person",其中标签前边的I代表Intermediate这个单词。 "中国篮协"对应这Organization实体,相应标签"B-Organization"和"I-Organization"的解读和Person实体是统一的。最初的标签"O"代表"other",示意其余实体类型的标签。

看到这里,置信你曾经晓得,本节的NER工作要建模实现一件什么事件了,即建模一个序列到序列的模型来找出文本中蕴含的实体。

2.BiLSTM+CRF实现命名实体辨认

BiLSTM + CRF是一种经典的命名实体辨认(NER)模型计划,这在后续很多的模型improvment上都有启发性。如果你有理解NER工作的趣味或者工作,或者齐全出于对CRF的好奇,倡议大家静心读一读这篇文章。

本篇文章会将重点放到条件随机场(CRF)上边,因为这是实现NER工作很重要的一个组件,也是本篇文章最想向你举荐的特色。然而如果你 对长短时记忆网络(LSTM)也不是很相熟,那你也不必放心,笔者会去解释LSTM的用法,它的输出和输入等等内容,以保障你能够顺畅的读上来,领悟到这个模型的精华。

2.1应用BiLSTM+CRF实现NER

为不便直观地看到BiLSTM+CRF是什么,咱们先来贴一下BiLSTM+CRF的模型结构图,如图1所示。

<center>图1 应用BiLSTM+CRF实现NER </center>

图1能够看到,在BiLSTM上方咱们增加了一个CRF层。具体地,在基于BiLSTM取得各个地位的标签向量之后,这些标签向量将被作为发射分数传入CRF中,发射这个概念是从CRF外面带进去的,后边在介绍CRF局部会更多地提及,这里先不必纠结这一点。

这些发射分数(标签向量)传入CRF之后,CRF会据此解码出一串标签序列。那么问题来了,从图1最上边的解码过程能够看出,这里可能对应着很多条不同的门路,例如:

  • B-Person, I-Person, O, ..., I-Organization
  • B-Organization, I-Person, O, ..., I-Person
  • B-Organization, I-Organization, O, ..., O

CRF的作用就是在所有可能的门路中,找出得出概率最大,成果最优的一条门路,那这个标签序列就是模型的输入。

咱们来总结一下,应用BiLSTM+CRF模型架构实现NER工作,大抵分为两个阶段:应用BiLSTM生成发射分数(标签向量),基于发射分数应用CRF解码最优的标签门路。

2. 回归CRF建模原理自身

本节将开始聚焦在CRF原理自身进行解说,力求为读者展示一个分明明确,根底实质的CRF。那当初开始这趟学习之旅吧,置信你肯定会有所播种。

2.1 线性CRF的定义

通常咱们会应用线性链CRF来建模NER工作,所以本试验将聚焦在线性链CRF来探讨。那什么是线性链CRF呢,咱们来看下李航老师在《统计学习办法》书中的定义:

设$X=[x_1, x_2, ..., x_n],Y=[y_1, y_2, ..., y_n]$ 均为线性链示意的随机变量序列,若在给定随机变量序列的$X$的条件下,随机变量序列$Y$的条件概率分布$P(Y|X)$形成条件随机场,即满足马尔可夫性:

$$\begin{align}P(y_i|X, y_{1},...,y_{i-1},y_{i+1},...,y_n) &= P(y_i|X,y_{i-1},y_{i+1}) \\ i &= 1,2,...,n (在i=1和n时只思考单边)\end{align}$$

则称$P(Y|X)$为线性链条件随机场

同学们看到这个定义,或者会有些纳闷,然而不必焦急,咱们来探讨下这个定义。图2展现了一种经典的线性链CRF的结构图,从这张结构图来了解这个定义,次要蕴含两个点:

  1. 确保输出序列$X$和输入序列$Y$是线性序列
  2. 每个标签$y_i$的产生,只与这些因素有关系:以后地位的输出$x_i$,$y_i$间接相连的两个街坊$y_{i-1}$和$y_{i+1}$,与其余的标签和输出没有关系。

这样的定义,其实帮忙咱们减小了建模CRF的代价。

<center>图 2 一种经典的线性链CRF结构图</center>

2.2 发射分数和转移分数

上边咱们探讨了线性链CRF的定义以及它的一种经典图构造,接下来咱们持续回到咱们建模的命名实体工作上来。

图2中,$x=[x_0, x_1, ... , x_i, ... , x_n]$代表输出变量,对应到咱们当前任务就是输出文本序列,$y=[y_0, y_1, ..., y_i, ..., y_n]$代表相应的标签序列,

其中,每个输出$x_i$均对应着一个标签$y_i$,这一步对应的就是发射分数,它批示了以后的输出$x_i$应该对应什么样的标签;在每个标签$y_i$之间也存在连线,它示意以后地位的标签$y_i$向下一个地位的标签${y_{i+1}}$的一种转移。举个例子,假如以后地位的标签是"B-Person",那下一个地位就很有可能是"I-Person"标签,即标签"B-Person"向"I-Person"转移的概率会比拟大。

这里咱们带出了建模CRF过程中两个重要的概念:发射分数和转移分数,下边咱们来看看他们是什么。

2.2.1 发射分数

前边咱们在第2节曾经提到过发射分数了,即BiLSTM后产生的标签向量。如果大家对这部分内容曾经很相熟,齐全能够跳过这部分。图3以矩阵的模式展现了发射分数的生成过程。

<center>图3 发射分数的矩阵计算解释</center>

当给定的文本序列$x=[x_1, x_2, x_3,..., x_n]$映射为对应词向量之后,将会失去一个shape为$[n, embedding\_size]$的词向量矩阵$embs$,其中每对应一个字词(图5样例只应用了4个词),例如$x_0$对应的词向量是$[e_{00}, e_{01}, e_{02}, e_{03}]$。

而后将$embs$传入BiLSTM后,每个词的地位都会产生一个上下文向量,所有的向量组合之后会失去一个向量矩阵$context\_vector$,其中每行代表对应单词通过BiLSTM后的上下文向量。

这里的每个地位的上下文向量能够用来领导以后地位应该输入的标签信息,但这里有个问题,这个输入向量的维度并不是标签的数量,它不能间接用来批示应该输入什么标签。个别的做法是在后边加一层线性层,将这个上下文向量的维度映射为标签的数量,这样的话就会生成前边所讲的标签向量,其中的每个元素别离对应着相应标签的分数,依据这个分数能够用来领导最终标签的输入。

具体地,线性层这里只是做了这样的一个线性变换:$y = XW+b$,显然,这里的$X$就是$context\_vector$, $y$是相应的$emission\_score$,$W和b$是线性层的可学习参数。
前边提到,$context\_vector$的shape为$[n,context\_size]$,那么线性层的$W$的shape应该是$[context\_size, tag\_size]$,通过以上公式的线性变换,就能够失去发射分数$emission\_score$,其中每个字词对应一行的标签分数(图3中只设置了三列,代表一共有3个标签),例如,$x_0$对第一个标签的分数预测为$t_{00}$,对第二个标签的分数预测为$t_{01}$,对第三个标签的分数预测为$t_{02}$,顺次类推。

2.2.2 转移分数

上面咱们来聊聊转移分数,这个转移分数示意一个标签向另一个标签转移的分数,分数越高,转移概率就越大,反之亦然。图4展现了记录转移分数的矩阵。

<center>图4 转移分数矩阵图</center>

让咱们从列到行地来看下这个转移矩阵$T$,B-Person向I-Person转移的分数为0.93,B-Person向I-Organization转移的分数为0.02,前者的分数远远大于后者。I-Person向I-Person转移的概率是0.71,I-Organization向I-Organization转移的分数是0.95,因为一个人或者组织的名字往往蕴含多个字,所以这个概率绝对是比拟高的,这其实也是很合乎咱们直观意识的。

假如咱们当初有个标签序列:B-Person, I-Person, O, O,B-Organization, I-Organization。那么这个序列的转移分数可依照如下形式计算:

$Seq_t = T_{I-Person,B-Person} + T_{O,I-Person} + T_{O,O} + T_{O,B-Organization} + T_{B-Organization, I-Organization}$

这个转移分数矩阵是CRF中的一个可学习的参数矩阵,它的存在可能帮忙咱们显示地去建模标签之间的转移关系,进步命名实体辨认的准确率。

2.3 CRF建模的损失函数

前边咱们讲到,CRF可能帮忙咱们以一种全局的形式建模,在所有可能的门路中抉择成果最优,分数最高的那条门路。那么咱们应该怎么去建模这个策略呢,上面咱们来具体谈谈。

<center> 图5 CRF解码过程图 </center>

图5展现了CRF的工作图,当初咱们有一串输出$x=[x_0, x_1, x_2, x_n]$(这里的$x$是文本串对应的发射分数,每个字词$x_i$都对应着一个发射分数向量,也就是前边提到的标签向量,该向量的维度就是标签数量),期待解码出相应的标签序列$y=[y_0, y_1,y_2, ..., y_n]$,形式化为对应的条件概率公式如下:

$$(y|x) = P(y_0,y_1,...,y_n|x_0,x_1,...,x_n)$$

在第2节咱们提到,CRF的解码策略在所有可能的门路中,找出得出概率最大,成果最优的一条门路,那这个标签序列就是模型的输入,假如标签数量是$k$,文本长度是$n$,显然会有$N=k^n$条门路,若用$S_i$代表第$i$条门路的分数,那咱们能够这样去算一个标签序列呈现的概率:

$$P(S_i)=\frac{e^{S_i}}{\sum_j^{N}{e^{S_j}}}$$

当初咱们有一条实在的门路$real$,即咱们期待CRF解码进去的序列就是这一条。那它的分数能够示意为$s_{real}$,它呈现的概率就是:

$$P(S_{real})=\frac{e^{S_{real}}}{\sum_j^{N}{e^{S_j}}}$$

所以咱们建模学习的目标就是为了一直的进步$P(S_{real})$的概率值,这就是咱们的指标函数,当指标函数越大时,它对应的损失就应该越小,所以咱们能够这样去建模它的损失函数:

$$loss=-P(S_{real})=-\frac{e^{S_{real}}}{\sum_j^{N}{e^{S_j}}}$$

为不便求解,咱们个别将这样的损失放到log空间去求解,因为log函数自身是枯燥递增的,所以它并不影响咱们去迭代优化损失函数。

$$\begin{align}loss &= -log \frac{e^{S_{real}}}{\sum_j^{N}{e^{S_j}}} \\ &= -(log(e^{S_{real}}) - log(\sum_j^{N}{e^{S_j}})) \\ &= log(\sum_j^{N}{e^{S_j}}) - log(e^{S_{real}}) \\ &= log(e^{S_1}+e^{S_2}+...+e^{S_N}) - S_{real} \\\end{align}$$

千呼万唤始进去,这就是咱们CRF建模的损失函数了。咱们整个BiLSTM+CRF建模的目标就是为了让这个函数越来越小。从这个损失函数能够看出,这个损失函数蕴含两局部:单条实在门路的分数$S_{real}$,归一化项$log(e^{S_1}+e^{S_2}+...+e^{S_N})$,行将全副的门路分数进行$log\_sum\_exp$操作,即先将每条门路分数$S_i$进行$exp(S_i)$,而后再将所有的项加起来,最初取$log$值。

讲到这里,有的同学可能会有纳闷,这里的每条门路分数应该怎么算呢?接下来,咱们就来解决这个问题。

2.4 单条门路的分数计算

在开始之前,咱们再来做一些约定,前边咱们提到了发射分数和转移分数,假如$E$代表发射分数矩阵,$T$代表转移分数矩阵,$n$代表文本序列长度,$tag\_size$代表标签的数量。另外为不便书写,咱们为每个标签编个id号(参考图5中波及到的标签),如图6所示。

<center>图6 Tag和Tag Id 对应表</center>

其中,$E$的shape为$[n, tag\_size]$,每行对应着一个文本字词的发射分数,每列代表一个标签,例如,$E_{01}$代表$x_0$取id为1的标签分数,$E_{23}$代表$x_2$取id为3的标签分数。$T$的shape为$[tag\_size, tag\_size]$,它代表了标签之间互相转移的分数,例如,$T_{03}$代表id为3的标签向id为0的标签转移分数。

每条门路的分数就是由对应的发射分数和转移分数组合而成的,对于图5标记进去的黄色门路来说,$x_0$的标签是B-Person,对应的发射分数是$E_{00}$,$x_1$的标签是I-Person,对应的发射分数是$E_{11}$,由B-Person向I-Person转移的分数是$T_{10}$,因而到这一步的分数就是:$E_{00}+T_{10}+E_{11}$。

接下来$x_2$的标签是$O$,由$x_1$的标签向I-Person向$x_2$的标签O转移的概率是$T_{41}$,因而到这一步的分数是:$E_{00}+T_{10}+E_{11}+T_{41}+E_{24}$,顺次类推,咱们能够计算残缺条门路的分数。假如第$i$个地位对应的标签为$y_i$,则整条门路的分数计算形式化公式为:

$$S_{real}=\sum_{i=0}^{n-1}{E_{i,y_i}} + \sum_{i=0}^{n-2}{T_{y_{i+1}, y_{i}}}$$

2.5 全副门路的分数计算

2.3节中的损失函数包含两项,单条实在门路分数的计算和归一化项(如上所述,全副门路分数的$log\_sum\_exp$,为不便形容,后续间接将个归一化项形容为全副门路之和)的计算。这里你或者会问,当初晓得了单条门路分数的计算形式,遍历一下所有的门路算个分数,不就能够轻松算出全副门路之和吗?是的,这在实践上是可行的。

然而,前边咱们提到这个门路的数量是个指数级别的量纲,假如我对串蕴含50个字的文本串进行实体辨认,标签的数量是31,那么这个门路的数量将是$31^{50}$条,这是真的是难以承受的一件事件,它会远远拖慢模型的训练和预测效率。

因而,咱们要换一种高效的思路,这里其实用到了一种被称为前向算法的动静布局,它能帮忙咱们将图5所有门路的和计算,拆解为每个地位的和计算,最终得出所有的门路之和。如果这是你第一次听到这个算法,那也没关系,我会通过示例的形式,为你展示这个算法的工作原理,然而在看这部分内容之前,咱们再来回顾一下咱们的计算指标,即损失函数中的第1项:

$$log(e^{S_1}+e^{S_2}+...+e^{S_N})$$

另外,为不便形容这个原理,咱们来简化下这个问题,假如咱们当初在计算图7所示的所有门路之和。

<center>图7 简化版的CRF工作图 </center>

图7中,共蕴含2个标签$Tag$ 0 和$Tag$ 1, 文本串有3个单词$x_0, x_1, x_2$。咱们再来做些约定如下:

$emission_i=[x_{i0},x_{i1}]$, 代表$x_i$地位的发射分数。

其中,$x_{i0}$代表$x_i$地位输入$Tag$ 0 标签的分数, $x_{i1}$代表$x_i$地位输入$Tag$ 1 标签的分数。

$ trans = \left[ \begin{matrix} t_{00} & t_{01}\\ t_{10} & t_{11} \end{matrix} \right] $, 代表转移矩阵。

其中,$t_{01}$代表从$Tag$ 1 转移到$Tag$ 0的分数,$t_{10}$代表从$Tag$ 0 转移到$Tag$ 1的分数,顺次类推。

$alpha_i=[s_{i0},s_{i1}]$, 其中各个数值代表到以后地位$x_i$为止,以$x_i$地位相应标签结尾的门路分数之和。

以$x_2$步为例,$alpha_2=[s_{20},s_{21}]$,其中$s_{20}$代表截止到$x_2$步骤为止,以标签$Tag$ 0 结尾所有的门路分数之和,$s_{21}$代表截止到$x_2$步骤为止,以标签$Tag$ 1结尾的所有门路分数之和。

这里比拟形象,如图7所示,参加$x_2$步的$s_{20}$分数计算的门路包含4条,即$s_{20}$是下边4条门路分数之和,顺次如下

  • $x_{00},x_{10},x_{20}$
  • $x_{00},x_{11},x_{20}$
  • $x_{01},x_{10},x_{20}$
  • $x_{01},x_{11},x_{20}$

祝贺,咱们实现了一些干燥的定义,下边咱们来看看如何计算所有门路的分数和吧,这里咱们分成3步走来解释,首先计算截止到$x_0$地位,到各个标签的分数(上边的$alpha$内容)是多少;截止到$x_1$地位,到各个标签的分数是多少;截止到$x_2$地位,到各个标签的分数是多少。


第1步,截止到$x_0$地位

以后地位$x_0$输出的发射分数为:$emission_0=[x_{00},x_{01}]$,因为这是序列的起始,显然截止到$x_0$地位有:$alpha_0=[x_{00},x_{01}]$。

截止到$x_0$这一步,将$x_0$地位的所有标签的分数累计作为所有门路的分数为:

$$total_0 = log(e^{x_{00}}+e^{x_{01}})$$


第2步,截止到$x_1$地位

以后步骤波及到$x_0$向$x_1$地位的转移,在这个过程中,$x_1$地位输出的发射分数为:$emission_1=[x_{10}, x_{11}]$, 转移概率矩阵为: $ trans = \left[ \begin{matrix} t_{00} & t_{01}\\ t_{10} & t_{11} \end{matrix} \right] $, 前一个地位$x_0$各标签的门路累计和$alpha_0=[x_{00},x_{01}]$。

接下来咱们expand一下$emission_1$ 和 $alpha_0$,力求通过矩阵计算的形式一次实现以后地位$x_1$各个标签的门路累计$alpha_1$,具体如下:

$$emission_1 = \left[ \begin{matrix} x_{10} & x_{10}\\ x_{11} & x_{11} \end{matrix} \right] $$

$$alpha_0 = \left[ \begin{matrix} x_{00} & x_{01}\\ x_{00} & x_{01} \end{matrix} \right] $$

而后咱们来计算截止到$x_1$地位,到不同标签的每条门路的分数:

$$\begin{align}scores &= alpha_0+trans+emission_1 \\ &= \left[ \begin{matrix} x_{00} & x_{01}\\ x_{00} & x_{01} \end{matrix} \right] + \left[ \begin{matrix} t_{00} & t_{01}\\ t_{10} & t_{11} \end{matrix} \right] + \left[ \begin{matrix} x_{10} & x_{10}\\ x_{11} & x_{11} \end{matrix} \right] \\ &= \left[ \begin{matrix} x_{00}+t_{00}+x_{10} & x_{01}+t_{01}+x_{10}\\ x_{00}+t_{10}+x_{11} & x_{01}+t_{11}+x_{11} \end{matrix} \right]\end{align}$$

咱们来看一条门路分数的计算,例如$ x_{00}+t_{10}+x_{11}$, 它代表在$x_0$的地位标签为$Tag$ 0,在$x_1$的地位标签为$Tag$ 1,而后通过加上$t_{10}$实现了$x_0$地位$Tag$ 0标签 向 $x_1$地位标签$Tag$ 1的转移。

从上边的后果能够看到,第1行代表向以后地位$x_1$标签$Tag$ 0的转移门路,第2行代表向以后地位$x_1$标签$Tag$ 1的转移门路。以第1行为例,将第1行的门路分数相加,就相当于到以后地位$x_1$并且以$Tag$ 0结尾的所有门路之和。

因而,这样咱们能够容易地算出以后地位$x_1$的各个标签的门路累计分数$alpha_1$:

$alpha_1 = [log(e^{x_{00}+t_{00}+x_{10}}+e^{x_{01}+t_{01}+x_{10}}), log(e^{x_{00}+t_{10}+x_{11}}+e^{x_{01}+t_{11}+x_{11}})]$

最初,咱们来算下截止到$x_1$地位,所有的门路和:

$$\begin{align}total_1 &= log(e^{alpha_1[0]} + e^{alpha_1[1]}) \\ &=log(e^{log(e^{x_{00}+t_{00}+x_{10}}+e^{x_{01}+t_{01}+x_{10}})}+e^{log(e^{x_{00}+t_{10}+x_{11}}+e^{x_{01}+t_{11}+x_{11}})}) \\ &=log(e^{x_{00}+t_{00}+x_{10}}+e^{x_{01}+t_{01}+x_{10}} + e^{x_{00}+t_{10}+x_{11}}+e^{x_{01}+t_{11}+x_{11}})\end{align}$$

再回顾一下咱们的计算指标:$log(e^{S_1}+e^{S_2}+...+e^{S_N})$,你能够看到如果图7最终只到$x_1$地位,那么上边的这个后果就是咱们相求的全副门路之和,或者说是归一化项。


第3步,截止到$x_2$地位

咱们再来看下$x_2$地位的一些输出信息,$x_2$地位输出的发射分数为:$emission_2=[x_{20}, x_{21}]$, 转移概率矩阵为: $ trans = \left[ \begin{matrix} t_{00} & t_{01}\\ t_{10} & t_{11} \end{matrix} \right] $, 前一个地位$x_1$各标签的门路累计和$alpha_1=[log(e^{x_{00}+t_{00}+x_{10}}+e^{x_{01}+t_{01}+x_{10}}), log(e^{x_{00}+t_{10}+x_{11}}+e^{x_{01}+t_{11}+x_{11}})]$。

接下来持续expand一下$emission_2$ 和 $alpha_1$,力求通过矩阵计算的形式一次实现以后地位$x_2$各个标签的门路累计$alpha_2$,具体如下:

$$emission_2 = \left[ \begin{matrix} x_{20} & x_{20}\\ x_{21} & x_{21} \end{matrix} \right] $$

$$alpha_1 = \left[ \begin{matrix} log(e^{x_{00}+t_{00}+x_{10}}+e^{x_{01}+t_{01}+x_{10}}) & log(e^{x_{00}+t_{10}+x_{11}}+e^{x_{01}+t_{11}+x_{11}}) \\ log(e^{x_{00}+t_{00}+x_{10}}+e^{x_{01}+t_{01}+x_{10}}) & log(e^{x_{00}+t_{10}+x_{11}}+e^{x_{01}+t_{11}+x_{11}}) \end{matrix} \right] $$

而后咱们来计算截止到$x_2$地位,到不同标签的每条门路的分数:

$$\begin{align}scores &= alpha_1+trans+emission_2 \\ &= \left[ \begin{matrix} log(e^{x_{00}+t_{00}+x_{10}}+e^{x_{01}+t_{01}+x_{10}}) & log(e^{x_{00}+t_{10}+x_{11}}+e^{x_{01}+t_{11}+x_{11}}) \\ log(e^{x_{00}+t_{00}+x_{10}}+e^{x_{01}+t_{01}+x_{10}}) & log(e^{x_{00}+t_{10}+x_{11}}+e^{x_{01}+t_{11}+x_{11}}) \end{matrix} \right] + \left[ \begin{matrix} t_{00} & t_{01}\\ t_{10} & t_{11} \end{matrix} \right] + \left[ \begin{matrix} x_{20} & x_{20}\\ x_{21} & x_{21} \end{matrix} \right] \\ &= \left[ \begin{matrix} log(e^{x_{00}+t_{00}+x_{10}}+e^{x_{01}+t_{01}+x_{10}})+t_{00}+x_{20} & log(e^{x_{00}+t_{10}+x_{11}}+e^{x_{01}+t_{11}+x_{11}})+t_{01}+x_{20}\\ log(e^{x_{00}+t_{00}+x_{10}}+e^{x_{01}+t_{01}+x_{10}})+t_{10}+x_{21} & log(e^{x_{00}+t_{10}+x_{11}}+e^{x_{01}+t_{11}+x_{11}})+t_{11}+x_{21} \end{matrix} \right]\end{align}$$

持续按行累加,算出到以后地位$x_2$的各个标签的门路累计分数$alpha_2$:

$$\begin{align}alpha_2 &= [log(e^{scores[0,0]} + e^{scores[0,1]}), log(e^{scores[1,0]} + e^{scores[1,1]})] \\ &=[log(e^{log(e^{x_{00}+t_{00}+x_{10}}+e^{x_{01}+t_{01}+x_{10}})+t_{00}+x_{20}} + e^{log(e^{x_{00}+t_{10}+x_{11}}+e^{x_{01}+t_{11}+x_{11}})+t_{01}+x_{20}}), log(e^{log(e^{x_{00}+t_{00}+x_{10}}+e^{x_{01}+t_{01}+x_{10}})+t_{10}+x_{21}} + e^{log(e^{x_{00}+t_{10}+x_{11}}+e^{x_{01}+t_{11}+x_{11}})+t_{11}+x_{21}})] \\ &=[log((e^{x_{00}+t_{00}+x_{10}}+e^{x_{01}+t_{01}+x_{10}})e^{t_{00}+x_{20}}+(e^{x_{00}+t_{10}+x_{11}}+e^{x_{01}+t_{11}+x_{11}})e^{t_{01}+x_{20}}), log((e^{x_{00}+t_{00}+x_{10}}+e^{x_{01}+t_{01}+x_{10}})e^{t_{10}+x_{21}}+(e^{x_{00}+t_{10}+x_{11}}+e^{x_{01}+t_{11}+x_{11}})e^{t_{11}+x_{21}})] \end{align}$$

最初,咱们来算下截止到$x_2$地位,所有的门路和:

$$\begin{align}total_2 &= log(e^{alpha_2[0]} + e^{alpha_2[1]}) \\ &=log(e^{log((e^{x_{00}+t_{00}+x_{10}}+e^{x_{01}+t_{01}+x_{10}})e^{t_{00}+x_{20}}+(e^{x_{00}+t_{10}+x_{11}}+e^{x_{01}+t_{11}+x_{11}})e^{t_{01}+x_{20}})}+e^{log((e^{x_{00}+t_{00}+x_{10}}+e^{x_{01}+t_{01}+x_{10}})e^{t_{10}+x_{21}}+(e^{x_{00}+t_{10}+x_{11}}+e^{x_{01}+t_{11}+x_{11}})e^{t_{11}+x_{21}})}) \\ &=log((e^{x_{00}+t_{00}+x_{10}}+e^{x_{01}+t_{01}+x_{10}})e^{t_{00}+x_{20}}+(e^{x_{00}+t_{10}+x_{11}}+e^{x_{01}+t_{11}+x_{11}})e^{t_{01}+x_{20}}+ (e^{x_{00}+t_{00}+x_{10}}+e^{x_{01}+t_{01}+x_{10}})e^{t_{10}+x_{21}}+(e^{x_{00}+t_{10}+x_{11}}+e^{x_{01}+t_{11}+x_{11}})e^{t_{11}+x_{21}} ) \\ &= log(e^{x_{00}+t_{00}+x_{10}+t_{00}+x_{20}} + e^{x_{01}+t_{01}+x_{10}+t_{00}+x_{20}} + e^{x_{00}+t_{10}+x_{11}+t_{01}+x_{20}} + e^{x_{01}+t_{11}+x_{11}+t_{01}+x_{20}} + e^{x_{00}+t_{00}+x_{10}+t_{10}+x_{21}} + e^{x_{01}+t_{01}+x_{10}+t_{10}+x_{21}} + e^{x_{00}+t_{10}+x_{11}+t_{11}+x_{21}} + e^{x_{01}+t_{11}+x_{11}+t_{11}+x_{21}})\end{align}$$

显然,这个式子的后果就是最终咱们想要的计算指标,损失函数中的第1项,共计蕴含8条门路的分数。

2.6 CRF的Viterbi解码

在前边几节,咱们讲过了CRF的损失函数、单条门路分数的计算、全副门路分数的计算,依据这些内容齐全能够进行BiLSTM+CRF的训练。然而,咱们如何应用CRF从全副的门路中解码出得分最高的那条门路呢?

同2.5节所述,计算全副门路分数后,抉择得分最大的那条门路必定是不行的。其实这里是应用了一种被称为Viterbi的算法,它的思维和2.5节介绍的前向算法有些相似,将从全副门路中查找最优门路的过程,拆解为抉择每个地位累计的最大门路。如果这是你第一次接触Viterbi算法,也不必放心,本节仍然会通过示例的形式展示这个算法原理。

咱们仍然以图7为例,解码这全副门路中分数最大的这条(图中橙色显示的这条门路)。在正式介绍之前,咱们仍然做些约定如下:

$emission_i=[x_{i0},x_{i1}]$, 代表$x_i$地位的发射分数。

其中,$x_{i0}$代表$x_i$地位输入$Tag$ 0 标签的分数, $x_{i1}$代表$x_i$地位输入$Tag$ 1 标签的分数。

$ trans = \left[ \begin{matrix} t_{00} & t_{01}\\ t_{10} & t_{11} \end{matrix} \right] $, 代表转移矩阵。

其中,$t_{01}$代表从$Tag$ 1 转移到$Tag$ 0的分数,$t_{10}$代表从$Tag$ 0 转移到$Tag$ 1的分数,顺次类推。

$alpha_i=[s_{i0},s_{i1}]$, 其中各个数值代表到以后地位$x_i$为止,以以后地位$x_i$相应标签结尾的门路中,获得最大分数的门路得分。

以$x_2$地位为例,$alpha_2=[s_{20},s_{21}]$,其中$s_{20}$代表截止到$x_2$步骤为止,以标签$Tag$ 0 结尾所有的门路中得分最大的门路分数,$s_{21}$代表截止到$x_2$步骤为止,以标签$Tag$ 1结尾的所有门路中得分最大的门路分数。

这里比拟形象,如图7所示,参加$x_2$步的$s_{20}$分数计算的门路包含4条,$s_{20}$是这4条门路中得分最大这一条对应的分数,即下边这一条门路:$x_{00},x_{11},x_{20}$。

$beta_i = [p_{i0},p_{i1}]$,其中各个数值代表到以后地位$x_i$为止,以以后地位$x_i$相应标签结尾的门路中,分数最大的那一条门路在前一个地位$x_{i-1}$的标签索引(每个标签对应的id号)。

以$x_2$地位为例,$beta_2 = [p_{20},p_{21}]$,其中$p_{20}$代表代表截止到$x_2$步骤为止,以标签$Tag$ 0 结尾所有的门路中得分最大的那条门路在$x_{i-1}$地位的标签索引,同理$p_{21}$代表截止到$x_2$步骤为止,以标签$Tag$ 1结尾的最大门路在$x_{i-1}$地位的标签索引。

同样,如图7所示,在$x_2$地位,到标签$Tag$ 0的所有门路中,分数最大的门路是:$x_{00},x_{11},x_{20}$,因为前一个地位$x_{i-1}$的标签是$Tag$ 1,因而$p_{20}=1$。

祝贺,咱们又一次实现了这些干燥的定义,下边咱们来看看如何抉择所有门路中得分最大的这一条吧,这里咱们同样分成3步走来解释,首先计算截止到$x_0$地位,到各个标签的最大得分(上边的$alpha$内容)是多少;截止到$x_1$地位,到各个标签的最大得分是多少;截止到$x_2$地位,到各个标签的最大得分是多少。


第1步,截止到$x_0$地位

以后地位$x_0$输出的发射分数为:$emission_0=[x_{00},x_{01}]$,因为这是序列的起始,显然截止到$x_0$地位有:$alpha_0=[x_{00},x_{01}]$

另外因为起始地位前边没有门路,这里咱们应用-1来初始化:$beta_0=[-1,-1]$


第2步,截止到$x_1$地位

以后步骤波及到$x_0$向$x_1$地位的转移,在这个过程中,$x_1$地位输出的发射分数为:$emission_1=[x_{10}, x_{11}]$, 转移概率矩阵为: $ trans = \left[ \begin{matrix} t_{00} & t_{01}\\ t_{10} & t_{11} \end{matrix} \right] $, 到前一个地位$x_0$各标签的最大门路得分为$alpha_0=[x_{00},x_{01}]$。

接下来依照2.5节同样的形式,咱们expand一下$emission_1$ 和 $alpha_0$,力求通过矩阵计算的形式一次实现到以后地位$x_1$各个标签的所有门路中得分最大的门路分数$alpha_1$,具体如下:

$$emission_1 = \left[ \begin{matrix} x_{10} & x_{10}\\ x_{11} & x_{11} \end{matrix} \right] $$

$$alpha_0 = \left[ \begin{matrix} x_{00} & x_{01}\\ x_{00} & x_{01} \end{matrix} \right] $$

而后咱们来计算截止到$x_1$地位,到不同标签的每条门路的分数:

$$\begin{align}scores &= alpha_0+trans+emission_1 \\ &= \left[ \begin{matrix} x_{00} & x_{01}\\ x_{00} & x_{01} \end{matrix} \right] + \left[ \begin{matrix} t_{00} & t_{01}\\ t_{10} & t_{11} \end{matrix} \right] + \left[ \begin{matrix} x_{10} & x_{10}\\ x_{11} & x_{11} \end{matrix} \right] \\ &= \left[ \begin{matrix} x_{00}+t_{00}+x_{10} & x_{01}+t_{01}+x_{10}\\ x_{00}+t_{10}+x_{11} & x_{01}+t_{11}+x_{11} \end{matrix} \right]\end{align}$$

同样地,以第1行为例,第1行代表到以后地位$x_1$标签$Tag$ 0结尾的所有门路的得分,那么第1行中分数最大这一条门路,就是到以后地位$x_1$并且以$Tag$ 0结尾的所有门路中得分最大的门路。

因而,这样咱们能够容易地算出到以后地位$x_1$的各个标签的最大门路分数$alpha_1$:

$$\begin{align}alpha_1 &= [max(scores[0,0], scores[0,1]), max(scores[1,0], scores[1,1])] \\ &= [max(x_{00}+t_{00}+x_{10}, x_{01}+t_{01}+x_{10}), max(x_{00}+t_{10}+x_{11}, x_{01}+t_{11}+x_{11})]\end{align}$$

显然从上边后果中,咱们可能剖析出到$x_1$地位各个标签的最大门路,例如到$Tag $ 0的门路有$x_{00}+t_{00}+x_{10}$ 和 $ x_{01}+t_{01}+x_{10}$, 其中较大者就是咱们想要的到$x_1$地位 $Tag $ 0的最大门路。

这里无妨咱们做个假如:

  • $x_{00}+t_{00}+x_{10} < x_{01}+t_{01}+x_{10}$
  • $x_{00}+t_{10}+x_{11} > x_{01}+t_{11}+x_{11}$

因而,咱们能够取得$x_1$地位的索引$beta_1=[1,0]$,这代表在$x_1$地位,到标签$Tag$ 0的最大门路的前一个地位$x_{i-1}$的标签是$Tag$ 1, 到标签$Tag$ 1的最大门路的前一个地位$x_{i-1}$的标签是$Tag$ 0。


第3步,截止到$x_2$地位

咱们再来看下$x_2$地位的一些输出信息,$x_2$地位输出的发射分数为:$emission_2=[x_{20}, x_{21}]$, 转移概率矩阵为: $ trans = \left[ \begin{matrix} t_{00} & t_{01}\\ t_{10} & t_{11} \end{matrix} \right] $, 前一个地位$x_1$各标签的门路累计和:$alpha_1=[max(x_{00}+t_{00}+x_{10}, x_{01}+t_{01}+x_{10}), max(x_{00}+t_{10}+x_{11}, x_{01}+t_{11}+x_{11})]$。

接下来持续expand一下$emission_2$ 和 $alpha_1$,力求通过矩阵计算的形式一次实现以后地位$x_2$各个标签的门路累计$alpha_2$,具体如下:

$$emission_2 = \left[ \begin{matrix} x_{20} & x_{20}\\ x_{21} & x_{21} \end{matrix} \right] $$

$$alpha_1 = \left[ \begin{matrix} max(x_{00}+t_{00}+x_{10}, x_{01}+t_{01}+x_{10}) & max(x_{00}+t_{10}+x_{11}, x_{01}+t_{11}+x_{11}) \\ max(x_{00}+t_{00}+x_{10}, x_{01}+t_{01}+x_{10}) & max(x_{00}+t_{10}+x_{11}, x_{01}+t_{11}+x_{11}) \end{matrix} \right] $$

而后咱们来计算截止到$x_2$地位,到不同标签的每条门路的分数:

$$\begin{align}scores &= alpha_1+trans+emission_2 \\ &= \left[ \begin{matrix} max(x_{00}+t_{00}+x_{10}, x_{01}+t_{01}+x_{10}) & max(x_{00}+t_{10}+x_{11}, x_{01}+t_{11}+x_{11}) \\ max(x_{00}+t_{00}+x_{10}, x_{01}+t_{01}+x_{10}) & max(x_{00}+t_{10}+x_{11}, x_{01}+t_{11}+x_{11}) \end{matrix} \right] + \left[ \begin{matrix} t_{00} & t_{01}\\ t_{10} & t_{11} \end{matrix} \right] + \left[ \begin{matrix} x_{20} & x_{20}\\ x_{21} & x_{21} \end{matrix} \right] \\ &= \left[ \begin{matrix} max(x_{00}+t_{00}+x_{10}, x_{01}+t_{01}+x_{10}) +t_{00}+x_{20} & max(x_{00}+t_{10}+x_{11}, x_{01}+t_{11}+x_{11})+t_{01}+x_{20}\\ max(x_{00}+t_{00}+x_{10}, x_{01}+t_{01}+x_{10})+t_{10}+x_{21} & max(x_{00}+t_{10}+x_{11}, x_{01}+t_{11}+x_{11}) +t_{11}+x_{21} \end{matrix} \right]\end{align}$$

因而,这样咱们能够容易地算出到以后地位$x_2$的各个标签的最大门路分数$alpha_2$:

$$\begin{align}alpha_1 &= [max(scores[0,0], scores[0,1]), max(scores[1,0], scores[1,1])] \\ &= [max(max(x_{00}+t_{00}+x_{10}, x_{01}+t_{01}+x_{10}) +t_{00}+x_{20}, max(x_{00}+t_{10}+x_{11}, x_{01}+t_{11}+x_{11})+t_{01}+x_{20}), max(max(x_{00}+t_{00}+x_{10}, x_{01}+t_{01}+x_{10})+t_{10}+x_{21}, max(x_{00}+t_{10}+x_{11}, x_{01}+t_{11}+x_{11}) +t_{11}+x_{21} )]\end{align}$$

这里我无妨再假如:

  • $max(x_{00}+t_{00}+x_{10}, x_{01}+t_{01}+x_{10}) +t_{00}+x_{20} > max(x_{00}+t_{10}+x_{11}, x_{01}+t_{11}+x_{11})+t_{01}+x_{20})$
  • $max(x_{00}+t_{00}+x_{10}, x_{01}+t_{01}+x_{10})+t_{10}+x_{21} < max(x_{00}+t_{10}+x_{11}, x_{01}+t_{11}+x_{11}) +t_{11}+x_{21} )$

上一步咱们曾假如:

  • $x_{00}+t_{00}+x_{10} < x_{01}+t_{01}+x_{10}$
  • $x_{00}+t_{10}+x_{11} > x_{01}+t_{11}+x_{11}$

因而有:

  • $x_{01}+t_{01}+x_{10}+t_{01}+x_{10} < x_{00}+t_{10}+x_{11}+t_{01}+x_{20}$
  • $x_{01}+t_{01}+x_{10}+t_{10}+x_{21} > x_{00}+t_{10}+x_{11}+t_{11}+x_{21}$

所以$x_2$地位的索引:$beta_2 = [1,0]$

此时:$alpha_1=[x_{00}+t_{10}+x_{11}+t_{01}+x_{20}, x_{01}+t_{01}+x_{10}+t_{10}+x_{21} ]$

图7中橘色门路分数最高,其对应的是$x_{00}+t_{10}+x_{11}+t_{01}+x_{20}$,因而再假如:

$x_{00}+t_{10}+x_{11}+t_{01}+x_{20} > x_{01}+t_{01}+x_{10}+t_{10}+x_{21}$

这其实代表在$x_2$地位的所有标签对应的最大门路中,$Tag$ 0 对应的那条门路是最大的,这条门路也是全局所有门路中分数最大的那一条,是咱们要解析出的冀望门路。

第4步,开始解码标签序列

到当初地位,咱们通过$beta_0$记录下了最大门路上的节点,接下来咱们能够通过回溯来找出全局所有门路中的最大门路。

首先,在$x_2$地位所有标签对应的最大门路中,$Tag$ 0 对应的门路分数最大。因而$x_2$地位对应的标签就是$Tag$ 0。

而后,$beta_2 = [1,0]$,因而$x_2$地位解析出的标签$Tag$ 0,对应的上一地位$x_1$的标签是$Tag$ 1。

接下来,$beta_1=[1,0]$,因而$x_1$地位解析出的标签$Tag$ 1,对应的上一地位$x_0$的标签是$Tag$ 0。

最初,$beta_0=[-1,-1]$,当解析到这一步的时候,反回的标签必定是-1,因而这个回溯过程也就完结了。

当回溯实现之后,将解析出的后果倒序排序,就是咱们冀望的最大门路。以图7为例,该门路就是$Tag$ 0 -->$Tag$ 1 -->$Tag$ 0。

祝贺,看到这里,置信你曾经懂得了CRF的外围原理。江湖虽路远,但总会再见,如对笔者的文章称心,还请多多反对。

  • Reference
    [1] 邱锡鹏. 神经网络与深度学习[M]. 北京:机械工业出版社,2021.
    [2] 吴飞. 人工智能导论:模型与算法[M]. 北京:高等教育出版社,2020.
    [3] CRF Layer on the Top of BiLSTM

    3. PLM Fine-tuning预训练的模型

3.1 目前前沿办法

  1. Transformer-CRF模型:基于Transformers的神经网络构造和条件随机场模型的联结训练,通过提取输出的上下文信息、全局概率建模,联合现有的BERT和RoBERTa预训练模型,在多语种的命名实体辨认工作中有很好的体现。
  2. Pre-trained Language Model Fine-tuning (PLM Fine-tuning):该办法是基于预训练模型和微调技术的思维,利用预训练的模型(如BERT、RoBERTa等)作为初始参数,通过在命名实体辨认的数据集上进行微调,来晋升NER的性能。它能够在大量标注数据上疾速训练,并在各种语言和畛域中展现出低劣的泛化能力。
  3. Neural Architecture Search (NAS):利用神经网络搜索算法和强化学习,生成NN构造,并进行自动化架构搜寻。NAS能够使模型具备更好的鲁棒性和泛化性能,并在不应用任何人工特色编码的状况下进步命名实体辨认的准确性。

这些算法罕用于理论利用中,并获得了良好的成果。当然,还有很多其余的NER算法,如模板匹配、CRF、SVM等,每种算法都有本人的优缺点,须要依据具体场景进行抉择和组合。

3.2 小样本下NER

针对小样本问题,能够应用迁徙学习或元学习等技术来解决。迁徙学习是指将事后训练好的模型利用于新工作中,从而将新工作的训练工夫缩短,但前提是预训练模型和待解决的工作有肯定的相关性。元学习则是一种针对小样本学习问题的办法,它可能通过学习如何学习来进步模型在大量样本的状况下的泛化能力。

针对小样本NER问题,上面介绍两种罕用的小样本模型:

  1. Few-shot learning模型:该模型是一种基于元学习的模型,它能够用较少的数据进行训练,同时在新畛域中进行良好的泛化,具备很强的适应性。Few-shot learning的次要思维是利用大量标注数据来训练一个编码器,通过训练来学习具备较好泛化性能的模型。在NER工作中,通过将大量文本做为一个工作,来进行训练,该模型能够在稀缺标注数据的状况下,辨认新类别的命名实体。
  2. Adaptive Span模型:该模型能够自适应地在输出序列中发现实体边界,从而进一步提高命名实体辨认的性能。它能够利用现有的NER模型和示意学习办法,在大量数据状况下疾速训练,并在大规模未标记的数据上体现优良。Adaptive Span模型实现了端到端的自适应边界预测,它通过动静地抉择每个输出序列中的子区间,来预测给定实体类别的标签。

更多文章请关注公重号:汀丶人工智能

3.3 举荐!实体、关系、属性抽取实战我的项目合集(含智能标注)

实体、关系、属性抽取实战我的项目合集(含智能标注)