源文地址:https://createmomo.github.io/2017/12/06/CRF-Layer-on-the-Top-of-BiLSTM-7/
3 链实现
在本节中,将解释代码结构。此外,还将给出实现CRF损失层的一个重要技巧。最后,Chainer(2.0版)实现源代码将在下一篇文章中发布。
3.1 整体结构
如您所见,代码主要包括三个部分:初始化、损失计算 和 对句子的预测标签。(完整的代码将在下一篇文章中发布)
3.2添加两个额外的标签(START 和 END)
如2.2所述,在转移分数矩阵中,我们添加了START 和 END 两个标签。当我们计算某个句子的损失时,这将影响转移分数矩阵的初始化和发射分数矩阵的值.
[example]
假设在我们的数据集中,我们只有一种类型的命名实体PERSON,因此我们实际上有三个标签(不包括START 和 END 两个标签):B-PERSON、I-PERSON和O。
转移分数矩阵
在添加了两个额外的标签(START 和END)之后,当我们在init方法中初始化转移分数时,我们可以这样做:
“value”的形状是(n_label + 2, n_label + 2)。 2是START 和 END的数量。另外,“value”的值是随机生成的。
发射分数矩阵
你应该知道,2.1中描述,BiLSTM层的输出是对一个句子的发射分数。例如,我们的句子有3个单词,BiLSTM的输出应该是这样的:
Word\Label | B-Person | I-Person | O |
---|---|---|---|
w0 | 0.1 | 0.2 | 0.65 |
w1 | 0.33 | 0.18 | 0.99 |
w2 | 0.87 | 0.66 | 0.53 |
添加额外的 START 和END 标签后,发射分数矩阵是:
Word\Label | B-Person | I-Person | O | START | END |
---|---|---|---|---|---|
start | -1000 | -1000 | -1000 | 0 | -1000 |
w0 | 0.1 | 0.2 | 0.65 | -1000 | -1000 |
w1 | 0.33 | 0.18 | 0.99 | -1000 | -1000 |
w2 | 0.87 | 0.66 | 0.53 | -1000 | -1000 |
end | -1000 | -1000 | -1000 | -1000 | 0 |
如上表所示,我们通过添加两个单词(start和end)及其对应的标签(start和end)扩展了发射分数矩阵。BiLSTM层的输出不包括新增词的发射分数,但是我们可以手动指定这些分数(如:xstart,START = 0 和 xstart,theOtherLabels=−1000)。单词“start”上的其他标签的发射分数应该是一个小的值(例如-1000)。如果你想再设置一个小的值,这是完全可以的,不会影响我们模型的性能。
3.3 更新的总体结构
基于上面的解释,这里有一份更详细的伪代码:
下一篇
下一篇文章将是最后一篇。在下一节中,将发布使用Chainer 2.0实现的CRF层,并给出详细的注释。更重要的是,它也将在GitHub上发布。
参考文献
[1] Lample, G., Ballesteros, M., Subramanian, S., Kawakami, K. and Dyer, C., 2016. Neural architectures for named entity recognition. arXiv preprint arXiv:1603.01360. https://arxiv.org/abs/1603.01360