条件随机场(CRF,Conditional Random Field)

条件随机场(CRF,Conditional Random Field)

第一次接触 CRF,很多人都会被下面这句话弄蒙:

条件随机场(CRF)是一种在给定输入序列 X 的条件下,对整个标签序列 Y 建模的概率模型。

其实 CRF 的核心思想并不复杂,难的是这个定义太抽象。所以我们先不管这些概念,直接从一个具体的序列问题开始

看看一个一个预测标签到底有什么问题,再来理解 CRF 是怎么解决这个问题的。

1. 问题场景

既然 CRF 是解决序列预测问题,那么什么是序列预测问题?

给定一个输入序列,需要依次给输入序列中的每个元素预测一个标签,最终得到一个标签序列。

例如,在命名实体识别中(BIO 标签体系:B-PER、I-PER、B-LOC、I-LOC、B-ORG、I-ORG、O):

输入:我爱北京天安门
输出:OOB-LOCI-LOCB-LOCI-LOCI-LOC

这个预测过程存在什么问题?

如果各个位置相互独立地进行预测,那么从整个序列来看,标签组合的自由度非常大。模型只需要判断当前位置最可能是什么标签,却不需要考虑这个标签与前后标签是否能够合理地组合。例如,模型可能预测出:

字我爱北京天安门
标签OOI-LOCI-LOCOI-LOCI-LOC

其中就出现了:O → I-LOC 这样的标签序列,或者 I-LOC → O → I-LOC

按照 BIO 标签体系规则,I-LOC 表示某个地点实体的内部部分,它应该跟在一个已经开始的地点实体后面,例如:B-LOC → I-LOC → I-LOC。因此,如果完全独立地预测每个位置,理论上可以产生大量标签组合,其中有些组合虽然单独看每个标签都有一定概率,但放在整个序列中却非常不合理。

简言之:序列预测任务不仅要预测标签,还要学习标签和标签之间的关系,否则预测的标签很容易出错。

2. 解决思路

我们先明确下预测序列的规则具体是什么?

我们以 NER 任务为例,假设使用 BIO 标签体系,它有 3 种实体类型:

  • PER:人名
  • LOC:地点
  • ORG:组织

那么一共有 7 个标签:O、B-PER、I-PER、B-LOC、I-LOC、B-ORG、I-ORG。

这些标签之间存在各种组合关系,例如:

  • O 后面可以是 O
  • O 后面可以是 B-LOC
  • O 后面通常不应该是 I-LOC
  • B-LOC 后面可以是 I-LOC
  • B-PER 后面不应该直接是 I-LOC

这些关系,本质上描述的就是:一个标签出现以后,另一个标签作为后续标签是否合理。那么,具体如何表示这种关系呢?

有些同学可能会想到:标签不多,我们可以提前把这些标签规则都定义好。是的,完全可以。但是还有一层问题:我们真正需要判断的并不只是能不能这样组合,而是哪种组合更合理。比如,某个句子经过分析后,可能存在多个都符合 BIO 规则的标签序列。它们从标签组合上看都没有问题,但到底哪个结果更合理,仅仅依靠我们提前定义的规则是无法判断的。这时候,就需要根据大量的训练语料,让模型自己学习:什么样的标签组合更常见、更合理。

所以,CRF 并不是简单地让人提前写死一套规则,而是通过训练数据学习标签之间的关系。具体的做法就是,用一个可以学习的矩阵来表示这些标签之间的关系。我们根据前面定义的标签体系,再增加两个特殊的标签:

  • START:表示序列开始
  • END:表示序列结束

然后,用这些标签构建一个矩阵:

STARTOB-PERI-PERB-LOCI-LOCB-ORGI-ORGEND
START——
O—
B-PER—
I-PER—
B-LOC—
I-LOC—
B-ORG—
I-ORG—
END—————————

行表示当前标签,列表示下一个标签,每一个格子中的值,就是模型需要学习的一个参数。如果某种标签组合在训练数据中经常出现,模型通常会倾向于给这种组合更高的分数,如果某种组合很少出现,模型通常会倾向于给它较低的分数。也就是说,经过训练之后,这个矩阵中就记录了训练数据中标签之间的组合关系,以及模型对这些组合关系的偏好程度。

假设我们有一个序列,预测结果如下:

当前标签 \ 下一标签STARTOB-PERI-PERB-LOCI-LOCB-ORGI-ORGEND
START—🟦🟥 1.0—
O—🟦 2.0🟦 1.2🟥 -3.0
B-PER—
I-PER—
B-LOC—🟦🟥 3.0
I-LOC—🟥 0.8🟦🟥 1.5
B-ORG—
I-ORG—
END—————————

🟦 START → O → O → B-LOC → I-LOC → END,1.0 + 2.0 + 1.2 + 3.0 + 1.5 = 8.7
🟥 START → O → I-LOC → B-LOC → I-LOC → END,1.0 + (-3.0) + 0.8 + 3.0 + 1.5 = 3.3

路径 🟦 的得分更高,所以模型会更倾向于选择路径 🟦。

3. 结论落地

CRF 本质上是一个序列标注模型。所谓条件,就是给定整个输入序列。所谓随机场,就是要预测的一系列相互关联的标签变量。

在具体实现中,CRF 会对可能的标签序列进行整体打分。这个分数主要考虑标签之间的组合关系,以及训练数据中的标注偏好。

其中,标签之间的组合关系,可以理解为不同标签之间哪些组合更加合理。而数据中的标注偏好,是指在不同的场景下,同一个输入可能存在多种合理的标注方式,模型会根据训练数据学习更倾向于哪一种。

最终,CRF 会从所有可能的标签序列中,选择总分最高的一条作为最终预测结果。

所以,CRF 可以简单理解为:

给定整个输入序列 → 综合考虑标签之间的关系和数据偏好 → 对可能的标签序列进行打分 → 选择得分最高的标签序列。

而前面介绍的转移矩阵,就是 CRF 用来表示和计算标签之间组合关系的重要参数。

总结一下:序列预测不能只独立预测每个位置的标签,还要考虑标签之间的组合关系。CRF 用一个可学习的转移矩阵来建模这种关系,对整条标签序列打分,最后选出总分最高的一条。所谓条件,就是给定整个输入序列。所谓随机场,就是要预测的一系列相互关联的标签变量。