想象你是一位婚礼策划师。几百位宾客将从大门涌入宴会厅,你必须为他们在请柬上提前标注:“小明,3号桌;小红,12号桌……”不仅如此,你还得考虑:张三和李四是十年老友,理应坐一起;王阿姨和刘婶有过节,必须隔开三桌。你绝不能只看一位宾客就匆匆落笔——那会让老友被拆散、冤家撞个满怀。你需要通盘审视所有宾客、权衡每一对关系,最终拿出一套全场最和谐的座次表。 这就是条件随机场(CRF)正在做的事。当计算机读一个句子时,它要给每个字安排“座位”——这个字是不是人名的开头?是不是地名的一部分?还是普通字?CRF像那位老练的婚宴策划师,不满足于只看当前一个字的局部判断,而是把整句话当作一个整体,调和所有“关系线索”后,输出一条全局最优的标签序列。这篇文章,我们就从这场婚宴出发,看看CRF如何用“全局归一化”的统筹思维,解决命名实体识别(NER)与中文分词中的“标注偏置”难题。

岗位关联

对 NLP 工程师而言,CRF 是简历上的高频硬技能。掌握它的全局归一化思想、特征函数设计以及与 HMM 的本质差异,你就能真正理解主流序列标注工具的运作原理,从容应对 NER、分词等任务的调优问题。

目录
  1. 可视化演示
  2. 序列标注任务:给每位宾客贴上座位标签
  3. CRF概率框架:一场统筹全局的排座算法
  4. 特征函数设计:婚宴上的座次规矩
  5. 全局归一化:通盘考虑整场婚宴
  6. HMM对比分析:自助入座与统筹排座的差距
  7. NER实战应用:在人群中认出“熟人圈”
  8. 分词实战应用:给长串菜名分桌
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示CRF条件随机场核心原理:链式概率图模型P(Y|X)全局归一化、MEMM标注偏置问题与CRF解决方案、以及BMES标签在NER与中文分词中的序列标注过程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

'+captions.model+'

序列标注任务:给每位宾客贴上座位标签

婚宴入口处,宾客陆续到场。策划师拿起笔,在每位宾客的请柬上快速写下一个区域编号:“这位,坐A区;那位,坐B区。”这个看似简单的“写编号”动作,其实就是序列标注的雏形——只不过在自然语言处理任务中,“宾客”变成了句子里的一个个字,而“区域编号”变成了一个个标签。

在NLP世界中,序列标注是许多任务的共同底座。给定一段文字 $X = (x_1, x_2, \dots, x_n)$,我们需要为每个字 $x_i$ 分配一个标签 $y_i$。以“我在北京读书”为例,我们希望模型认出“北京”是地名,于是给“北”贴“地名开始”(B-LOC),给“京”贴“地名内部”(I-LOC),其余的字贴“非实体”(O)。命名实体识别(NER)和中文分词,本质上都可以归结为这类“给每个字贴标签”的任务。

为了让标签体系规范统一,业界普遍采用BIO标注法:B(Begin)表示实体的第一个字,I(Inside)表示实体中间或结尾的字,O(Outside)表示不属于任何实体的普通字。模型的全部工作,就是为输入句子找出概率最高的一串标签序列。

与婚宴策划一样,排座方案的好坏取决于你是否“认清宾客身份”。序列标注任务定义了我们要给什么贴标签、标签有哪些,这一步看似简单,却是后续所有复杂模型发挥作用的前提。

