Pytorch学习笔记13----LSTM+CRF模型的CRF层原理与代码理解
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
假设x是一个句子,该句子由5个单词组成:w0,w1,w2,w3,w4,而且在句子x中,[w0,w1]组成一个人名,[w2,w3]为一个机构名,其他单词标签都是"O"。
1.2 BiLSTM-CRF模型
接下来,简明介绍一下该模型。
示意图如下所示:
- 首先,句子x中的每个单词表达成一个向量,该向量包含了上述的word embedding和character embedding,其中character embedding随机初始化,word embedding通常采用预训练模型初始化。所有的embeddings 将在训练过程中进行微调。
- 其次,BiLSTM-CRF模型的的输入是上述的embeddings,输出是该句子xxx中每个单词的预测标签。
从上图可以看出,BiLSTM层的输出是每个标签的得分,如单词w0,BiLSTM的输出为1.5(B-Person),0.9(I-Person),0.1(B-Organization), 0.08 (I-Organization) and 0.05 (O),
这些得分就是CRF层的输入。
将BiLSTM层预测的得分喂进CRF层,具有最高得分的标签序列将是模型预测的最好结果。
1.3 如果没有CRF层将如何
根据上文,能够发现,如果没有CRF层,即我们用下图所示训练BiLSTM命名实体识别模型:
因为BiLSTM针对每个单词的输出是标签得分,对于每个单词,我们可以选择最高得分的标签作为预测结果。
例如,对于w0,“B-Person"得分最高(1.5),因此我们可以选择“B-Person”最为其预测标签;同样的,w1的标签为"I-Person”,w2w_2w2的为"O", w3w_3w3的标签为"B-Organization",w4w_4w4的标签为"O"。
按照上述方法,对于x虽然我们得到了正确的标签,但是大多数情况下是不能获得正确标签的,例如下图的例子:
显然,输出标签“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所示,w0标记为B-Person的得分是1.5。
为了后续叙述方便,我们将给每个标签一个索引,如下表所示:
Label | Index |
---|---|
B-Person | 0 |
I-Person | 1 |
B-Organization | 2 |
I-Organization | 3 |
O | 4 |
我们采用xi,yj来表达发射矩阵,其中i表示第i单词,yj表示标签索引。例如,根据图2.1,
该表达式的意思是将w1w_1w1标记为 B-Organization的概率为0.1。
2.2 转移得分
我们采用xi,yj表示转移得分,例如,tB−Person,I−Person=0.9t_{B-Person,I-Person}=0.9tB−Person,I−Person=0.9表示标签B-Person转移到I-Person的得分为0.9,因此,我们将获得一个转移得分矩阵,该矩阵存储着所有标签相互转移之间的得分。
为了使转移得分矩阵的鲁棒性更好,我们将额外再加两个标签: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” (该性质在转移得分矩阵中的表现是,得分tO,I−Persont_{O,I-Person}tO,I−Person是很低的。)
- …
现在,你可能比较关心的问题是:怎么得到该转移矩阵?
其实,该矩阵是BiLSTM-CRF模型的一个参数,在训练模型之前,可以随机初始化该转移得分矩阵,在训练过程中,这个矩阵中的所有随机得分将得到更新,换而言之,CRF层可以自己学习这些约束条件,而无需人为构建该矩阵。随着不断的训练,这些得分会越来越合理。
3.CRF的损失函数
假设我们的标签一共有tag_size个,那么BiLSTM的输出维度就是tag_size,表示的是每个词wi映射到tag的发射概率值(feats),设BiLSTM的输出矩阵为P,其中Pi,j代表词wi映射到tag_j的非归一化概率。对于CRF来说,我们假定存在一个转移矩阵A,则A_{i,j}代表代表代表tag_i转移到转移到转移到tag_j的转移概率。
对于输入序列X对应的输出tagtagtag序列y,定义分数为:
利用softmax函数,我们为每一个正确的tag序列y定义一个概率值
在训练中,我们的目标就是最大化概率p(y│X) ,怎么最大化呢,用对数似然(因为p(y│X)中存在指数和除法,对数似然可以化简这些运算)
对数似然形式如下:
所以我们将损失函数Loss定义为-log(p(y|X)),就可以利用梯度下降法来进行网络的学习了。
参考博客:
https://blog.csdn.net/Suan2014/article/details/89419283
https://www.cnblogs.com/Nobody0426/p/10712835.html(损失函数讲解的好)
https://blog.csdn.net/qq_39526294/article/details/104055944(实例不错)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步