1.LSTM+CRF概述

对于命名实体识别来讲,目前比较流行的方法是基于神经网络,例如,论文[1]提出了基于BiLSTM-CRF的命名实体识别模型,该模型采用word embedding和character embedding(在英文中,word embedding对应于单词嵌入式表达,character embedding对应于字母嵌入式表达;在中文中,word embedding对应于词嵌入式表达,character embedding对应于字嵌入式表达;接下来的示例中我们都假设是英文的场景),我将用该模型作为示例来解释CRF层的工作原理。

1.1 参数定义

假设,我们的数据集中有两种实体类型:人名和机构名,因此,在我们的数据集中有5种实体标签:

  • B-Person
  • I- Person
  • B-Organization
  • I-Organization
  • O

假设CRF pytorch 参数越界 pytorch lstm crf_CRF pytorch 参数越界

1.2 BiLSTM-CRF模型

接下来,简明介绍一下该模型。
示意图如下所示:

  • 首先,句子CRF pytorch 参数越界 pytorch lstm crf_CRF pytorch 参数越界_02
  • 其次,BiLSTM-CRF模型的的输入是上述的embeddings,输出是该句子CRF pytorch 参数越界 pytorch lstm crf_嵌入式_03

从上图可以看出,BiLSTM层的输出是每个标签的得分,如单词CRF pytorch 参数越界 pytorch lstm crf_约束条件_04

CRF pytorch 参数越界 pytorch lstm crf_损失函数_05

1.3 如果没有CRF层将如何

根据上文,能够发现,如果没有CRF层,即我们用下图所示训练BiLSTM命名实体识别模型:

 

CRF pytorch 参数越界 pytorch lstm crf_约束条件_06

因为BiLSTM针对每个单词的输出是标签得分,对于每个单词,我们可以选择最高得分的标签作为预测结果。
例如,对于CRF pytorch 参数越界 pytorch lstm crf_嵌入式_07CRF pytorch 参数越界 pytorch lstm crf_损失函数_08

CRF pytorch 参数越界 pytorch lstm crf_约束条件_09

 

显然,输出标签“I-Organization I-Person” 和 “B-Organization I-Person”是不对的。

1.4 CRF能够从训练数据中学习到约束条件

CRF层可以对最终的约束标签添加一些约束条件,从而保证预测标签的有效性。而这些约束条件是CRF层自动从训练数据中学到。
约束可能是:

  • 一句话中第一个单词的标签应该是“B-“ or “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”这种模式;

有了这些约束条件,无效的预测标签序列将急剧减少。

2.CRF层

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

2.1 发射得分

第一个得分为发射得分,该得分可以从BiLSTM层获得。如图2.1所示,CRF pytorch 参数越界 pytorch lstm crf_嵌入式_10

 

为了后续叙述方便,我们将给每个标签一个索引,如下表所示:

Label

Index

B-Person

0

I-Person

1

B-Organization

2

I-Organization

3

O

4

我们采用xi,yjCRF pytorch 参数越界 pytorch lstm crf_嵌入式_11

CRF pytorch 参数越界 pytorch lstm crf_嵌入式_12

2.2 转移得分

我们采用xi,yjCRF pytorch 参数越界 pytorch lstm crf_嵌入式_13

为了使转移得分矩阵的鲁棒性更好,我们将额外再加两个标签:START和END,START表示一句话的开始,注意这不是指该句话的第一个单词,START后才是第一个单词,同样的,END代表着这句话的结束。

下表就是一个转移得分矩阵的示例,该示例包含了START和END标签。

 

START

B-Person

I-Person

B-Organization

I-Organization

O

END

START

0

0.8

0.007

0.7

0.0008

0.9

0.08

B-Person

0

0.6

0.9

0.2

0.0006

0.6

0.009

I-Person

-1

0.5

0.53

0.55

0.0003

0.85

0.008

B-Organization

0.9

0.5

0.0003

0.25

0.8

0.77

0.006

I-Organization

-0.9

0.45

0.007

0.7

0.65

0.76

0.2

O

0

0.65

0.0007

0.7

0.0008

0.9

0.08

END

0

0

0

0

0

0

0

如上表所示,我们能够发现转移矩阵已经学习到了某些有用的约束条件。

  • 句子中第一个单词的标签应该是以“B-”或者"O"开头,而不能以"I-"开头(转移得分中,从START到I-Person 和 I-Organization的得分都很低);
  • 模式“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” (该性质在转移得分矩阵中的表现是,得分CRF pytorch 参数越界 pytorch lstm crf_嵌入式_14

现在,你可能比较关心的问题是:怎么得到该转移矩阵?
其实,该矩阵是BiLSTM-CRF模型的一个参数,在训练模型之前,可以随机初始化该转移得分矩阵,在训练过程中,这个矩阵中的所有随机得分将得到更新,换而言之,CRF层可以自己学习这些约束条件,而无需人为构建该矩阵。随着不断的训练,这些得分会越来越合理。

3.CRF的损失函数

假设我们的标签一共有tag_size个,那么BiLSTM的输出维度就是tag_size,表示的是每个词CRF pytorch 参数越界 pytorch lstm crf_嵌入式_15

CRF pytorch 参数越界 pytorch lstm crf_损失函数_16

 

利用softmax函数,我们为每一个正确的tag序列y定义一个概率值

CRF pytorch 参数越界 pytorch lstm crf_嵌入式_17

在训练中,我们的目标就是最大化概率p(y│X) ,怎么最大化呢,用对数似然(因为p(y│X)中存在指数和除法,对数似然可以化简这些运算)
对数似然形式如下:

CRF pytorch 参数越界 pytorch lstm crf_约束条件_18

 

所以我们将损失函数Loss定义为-log(p(y|X)),就可以利用梯度下降法来进行网络的学习了。

CRF pytorch 参数越界 pytorch lstm crf_CRF pytorch 参数越界_19