Y^=arg⁡max⁡y1,…,ynP(y1,…,yn∣x1,…,xn)\displaystyle \hat{Y} = \arg\max_{y_1, \dots, y_n} P(y_1, \dots, y_n \mid x_1, \dots, x_n)
这个公式是序列标注的“总目标”:在给定一句话的条件下,从所有可能的标签序列中,挑出概率最高的一条。
  1. 给定输入序列把句子拆成一串汉字 $x_1, x_2, \dots, x_n$,每个字是待安排座位的“宾客”。
    X=(x1,x2,…,xn)\displaystyle X = (x_1, x_2, \dots, x_n)
  2. 输出标签序列为每个字配备一个标签 $y_i$,整句对应一条标签链 $Y$,如同给每位宾客写上桌区号。
    Y=(y1,y2,…,yn)\displaystyle Y = (y_1, y_2, \dots, y_n)
  3. 求最大值$\arg\max$ 表示“从所有可能的标签链中,选出条件概率最大的那一条”,即全场最合理的座次方案。

CRF概率框架:一场统筹全局的排座算法

策划师不能靠掷骰子排座,她需要一套系统的判断方法。CRF就是那套方法。它属于判别式模型——你不需要先弄清楚每位宾客的全部背景(那是生成式模型要做的),只需要直接学习“在什么条件下,这位宾客该坐哪里”。这正是婚宴统筹的智慧:与其研究每位宾客的一生,不如聚焦于“看到这个组合,怎样安排最合理”。

CRF的全称是条件随机场。在序列标注中,我们最常使用的是“线性链”结构:标签与标签像链条一样首尾相接,当前标签直接依赖前一个标签。模型建立的是条件概率 $P(Y|X)$,意思是“给定句子 $X$,输出标签序列 $Y$ 的概率”。这个概率不是简单相乘出来的,而是先给每一条候选路径打分,再经过归一化变成概率。

婚宴统筹的精髓在于“系统判断”而非“零散感觉”。CRF的概率框架,就是策划师脑子里那套完整的排座算法:它不需要知道宾客从哪里来(联合分布),只看清眼前的宾客名单,就能直接算出最优座次。

P(Y∣X)=1Z(X)exp⁡(∑i=1n∑j=1mλjfj(yi−1,yi,X,i))\displaystyle P(Y|X) = \frac{1}{Z(X)} \exp\left(\sum_{i=1}^{n}\sum_{j=1}^{m} \lambda_j f_j(y_{i-1}, y_i, X, i)\right)
这是CRF的核心公式:标签序列有多好,取决于所有位置上特征函数 $f_j$ 的加权和;分数越高,被选中的概率越大。
  1. 条件概率 $P(Y|X)$给定句子 $X$ 时,标签序列 $Y$ 出现的概率,体现了判别式模型“直接学条件”的思路。
    P(Y∣X)\displaystyle P(Y|X)
  2. 归一化因子 $1/Z(X)$分母 $Z(X)$ 是所有候选路径得分之和,确保所有路径的概率加起来恰好等于1。
    1Z(X)\displaystyle \frac{1}{Z(X)}
  3. 特征加权求和内层 $\sum_{j} \lambda_j f_j(\cdot)$ 对每个位置上的特征得分求和,外层 $\sum_{i}$ 再把整句话所有位置加起来。
    ∑i=1n∑j=1mλjfj(yi−1,yi,X,i)\displaystyle \sum_{i=1}^{n}\sum_{j=1}^{m} \lambda_j f_j(y_{i-1}, y_i, X, i)
  4. 指数函数 $\exp$把总得分映射成正数,再通过归一化因子转化为概率,得分高的路径概率大。

特征函数设计:婚宴上的座次规矩

策划师手里有一本“座次规矩手册”:老同学桌的人要坐一起;有矛盾的亲戚必须隔开;带小孩的家庭要靠近通道。每一条规矩,在CRF中就对应一个特征函数。特征函数是“问号式”的判断器——它只看自己关心的线索,如果线索满足,就输出1,否则输出0,就像策划师逐条核对规矩打勾。

特征函数分两类。一类是状态特征:只关心当前位置的字,“这个字是不是'北'?是的话,打标签B-LOC就加分”。另一类是转移特征:关心前后标签的关系,“前一个标签是B-LOC,当前标签是I-LOC,说明地名在延续,加分”。两者共同决定一条路径的总分。

