跳转到内容

11.4.4 BiLSTM + CRF

BiLSTM CRF 标签路径解码图

  • 理解 BiLSTM 在序列标注中负责什么
  • 理解 CRF 为什么能建模标签转移约束
  • 知道 BIO 标签体系下哪些预测是不合理的
  • 能解释 BiLSTM + CRF 和普通 token 分类的差异

flowchart LR
A[Token 序列] --> B[Embedding]
B --> C[BiLSTM 上下文表示]
C --> D[每个位置的标签得分]
D --> E[CRF 标签转移约束]
E --> F[最优标签序列]

BiLSTM 负责理解上下文,CRF 负责选择整体最合理的标签路径。两者结合后,模型不只是问“这个 token 像不像实体”,还会问“这一整串标签连起来是否合理”。

假设使用 BIO 标签体系:B-PER 表示人名开头,I-PER 表示人名内部,O 表示非实体。如果模型独立预测每个 token,就可能输出这样的标签:

我 爱 北京
O I-LOC B-LOC

这里 I-LOC 出现在实体开头位置,通常是不合理的。普通分类器很难显式约束这种标签转移,而 CRF 可以学习标签之间的转移分数。

LSTM 可以按顺序读取文本,BiLSTM 则同时从左到右和从右到左读取。这样每个 token 的表示都包含前后文信息。

例如“苹果”在不同句子里可能是水果,也可能是公司。BiLSTM 的作用就是让当前位置看到周围词,从而减少歧义。

CRF 会同时考虑两类分数:每个位置属于某个标签的发射分数,以及标签之间的转移分数。最终预测时,它不是逐个位置贪心选择,而是寻找整条序列总分最高的标签路径。

flowchart TD
A[发射分数:每个 token 像哪个标签] --> C[序列总分]
B[转移分数:标签接标签是否合理] --> C
C --> D[Viterbi 解码找最优路径]

这就是为什么 CRF 特别适合 NER、词性标注、分词这类标签之间有结构约束的任务。

labels = ["B-PER", "I-PER", "O", "B-LOC", "I-LOC"]
# 简化版:人为定义一些不合理转移
invalid_transitions = {
("O", "I-PER"),
("O", "I-LOC"),
("B-PER", "I-LOC"),
("B-LOC", "I-PER"),
}
path = ["O", "I-LOC", "B-LOC"]
for a, b in zip(path, path[1:]):
if (a, b) in invalid_transitions:
print("不合理转移:", a, "->", b)

预期输出:

Terminal window
不合理转移: O -> I-LOC

局部 token 分类器可能给出 I-LOC,但从整条路径看它很可疑:位置实体的内部标签通常应该接在 B-LOCI-LOC 后面。

真实 CRF 不是靠手写规则,而是从训练数据中学习哪些标签转移更合理。这个例子只是帮助你建立“标签之间有关系”的直觉。

五、和 BERT token classification 的关系

Section titled “五、和 BERT token classification 的关系”

现代 NER 经常直接用 BERT 加线性分类层,也可以在 BERT 后面接 CRF。BERT 的上下文表示能力通常强于 BiLSTM,但 CRF 对标签约束仍然有价值,尤其在数据量较小、标签格式严格、实体边界容易错的任务里。

学完这一页,至少保留这张证据卡:

模式
实体类型、BIO 标签,或序列标注规则
预测
词级标签和提取的片段
指标
实体精确率/召回率/F1 和边界情况
失败检查
跨度边界、嵌套实体、未知词或标注不一致
期望产出
金标与预测 span 对照表,至少包含一个漏判

第一个误区是把 CRF 当成过时模型。它不一定是最强方案,但标签约束思想仍然重要。第二个误区是只看 token 级准确率,不看实体级 F1。NER 最终关心的是实体边界和类型是否完整正确。第三个误区是忽略 BIO 标注一致性,导致训练数据本身就有非法标签序列。

  1. 写出一句中文句子的 BIO 标签,并检查是否存在非法 I-* 开头。
  2. 比较“逐 token 分类”和“整体序列解码”的差异。
  3. 思考:为什么实体级 F1 比 token accuracy 更适合 NER?
  4. 如果用 BERT 做 NER,还需不需要 CRF?列出支持和反对理由。
解题思路与讲解
  1. 写中文 BIO 示例时,先确定分词/切字单位,再检查没有实体以 I-* 开头,并且每个 I-* 前面都有匹配的 B-*I-*
  2. 逐 token 分类是每个位置独立打分;全局序列解码是在整句范围内选择最合理、合法的标签路径。
  3. 实体级 F1 比 token accuracy 更适合 NER,因为一个边界错误就可能让抽出的实体不可用,即使大多数 token 看起来正确。
  4. BERT 可以不接 CRF,但 CRF 仍可帮助约束合法转移和实体边界一致性;代价是复杂度更高,简单数据上未必需要。

学完本节后,你应该能解释 BiLSTM 和 CRF 各自负责什么,能识别 BIO 标签中的非法转移,能说明为什么序列标注要考虑标签之间的依赖,并能把这个思想迁移到后续的结构化信息抽取任务。