第一次接触 CRF,很多人都会被下面这句话弄蒙:
条件随机场(CRF)是一种在给定输入序列 X 的条件下,对整个标签序列 Y 建模的概率模型。
其实 CRF 的核心思想并不复杂,难的是这个定义太抽象。所以我们先不管这些概念,直接从一个具体的序列问题开始
看看一个一个预测标签到底有什么问题,再来理解 CRF 是怎么解决这个问题的。
1. 问题场景
既然 CRF 是解决序列预测问题,那么什么是序列预测问题?
给定一个输入序列,需要依次给输入序列中的每个元素预测一个标签,最终得到一个标签序列。
例如,在命名实体识别中(BIO 标签体系:B-PER、I-PER、B-LOC、I-LOC、B-ORG、I-ORG、O):
| 输入: | 我 | 爱 | 北 | 京 | 天 | 安 | 门 |
|---|---|---|---|---|---|---|---|
| 输出: | O | O | B-LOC | I-LOC | B-LOC | I-LOC | I-LOC |
这个预测过程存在什么问题?
如果各个位置相互独立地进行预测,那么从整个序列来看,标签组合的自由度非常大。模型只需要判断当前位置最可能是什么标签,却不需要考虑这个标签与前后标签是否能够合理地组合。例如,模型可能预测出:
| 字 | 我 | 爱 | 北 | 京 | 天 | 安 | 门 |
|---|---|---|---|---|---|---|---|
| 标签 | O | O | I-LOC | I-LOC | O | I-LOC | I-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:表示序列结束
然后,用这些标签构建一个矩阵:
| START | O | B-PER | I-PER | B-LOC | I-LOC | B-ORG | I-ORG | END | |
|---|---|---|---|---|---|---|---|---|---|
| START | — | — | |||||||
| O | — | ||||||||
| B-PER | — | ||||||||
| I-PER | — | ||||||||
| B-LOC | — | ||||||||
| I-LOC | — | ||||||||
| B-ORG | — | ||||||||
| I-ORG | — | ||||||||
| END | — | — | — | — | — | — | — | — | — |
行表示当前标签,列表示下一个标签,每一个格子中的值,就是模型需要学习的一个参数。如果某种标签组合在训练数据中经常出现,模型通常会倾向于给这种组合更高的分数,如果某种组合很少出现,模型通常会倾向于给它较低的分数。也就是说,经过训练之后,这个矩阵中就记录了训练数据中标签之间的组合关系,以及模型对这些组合关系的偏好程度。
假设我们有一个序列,预测结果如下:
| 当前标签 \ 下一标签 | START | O | B-PER | I-PER | B-LOC | I-LOC | B-ORG | I-ORG | END |
|---|---|---|---|---|---|---|---|---|---|
| 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 用一个可学习的转移矩阵来建模这种关系,对整条标签序列打分,最后选出总分最高的一条。所谓条件,就是给定整个输入序列。所谓随机场,就是要预测的一系列相互关联的标签变量。

冀公网安备13050302001966号