规则手册越精准,排座越合理。特征函数的设计就是“写规矩”的过程:词典命中、词性、前后缀甚至相邻字,都能成为规则的一部分。规矩定好后,每条规矩还会配一个权重 $\lambda_j$——有些规律至关重要,有些只是参考。这些权重在训练阶段由数据自动学习得到。

fj(yi−1,yi,X,i)={1,若当前字 xi 是词典中的地名首字且 yi=B-LOC0,其他情况\displaystyle f_j(y_{i-1}, y_i, X, i) = \begin{cases} 1, & \text{若当前字 } x_i \text{ 是词典中的地名首字且 } y_i = \text{B-LOC} \\ 0, & \text{其他情况} \end{cases}
特征函数是CRF的“眼睛”:它把离散的语言线索转化为数值,分数越高,说明该标签越符合这条规律。
  1. 输入四元组特征函数接收前一个标签 $y_{i-1}$、当前标签 $y_i$、整句话 $X$ 和当前位置 $i$。
    fj(yi−1,yi,X,i)\displaystyle f_j(y_{i-1}, y_i, X, i)
  2. 条件判断如果当前字 $x_i$ 命中地名词典,且当前标签是地名开始 $\text{B-LOC}$,则条件成立。
    xi∈Dplace  且  yi=B-LOC\displaystyle x_i \in \mathcal{D}_{\text{place}} \;\text{且}\; y_i = \text{B-LOC}
  3. 二值输出条件成立返回1,否则返回0,每个特征函数只回答“这个线索是否成立”。
    fj(⋅)∈{0,1}\displaystyle f_j(\cdot) \in \{0, 1\}

全局归一化:通盘考虑整场婚宴

如果策划师只盯着一位宾客安排座位,她很可能犯一个大错:那位老先生坐到了老友身边,却把原本坐在一起的五口之家拆散了。局部最优不等于全局最优。HMM这类模型的困境正在于此:它在每个位置上单独做归一化,相当于“每位宾客到了现场自己找座”,最终产生的标注偏置就像婚宴现场的一团乱麻。

CRF的解法是“全局归一化”。它不是在每个位置分别归一,而是把整条标签路径当作一个整体:先算出每条路径的总分,再对所有路径的分值统一归一化。这样,一条路径的某一个位置看着不是最完美的,但只要整条路径和谐最优,它依然能胜出。就好比策划师安排座次时,发现某位宾客单独坐不太理想,但为了保住整桌老友团聚,依然这样安排。

全局归一化直接动刀解决“标注偏置”:因为所有路径共享同一个归一化分母,比较的标准就统一了,模型再也不会因为某个标签“可选出路少”就被盲目偏爱。解码时,CRF也采用全局策略——维特比算法在整条路径上动态规划,选出总分最高的一条,而不是每个字独立挑一个最佳标签。

Z(X)=∑Y′exp⁡(∑i=1n∑j=1mλjfj(yi−1′,yi′,X,i))\displaystyle Z(X) = \sum_{Y'} \exp\left(\sum_{i=1}^{n}\sum_{j=1}^{m} \lambda_j f_j(y'_{i-1}, y'_i, X, i)\right)
这里的 $Z(X)$ 是所有候选标注路径的“得分总和”,相当于把全场所有可能的座次表都列出来,算出各自的分数,再求和作为分母。
  1. 枚举所有路径$\sum_{Y'}$ 表示遍历所有可能的标签序列 $Y'$,一张不落地评审全场座次方案。
    ∑Y′\displaystyle \sum_{Y'}
  2. 每条路径的得分指数内部的累加计算出该条路径的特征加权总分。
    ∑i=1n∑j=1mλjfj(yi−1′,yi′,X,i)\displaystyle \sum_{i=1}^{n}\sum_{j=1}^{m} \lambda_j f_j(y'_{i-1}, y'_i, X, i)
  3. 指数化后求和每条路径得分取指数后,全部相加得到 $Z(X)$,它是后续归一化的分母。
    Z(X)=∑Y′exp⁡(score(Y′,X))\displaystyle Z(X) = \sum_{Y'} \exp(\text{score}(Y', X))

HMM对比分析:自助入座与统筹排座的差距

想象另一场宴会:没有策划师,宾客们自行找座。王阿姨进来,看到最近的空桌就坐下;刘婶随后进来,也找了最近的座位——结果两人坐到了邻桌,气氛尴尬。这个“自助入座”模型就是隐马尔可夫模型(HMM)。HMM是生成式模型,先假设标签按某种规律生成,再由标签“发射”出观测字,整体计算联合概率 $P(X, Y)$。

HMM最大的问题在于“局部归一化”:每个状态的转移概率单独归一化到和为1,导致那些转移选项少的标签会获得不相称的高概率。这就是标注偏置的根源——模型天然偏爱“出路少”的标签,即使全局来看并不合理。好比一位宾客身边只有两个空位,他很快坐下;但全场统筹来看,另一个区域才是他的老友圈。

CRF与HMM的对比,本质是“统筹”与“自助”的对比。HMM的观察独立性假设要求当前字只由当前标签决定,无法使用词典、前后缀等丰富特征;CRF则没有这种限制,特征函数可以任意设计。因此,在NER和分词任务中,CRF几乎总是优于HMM。

P(X,Y)=∏i=1nP(yi∣yi−1)×P(xi∣yi)\displaystyle P(X, Y) = \prod_{i=1}^{n} P(y_i \mid y_{i-1}) \times P(x_i \mid y_i)
HMM把句子生成过程拆成“转移”和“发射”两步的连乘,每一步都独立归一化,这正是它与CRF最本质的差别。
  1. 联合概率 $P(X, Y)$HMM建模句子和标签同时出现的概率,属于生成式思路。
    P(X,Y)\displaystyle P(X, Y)
  2. 转移概率 $P(y_i \mid y_{i-1})$从前一个标签转移到当前标签的概率,局部已归一化。
    P(yi∣yi−1)\displaystyle P(y_i \mid y_{i-1})
  3. 发射概率 $P(x_i \mid y_i)$当前标签“发出”当前字的概率,假设只看当前字。
    P(xi∣yi)\displaystyle P(x_i \mid y_i)
  4. 连乘 $\prod$所有位置的转移乘发射,概率整体相乘,任何一步的归一化偏差都会贯穿始终。

NER实战应用:在人群中认出“熟人圈”

婚宴上有三类客人最需要策划师上心:新郎的亲友、新娘的同事、双方共同的朋友。对应在NER任务中,就是人名、地名、组织名等实体。CRF在NER中的角色,就是那个能准确认出“熟人圈”边界的策划师——它不仅要知道“张”可能是姓,还要判断“张三”是一个完整的人名,而不是把“张”和“三”拆成两个普通字。

CRF处理NER时,特征设计往往决定成败。除了字本身,常用特征包括:当前字是否在姓氏表中、是否命中地名词典、前一个字是什么、词性标签等。这些特征通过状态函数注入模型,而转移特征则负责“实体边界”——比如触发了B-PER后,后续优先接I-PER,而不是跳回O。

在实际业务中,CRF做NER能发挥“边界识别”的独门优势:人名、地名往往不是单字,而是多个字组成的片段。HMM因为局部归一化,容易在实体中间断开;CRF通过全局归一化与转移特征,能够稳定地保住完整实体边界,将命名实体识别的F1值大幅提升。

fdict(yi,X,i)=1[xixi+1∈Dplace  且  yi=B-LOC]\displaystyle f_{\text{dict}}(y_i, X, i) = \mathbb{1}\left[ x_i x_{i+1} \in \mathcal{D}_{\text{place}} \;\text{且}\; y_i = \text{B-LOC} \right]
这是一个典型的NER特征函数:只有“连续两个字命中了地名词典,并且当前标签是地名开始”时,才输出1。词典线索与标签配合,边界就清晰了。
  1. 指示函数 $\mathbb{1}[\cdot]$中括号内条件成立则输出1,否则输出0。
    1[⋅]\displaystyle \mathbb{1}[\cdot]
  2. 词典命中判断检查相邻两个字组成的词是否出现在地名词典 $\mathcal{D}_{\text{place}}$ 中。
    xixi+1∈Dplace\displaystyle x_i x_{i+1} \in \mathcal{D}_{\text{place}}
  3. 标签条件同时要求当前标签是地名开始 B-LOC,两个条件都满足才加分。
    yi=B-LOC\displaystyle y_i = \text{B-LOC}

分词实战应用:给长串菜名分桌

婚宴菜单上有一道“北京大学红烧肉”,后厨接到单子,需要判断怎么切分原料:“北京大学”是一所学校的名字,不应拆开;“红烧肉”是一道菜,也要保持完整。中文分词正是这个切分过程——把没有空格的中文句子切成一个个词语,而CRF可以把“切分”建模为对每个字标注“词首/词中/词尾/单字”。

中文分词最常用的标注体系是BMES:B表示词首字,M表示词中间的字,E表示词尾字,S表示单字成词。“北京大学”标注为 B M M E,拼起来恰好还原成一个词。CRF在这里的独特价值在于处理未登录词和歧义:比如“武汉市长江大桥”,人知道是“武汉市/长江大桥”还是“武汉/市长/江大桥”要看语境,CRF通过全局归一化综合全句线索,判断得更稳重。

CRF分词在实际工程中表现优异,开源工具如 jieba、LTP 等都曾或正在使用CRF模型处理歧义词与未登录词。相比纯词典的最大匹配算法,CRF像一位熟读菜单的老厨师,不盲目按最长词切,而是结合前后文统筹判断,最终呈现出最自然的分词结果。

Y={B,M,E,S},按标注即可还原分词结果\displaystyle Y = \{ B, M, E, S \}, \quad \text{按标注即可还原分词结果}
分词被巧妙地转化为一个四标签的序列标注问题,模型输出标签串后,按规则拼接就能得到分词结果。
  1. B(Begin)词的首字,如“北”在“北京”中应标B。
    B=词首字\displaystyle B = \text{词首字}
  2. M(Middle)词的中间字,如“京”“大”在“北京大学”中标M。
    M=词中间字\displaystyle M = \text{词中间字}
  3. E(End)词的末尾字,如“学”在“北京大学”中标E。
    E=词尾字\displaystyle E = \text{词尾字}
  4. S(Single)单独成词的字,如“我”“在”标S。
    S=单字成词\displaystyle S = \text{单字成词}

AI 应用场景

搜索引擎中的实体识别与召回

阶段:查询理解与信息抽取

解决的问题:用户输入“北京到上海的高铁”,传统关键词匹配无法识别“北京”“上海”是地点实体,导致召回不精准。CRF通过对查询词做NER标注,清晰抽出出发地与目的地,让搜索引擎理解查询意图。

具体案例:用户搜索“张医生在北京协和医院出诊”,CRF模型标注出“张”为姓氏、识别“北京协和医院”为组织实体,搜索系统据此触发医院信息卡片,并准确呈现相关科室,搜索效率显著提升。

中文输入法的智能分词

阶段:输入法候选与语言模型前处理

解决的问题:拼音输入法需要把拼音串切分成词,传统逐字匹配会产生大量不自然候选。CRF做分词后,输入法能预判用户想要输入的词组边界。

具体案例:输入“wuhanchangjiangdaqiao“,CRF分词模型结合上下文特征,优先给出”武汉市/长江大桥“的切分方案,避免”武汉市长/江大桥”的笑话,用户候选词准确率明显提升。

医疗文本的结构化抽取

阶段:电子病历信息抽取

解决的问题:医生书写的病历中大量实体如药品名、病症名、检查项需要抽取。CRF的词典特征可以灵活加入医学词库,解决专业术语边界不清的问题。

具体案例:一份病历写道“患者服用阿莫西林后出现皮疹”,CRF模型标注“阿莫西林”为药品实体、“皮疹”为症状实体,自动填入结构化表单,辅助临床决策系统高效运作。

Python 演示

python63 行
# -*- coding: utf-8 -*-"""简化版线性链 CRF:特征函数 + Viterbi 全局解码演示"""import math TAGS = ['O', 'B-LOC', 'I-LOC', 'B-PER', 'I-PER'] # 特征模板:从句子中抽取观测特征def extract_features(sentence, i):    w = sentence[i]    feats = ['w:' + w]    if i > 0:        feats.append('w-1:' + sentence[i - 1])    if i < len(sentence) - 1:        feats.append('w+1:' + sentence[i + 1])    feats.append('pre:' + w[0])    feats.append('suf:' + w[-1])    return feats # 手工设定的特征权重(真实 CRF 通过训练得到)WEIGHTS = {    ('w:北', 'B-LOC'): 2.0, ('w:京', 'I-LOC'): 1.8,    ('w:大', 'B-LOC'): 1.6, ('w:学', 'I-LOC'): 1.2,    ('w:张', 'B-PER'): 2.2, ('w:三', 'I-PER'): 1.5,    ('w:我', 'O'): 0.8, ('w:在', 'O'): 1.0,    ('w:读', 'O'): 0.9, ('w:书', 'O'): 0.8,    ('O', 'B-LOC'): 0.6, ('B-LOC', 'I-LOC'): 2.0,    ('O', 'B-PER'): 0.6, ('B-PER', 'I-PER'): 2.0,} def position_score(sentence, i, prev_tag, cur_tag):    s = 0.0    for feat in extract_features(sentence, i):        s += WEIGHTS.get((feat, cur_tag), 0.0)    s += WEIGHTS.get((prev_tag, cur_tag), 0.0)    return s def viterbi_decode(sentence):    n = len(sentence)    dp = [[-1e9] * len(TAGS) for _ in range(n)]    back = [[0] * len(TAGS) for _ in range(n)]    for t, tag in enumerate(TAGS):        dp[0][t] = position_score(sentence, 0, '<s>', tag)    for i in range(1, n):        for t, tag in enumerate(TAGS):            best = -1e9            for pt, ptag in enumerate(TAGS):                val = dp[i - 1][pt] + position_score(sentence, i, ptag, tag)                if val > best:                    best = val                    back[i][t] = pt            dp[i][t] = best    best_t = max(range(len(TAGS)), key=lambda t: dp[n - 1][t])    path = [best_t]    for i in range(n - 1, 0, -1):        path.append(back[i][path[-1]])    path.reverse()    return [TAGS[t] for t in path] if __name__ == '__main__':    sent = list('张在北京大学读书')    pred = viterbi_decode(sent)    for w, t in zip(sent, pred):        print(w, t)
目的:演示CRF的核心推理过程——用特征函数给每个位置打分,再用Viterbi算法做全局解码,输出每个字的标签。
  1. def extract_features(sentence, i):定义特征模板,抽取当前字、前一字、后一字等信息,相当于策划师翻阅“宾客关系册”。
  2. WEIGHTS.get((feat, cur_tag), 0.0)查权重表,看这个特征与当前标签组合能加多少分。
  3. s += WEIGHTS.get((prev_tag, cur_tag), 0.0)把转移特征的分数加上,相当于判断“前一个座位安排是否顺理成章”。
  4. dp[i - 1][pt] + position_score(...)动态规划状态转移,比较所有前序路径中到当前点得分最高的一条。
  5. back[i][t] = pt记录前驱节点,解码后用于回溯整个最优路径。
  6. path.reverse()回溯完成后反转,得到从前往后的标签序列,即整场“座次表”。

常见误区

误区很多初学者看到CRF和HMM都是处理序列的图模型,就以为它们都是生成式模型,核心思想差不多。

正解两者有本质区别。HMM是生成式模型,建模联合概率 P(X,Y),先把标签生成出来再发射出观测;CRF是判别式模型,直接建模条件概率 P(Y|X),跳过“生成过程”直接学“在给定输入下如何选标签”。好比自助入座的宾客要先想“我是什么人再找位置”,而策划师只看“这个客人到场后应该坐哪”。建模思路不同,效果也截然不同。

为何常见:因为两者都是处理序列的经典模型,且都涉及标签转移,课堂上常放在一起讲,容易让人混淆。

误区以为CRF的特征函数和朴素贝叶斯一样,只能根据当前这个字来做判断。

正解CRF特征函数的最大优势就是灵活,它接受四元组(前标签、当前标签、整句话、当前位置),这意味着可以自由使用前一帧、后一帧、词典、词性乃至句法信息。好比策划师排座时,不仅看眼前宾客,还要看他身边同行的人、他的朋友圈、他的家庭情况。

为何常见:很多入门资料用词袋简化特征描述,让人们误以为特征只有“当前词”这一种。

误区认为 Z(X) 就是个常数,反正对所有路径都除一遍,对最终排序没影响。

正解Z(X) 虽然不改变路径的相对排序,但它确保了所有路径概率之和等于1,这是概率模型的合法性前提。更重要的是,在训练时计算Z的梯度,模型才会学会提高正确路径的概率、压低错误路径的概率。没有Z,CRF就退化成单纯打分器,无法做概率解释,也无法正确学习。

为何常见:推理阶段只做 argmax 时确实用不到Z,让人误以为它不重要。

误区以为有了CRF模型,把原始文本丢进去就能自动识别实体,不需要人工设计特征。

正解CRF是统计模型,不是深度表示模型。它确实能自动学习特征权重,但特征的选择和模板设计仍需人工完成。特征设计得好,模型效果上限高;特征太弱,再训练也无力回天。现实中做NER,工程师依然要考虑词典、后缀、前后字等特征。

为何常见:深度学习的“端到端”观念流行,让大家误以为CRF也能全自动提取特征。

误区学习时看到“标注偏置”这个词总出现在CRF的章节,就以为CRF存在标注偏置问题。

正解恰恰相反,标注偏置是HMM等局部归一化模型的通病,而CRF的全局归一化正是为了消除它。CRF在路径级统一归一化,所有候选路径共享同一个分母,不会因为某个状态“出路少”就抬高概率。CRF是标注偏置的“解药”,不是“病因”。

为何常见:教材为了对比HMM和CRF,总把标注偏置放在同一章讲,读者容易张冠李戴。

面试题

Q1. CRF属于哪一类模型?

单选题 · easy

  • A.生成式模型
  • B.判别式模型← 正确答案
  • C.无监督模型
  • D.强化学习模型

答案:B。CRF直接建模条件概率 P(Y|X),属于判别式模型。它不像HMM那样先建模标签的生成过程,而是直接学习“给定输入如何输出标签”,就像策划师不研究宾客身世,只看现场如何排座。

Q2. BIO标注中的B表示什么含义?

单选题 · easy

  • A.Behind,实体末尾
  • B.Begin,实体开头← 正确答案
  • C.Between,实体中间
  • D.Best,最优标签

答案:B。B是Begin的缩写,表示一个实体的第一个字。比如“北京”中“北”标B,“京”标I。它就像婚宴请柬上标注“这桌的领头宾客”,标志着一个识别片段的起点。

Q3. 以下哪些任务可以转化为序列标注问题?

多选题 · easy

  • A.命名实体识别← 正确答案
  • B.中文分词← 正确答案
  • C.文本情感分类
  • D.词性标注← 正确答案

答案:ABD。NER、分词和词性标注都需要为每个字或词预测一个标签,天然适合序列标注。文本情感分类是对整句话输出一个类别,不涉及逐字贴标签,不是序列标注任务。

Q4. CRF中的归一化因子Z(X)作用是什么?

单选题 · mid

  • A.提高模型训练速度
  • B.让所有路径概率之和为1← 正确答案
  • C.压缩特征数值范围
  • D.消除过拟合现象

答案:B。Z(X)是对所有候选标签路径的指数得分求和,作为分母把各项得分转化成合法概率,确保所有路径概率之和为1。它好比全场所有座次方案的总评分,除以它后,每套方案才是一个比例。

Q5. 标注偏置问题的主要根源是什么?

单选题 · mid

  • A.训练数据太少
  • B.局部归一化导致转移概率偏向少数出路← 正确答案
  • C.特征函数设计过于复杂
  • D.归一化因子计算错误

答案:B。HMM这类模型在每个状态上单独归一化转移概率到和为1,导致转移选择少的状态获得不相称的高概率。这就像宾客只看到两个空位就急着坐下,反而忽略了全场更优的位置。

Q6. CRF特征函数的两大类型是什么?

多选题 · mid

  • A.状态特征← 正确答案
  • B.转移特征← 正确答案
  • C.卷积特征
  • D.注意力特征

答案:AB。CRF特征函数分为状态特征和转移特征。状态特征观察当前字与标签的关系,转移特征观察前后标签的衔接关系。两者共同打分,对应座次规矩中“看宾客本人”和“看邻座关系”两类规则。

Q7. HMM的观察独立性假设是指什么?

单选题 · mid

  • A.每个字只由当前标签决定← 正确答案
  • B.每个字之间完全无关
  • C.标签之间完全独立
  • D.模型与训练数据无关

答案:A。HMM假设当前观测字只与当前隐藏标签有关,不受前后字影响。这限制了它使用词典、前后缀等丰富特征,好比策划师判断宾客只看他此刻的着装,不看他与谁同行。

Q8. 线性链CRF与一般CRF的关系是什么?

单选题 · hard

  • A.线性链CRF要求标签呈链式依赖,是一般CRF的特例← 正确答案
  • B.一般CRF是线性链CRF的简化版本
  • C.两者没有本质区别
  • D.线性链CRF只能处理连续文本

答案:A。一般CRF可以定义在任意图结构上,而线性链CRF限制为相邻标签前后依赖的链式结构,更适合序列标注任务。这相当于把复杂社交网简化为“邻座关系”,让婚宴统筹更聚焦于座次顺序。

Q9. CRF相比HMM的优势体现在哪些方面?

多选题 · hard

  • A.可以使用任意特征← 正确答案
  • B.全局归一化消除标注偏置← 正确答案
  • C.不需要标注数据
  • D.判别式建模更贴合任务← 正确答案

答案:ABD。CRF作为判别式模型直接优化条件概率,特征函数不受独立性假设约束,可以自由使用词典和上下文特征;全局归一化让路径级比较更公平。它依然需要标注数据进行有监督训练,所以C错误。

Q10. 在CRF训练中,若要计算某个特征函数的梯度,通常需要什么操作?

单选题 · extreme

  • A.求解所有路径的特征期望← 正确答案
  • B.随机打乱所有训练样本
  • C.降低所有特征权重
  • D.增加归一化因子数值

答案:A。CRF训练依赖最大似然估计,特征函数的梯度等于“真实路径下该特征期望”减去“模型分布下该特征期望”,后者需要对所有路径求和,因此前向-后向算法必不可少。这就像婚宴统筹要评估每一套座次方案的出现概率,才能调整每条规矩的权重。