Fork me on GitHub

BiLSTM 上的 CRF,用命名实体识别任务来解释 CRF(2)损失函数

英文原文
翻译地址

回顾

前一节中,我们知道 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。

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

我们用 {X_{iy}}_j。来表示 emission 分数。i 是 word 的索引,y_j 是 label 的索引。如图 2.1 所示,x_{i=1,y_j=2} = x_{w_1} = 0.1, =1,即 w1 作为 B-Organization 的得分为 0.1。

2.2 Transition 得分

我们使用 t_{y_iy_j} 来表示 transition 分数。例如,t_{B - Person,I-person} = 0.9 表示标签的 transition, B-Persion -> I - Person 得分为 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”(同样t_{O,I-Person}的分数非常小)

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

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

2.3 CRF 损失函数

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

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

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

    1. START B-Person B-Person B-Person B-Person B-Person END
    1. 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

假设每条可能的路径都有一个分数 P_i,并且总共有 N 条可能的路径,所有路径的总分数是 P_total = P_1 + P_2 + ... + P_N = e^{S_1} + e^{S_2} + ... + e^{S_N}。(在第 2.4 节中,我们将解释如何计算 S_i 你也可以把它当作这条路径的分数。)

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

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

LossFunction = \frac{P_{RealPath}}{P_1 + P_2 + ... + P_N}

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

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

2.4 实际路径得分

在 2.3 节中,我们假设每条可能的路径都有一个得分 P_i,并且有 N 条可能的路径,所有路径的总得分为 P_total = P_1 + P_2 + ... + P_N = e^{S_1} + e^{S_2} + ... + e^{S_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”。e^{S_i} 是第 i 条路径的得分。

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

计算实际路径分数 e^{S_i} 非常简单。

这里我们主要关注的是 S_i 的计算。

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

  • 我们有一个 5 个单词的句子,w1,w2,w3,w4, w4,w5
  • 我们增加了两个额外的单词来表示一个句子的开始和结束,w0,w6
  • S_i 由两部分组成:S_i = EmissionScore + TransitionScore
    Emission 得分
    EmissionScore = x_{0,START} + x_{1,B-Person} + x_{2,I-Person} + x_{3,O} + x_{4,B-Organization} + x_{5,O} + x_{6, END}
  • x_{index,label} 是第 index 个单词被 label 标记的分数
  • 这些得分 x_{1,B-Person} ; x_{2,I-Person} ; x_{3,O} ; x_{4,B-Organization} ; x_{5,O} 来自之前的 BiLSTM 输出。
  • 对于 x_{0,START}x_{6, END} 我们可以把它们设为 0。

Transition 得分

TransitionScore = t_{START -> B-Person} + t_{B - Person -> I-Person} + t_{I-Person ->O} +t_{O->B-Orgnization} + t_{B-Orgnization ->O} + t_{O->END}

  • t_{label1 -> label2} 是从 label1 到 label2 的 transition 分数
  • 这些分数来自 CRF 层。换句话说,这些 transition 分数实际上是 CRF 层的参数。

综上所述,现在我们可以计算出 S_i 以及路径得分 e^{S_i}

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

2.5 所有可能的路径的得分

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

在上一节中,我们学习了如何计算一个路径(即 e^{S_i})的标签路径得分。到目前为止,我们还有一个需要解决的问题,就是如何得到所有路径的总分(P_total = P_1 + P_2 + ... + P_N = e^{S_1} + e^{S_2} + ... + e^{S_N})。

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

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

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

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

LossFunction = \frac{P_{RealPath}}{P_1 + P_2 + ... + P_N}

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

logLossFunction =log \frac{P_{RealPath}}{P_1 + P_2 + ... + P_N}

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

logLossFunction =-log \frac{P_{RealPath}}{P_1 + P_2 + ... + P_N}=-log \frac{e^{S_{RealPath}}}{e^{S_1} + e^{S_2} + ... + e^{S_N}} =-(log(e^{S_{RealPath}})-log(e^{S_1} + e^{S_2} + ... + e^{S_N})) =-(S_{RealPath} -log(e^{S_1} + e^{S_2} + ... + e^{S_N})) =-(\sum \limits_{i=1} ^{N} x_{iy_i} + \sum \limits_{i=1} ^{N-1} t_{y_i y_{i+1}}-log(e^{S_1} + e^{S_2} + ... + e^{S_N}))

在上一节中,我们已经知道如何计算实际路径得分,现在我们需要找到一个有效的解决方案来计算 log(e^{S_1} + e^{S_2} + ... + e^{S_N})
为了简化,我们假设我们从这个句子中训练我们的模型,它的长度只有 3:

x=[w_0,w_1,w_2]

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

LabelSet={l1,l2}

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

x_{ij} 表示 w_i 被标记为 l_j 的得分。
此外,Transition 分数来自 CRF 层:
![1585055587948](CRF Layer on the Top of BiLSTM - 2.assets/1585055587948.png)
t_ij 是从标签 i 到标签 j 的 transition 得分。
步骤 3: 开始战斗(准备好纸笔)

记住:我们的目标是 log(e^{S_1} + e^{S_2} + ... + e^{S_N})


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

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


image.png
image.png
image.png

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

恭喜

我们达到了目标,log(e^{S_1} + e^{S_2} + ... + e^{S_N})。我们的 toy 句子有三个单词,label set 有两个 label,所以一共应该有 8 种可能的 label path。


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


本文地址:https://www.6aiq.com/article/1585415235824
本文版权归作者和AIQ共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出