在自然语言处理(NLP)中,序列标注是核心任务之一,涉及为输入序列的每个单元分配标签:
传统方法面临两大挑战:
CRF的核心突破:2001年Lafferty提出CRF,结合了判别式模型的优势和全局特征建模能力,解决了MEMM的标注偏置问题。
条件随机场是给定输入序列X条件下,输出序列Y的条件概率分布:
P ( Y ∣ X ) = 1 Z ( X ) exp ( ∑ t = 1 T ∑ k λ k f k ( y t − 1 , y t , X , t ) ) P(Y|X) = \frac{1}{Z(X)} \exp\left(\sum_{t=1}^T \sum_{k} \lambda_k f_k(y_{t-1}, y_t, X, t)\right) P(Y∣X)=Z(X)1exp(t=1∑Tk∑λkfk(yt−1,yt,X,t))
其中:
s l ( y t , X , t ) = { 1 如果 y t = 名词 且 X t 首字母大写 0 否则 s_l(y_t, X, t) = \begin{cases} 1 & \text{如果 } y_t=\text{名词} \text{ 且 } X_t \text{首字母大写} \\ 0 & \text{否则} \end{cases} sl(yt,X,t)={10如果 yt=名词 且 Xt首字母大写否则
t m ( y t − 1 , y t ) = { 1 如果 y t − 1 = 动词 , y t = 名词 0 否则 t_m(y_{t-1}, y_t) = \begin{cases} 1 & \text{如果 } y_{t-1}=\text{动词}, y_t=\text{名词} \\ 0 & \text{否则} \end{cases} tm(yt−1,yt)={10如果 yt−1=动词,yt=名词否则
训练目标:最大化对数似然
L ( λ ) = ∑ i = 1 N log P ( Y ( i ) ∣ X ( i ) ) − 1 2 σ 2 ∥ λ ∥ 2 L(\lambda) = \sum_{i=1}^N \log P(Y^{(i)}|X^{(i)}) - \frac{1}{2\sigma^2} \|\lambda\|^2 L(λ)=i=1∑NlogP(Y(i)∣X(i))−2σ21∥λ∥2
解码算法:维特比算法(动态规划)
Y ^ = arg max Y P ( Y ∣ X ) \hat{Y} = \arg\max_Y P(Y|X) Y^=argYmaxP(Y∣X)
计算配分函数 Z ( X ) Z(X) Z(X)和特征期望:
Z ( X ) = ∑ Y exp ( ∑ t , k λ k f k ( y t − 1 , y t , X , t ) ) Z(X) = \sum_Y \exp\left(\sum_{t,k} \lambda_k f_k(y_{t-1}, y_t, X, t)\right) Z(X)=Y∑exp t,k∑λkfk(yt−1,yt,X,t)
E P ( Y ∣ X ) [ f k ] = ∑ y t − 1 , y t P ( y t − 1 , y t ∣ X ) f k ( y t − 1 , y t , X , t ) E_{P(Y|X)}[f_k] = \sum_{y_{t-1},y_t} P(y_{t-1},y_t|X) f_k(y_{t-1},y_t,X,t) EP(Y∣X)[fk]=yt−1,yt∑P(yt−1,yt∣X)fk(yt−1,yt,X,t)
指标 | 计算公式 | 适用场景 |
---|---|---|
准确率 | T P + T N T P + F P + T N + F N \frac{TP+TN}{TP+FP+TN+FN} TP+FP+TN+FNTP+TN | 均衡标签分布 |
F1值 | 2 × P r e c i s i o n × R e c a l l P r e c i s i o n + R e c a l l 2 \times \frac{Precision \times Recall}{Precision + Recall} 2×Precision+RecallPrecision×Recall | 非均衡标签 |
序列准确率 | 完全匹配序列数 总序列数 \frac{\text{完全匹配序列数}}{\text{总序列数}} 总序列数完全匹配序列数 | 严格任务 |
模型 | F1值 | 训练速度 | 内存占用 |
---|---|---|---|
HMM | 78.2% | 快 | 低 |
MEMM | 81.5% | 中 | 中 |
CRF | 91.3% | 慢 | 高 |
BiLSTM-CRF | 93.5% | 很慢 | 很高 |
命名实体识别系统:
import sklearn_crfsuite
# 特征提取函数
def word2features(sent, i):
word = sent[i][0]
features = {
'bias': 1.0,
'word.lower()': word.lower(),
'word[-3:]': word[-3:],
'word.isupper()': word.isupper(),
'word.istitle()': word.istitle(),
}
return features
# 训练CRF模型
crf = sklearn_crfsuite.CRF(
algorithm='lbfgs',
c1=0.1,
c2=0.1,
max_iterations=100
)
crf.fit(X_train, y_train)
蛋白质二级结构预测:
图像分割中的CRF后处理:
P ( X ∣ I ) = 1 Z ( I ) exp ( − ∑ i ψ u ( x i ) − ∑ i < j ψ p ( x i , x j ) ) P(X|I) = \frac{1}{Z(I)} \exp\left(-\sum_i \psi_u(x_i) - \sum_{i
其中:
基础理论:
Q:解释CRF如何解决MEMM的标注偏置问题?
A:MEMM采用局部归一化,导致模型倾向于选择转移数少的状态路径;CRF通过全局归一化避免了这个问题。
数学推导:
Q:推导CRF的梯度更新公式?
A:对数似然梯度为:
∂ L ∂ λ k = ∑ i ( f k ( y i , t − 1 , y i , t , x i , t ) − E P ( Y ∣ x i ) [ f k ] ) − λ k σ 2 \frac{\partial L}{\partial \lambda_k} = \sum_i \left( f_k(y_{i,t-1},y_{i,t},x_i,t) - E_{P(Y|x_i)}[f_k] \right) - \frac{\lambda_k}{\sigma^2} ∂λk∂L=i∑(fk(yi,t−1,yi,t,xi,t)−EP(Y∣xi)[fk])−σ2λk
实践应用:
Q:如何处理CRF中的长距离依赖?
A:可采用高阶CRF或半马尔可夫CRF:
P ( Y ∣ X ) ∝ exp ( ∑ t ∑ r = 1 R ∑ k λ k f k ( y t − r + 1 : t , X , t ) ) P(Y|X) \propto \exp\left(\sum_{t} \sum_{r=1}^R \sum_k \lambda_k f_k(y_{t-r+1:t}, X, t)\right) P(Y∣X)∝exp(t∑r=1∑Rk∑λkfk(yt−r+1:t,X,t))
奠基之作:
Conditional Random Fields: Probabilistic Models for Segmenting and Labeling Sequence Data (Lafferty et al., 2001)
高效训练算法:
Stochastic Gradient Descent Training for L1-regularized Log-linear Models (Tsuruoka et al., ACL 2009)
深度学习扩展:
Bidirectional LSTM-CRF Models for Sequence Tagging (Huang et al., 2015)
问题 | 解决方案 | 代表方法 |
---|---|---|
训练慢 | 近似训练 | 伪似然, 对比散度 |
特征工程 | 自动特征学习 | BiLSTM-CRF |
长距离依赖 | 高阶CRF | 半马尔可夫CRF |
稀疏特征 | 正则化 | L1/L2正则化 |
模型 | 类型 | 图结构 | 训练复杂度 |
---|---|---|---|
HMM | 生成式 | 有向图 | O ( T ⋅ L 2 ) O(T \cdot L^2) O(T⋅L2) |
MEMM | 判别式 | 有向图 | O ( T ⋅ L 2 ) O(T \cdot L^2) O(T⋅L2) |
CRF | 判别式 | 无向图 | O ( T ⋅ L 2 ) O(T \cdot L^2) O(T⋅L2) |
MRF | 生成式 | 无向图 | NP-Hard |
模型 | F1值 | 训练速度 | 所需数据量 |
---|---|---|---|
CRF | 91.3% | 1x | 50k tokens |
BiLSTM-CRF | 93.5% | 0.3x | 30k tokens |
BERT-CRF | 94.8% | 0.1x | 10k tokens |
FLERT | 95.2% | 0.05x | 5k tokens |
graph_rep = GNN(sentence_graph)
emissions = LSTM(words_emb)
tags = CRF.decode(emissions + graph_rep)
医学文本分析:
金融信息抽取:
多模态CRF:
P ( Y ∣ X text , X image ) = 1 Z exp ( E text + E img ) P(Y|X_{\text{text}}, X_{\text{image}}) = \frac{1}{Z} \exp(E_{\text{text}} + E_{\text{img}}) P(Y∣Xtext,Ximage)=Z1exp(Etext+Eimg)