条件随机场在命名实体识别任务中的应用
0 引言
第一次接触条件随机场(简称CRF)是在做自然语言处理(简称NLP)中的命名实体识别(简称NER)任务,当时用的模型是非常流行的LSTM+CRF结构,实验效果也比较好,就目前而言,你可以将架构中的LSTM换成现在流行的BERT模型,实验效果就更好了。实验过程中基本调包就完事了,也没什么难度。那么问题来了,好像现在的NER任务都离不开CRF,所以决定要对CRF的主要思想一探究竟。
在学习CRF之前,查阅了相关资料,遗憾的是我还是没搞懂CRF。最近苦思冥想,总算是搞懂一点点了,遂记录于此。
在开始之前,我们需要一些前戏,你需要知道相关基础知识,这类知识网上很多,我在这里给出我个人觉得比较好的资料的链接:
- Stanford教授Daphne Koller 概率图模型 — 终极入门 第一讲 有向图模型与贝叶斯网络基础。这里给出第一讲的链接,其他内容可以在该博客中找到。
- 徐亦达老师关于HMM的b站视频讲解。这个就比较硬核了,需要看视频的同时下去查资料才能搞懂。
上面这两个推荐本文不会用到太多,但对于你理解其它经典教科书中所讲的内容大有益处。
1 条件随机场用于标注问题
本节主要介绍条件随机场在标注问题的应用,主要从使用CRF解决标注问题的第一篇论文说起(只介绍引言部分):据维基百科,线性链条件随机场应用于标注问题是由Lafferty等人于2001年提出的[1]。
为了清晰的介绍这篇论文的引言,本文将从以下两个点进行介绍:1、当前的方法在标注问题中有什么缺陷。2、如何改进或者缓解这种缺陷。
1.1 当前的方法在标注问题中有什么缺陷
在若干科学领域中,许多不同的问题引起了对序列进行分段和标记的需求,例如词性标注,中文句子分词等。隐马尔可夫模型(HMM)已广为人知,并且已广泛用于解决此类问题。HMM是生成模型,为成对的观测序列和标记序列分配联合概率,如词性标注,观测序列是句子中的一个个词,标记序列是词性标签。通常对参数进行训练,以使训练实例的联合概率最大。为了定义观测序列和标记序列的联合概率,生成模型需要枚举所有可能的观测序列,通常需要一种表示形式,其中观测是适合任务的原子实体,例如单词。特别地,表示多个交互特征或观测值的长期依赖关系是不切实际的,因为此类模型的推理问题难以解决。
这种困难是将条件模型视为替代方案的主要动机之一。
最大熵马尔可夫模型(MEMM)是有条件的概率序列模型,它具有上述所有的优点。在MEMM中,每个源状态都有一个指数模型,该模型将观察特征作为输入,并输出可能的下一个状态的分布。这些指数模型通过最大熵框架中的适当迭代缩放方法进行训练。
MEMM存在一个弱点,称之为标签偏差问题:离开给定状态的转移仅相互竞争,而不与模型中的所有其他转移竞争。用概率术语来说,转移分数是在给定当前状态和观察序列的情况下可能的下一个状态的条件概率,
p
(
y
t
+
1
∣
y
t
,
X
)
p(y_{t+1}|y_t, X)
p(yt+1∣yt,X)。转移分数的每个状态的归一化意味着分数质量的守恒,其中到达状态的所有质量必须在可能的后续状态之间分配。观察可以影响哪些目的地状态获得质量,但不会影响要传递的总质量。这导致偏向具有较少输出跃迁的状态。在极端情况下,具有单个输出转移的状态实际上会忽略观察。 在那些情况下,与HMM不同,Viterbi解码无法基于分支点之后的观察来降级分支,并且状态转移结构的状态链稀疏连接的模型无法正确处理。 MEMM中的马尔可夫假设和类似的状态条件模型以一种与连续状态之间的实际依赖性不匹配的方式将一个状态的决策与将来的决策隔离开来。
小结:1、HMM的推理很复杂。2、MEMM存在标签偏差问题。
1.2 如何改进或者缓解这种缺陷
论文使用条件随机场(CRF)来解决上面的问题,它是一种序列建模框架,既具有MEMM的所有优点,又可以从原理上解决标签偏差问题。CRF和MEMM之间的关键区别在于,MEMM使用每个状态的指数模型来确定给定当前状态下,下一状态的条件概率,而CRF对于给定观察序列的整个标签序列的联合概率具有单个指数模型。因此,可以在不同状态之间权衡不同特征的权重。
还可以将CRF视为具有未归一化转变概率的有限状态模型。 但是,与其他一些加权有限状态方法不同,CRF在可能的标签上分配了明确定义的概率分布,并通过最大似然或MAP估计进行训练。 此外,损失函数是凸的,确保收敛到全局最优。
这篇论文还描述两种训练程序并草绘收敛性证明。该论文的实验结果,表明CRF解决了经典版本的标签偏差问题,而且更重要的是,当真实数据分布具有比模型更高的依存关系时,CRF的性能优于HMM和MEMM。
对于引言这节的内容,把里面的细节找资料搞清楚了,去找工作面试还是有点用,人家说你还有点水平,全都是套路。哈哈哈哈哈哈!!!!!
2 以命名实体识别为例
在命名实体识别任务中,有一个非常经典的架构,就是LSTM-CRF架构。现在我们将这个架构拆成两个部分:1、LSTM。2、CRF。注意,这个两个部分单独拿出来都能完成命名实体识别任务,问题就是效果好不好。进一步的,为什么将这两个算法结合起来比他们单独使用效果要好呢?这是个开放式的问题,可以从两个角度来解答。一个是从模型的上下文编码能力来看,另一个是从标签的解码来看,就是标签之间的依赖关系;例如:只用LSTM做命名实体识别,它的分类是用sofrmax函数,也就是假设这些实体标签是独立的。随便在知网上找几篇使用LSTM-CRF架构的命名实体论文的实验,发现性能依次为LSTM+CRF > LSTM > CRF。基于以上的两个角度,我们找一个编码能力强的模型就能提高命名实体的性能,例如BERT+CRF。所以,NER问题背后的主要挑战是,由于模型只能基于上下文进行识别,因此太少而无法出现在训练集中的实体无法识别(标签偏差问题)。解决此问题最简单的想法是对每个单词进行独立的分类,如直接使用LSTM分类,它假设命名实体标签是独立的,但事实并非如此。
最后,设计一个命名实体识别算法,可以从模型的编码能力和标签之间的依赖关系来考虑。例如我选用BERT作为编码器(还可以多特征融合在一起),对于标签之间的依赖关系来设计CRF的特征函数等(甚至你可以造一个和CRF类似的算法)。
使用CRF来做命名实体识别,输入数据是序列,输出也是序列,并且在对数据点进行预测时必须考虑先前的上下文。为此,我们将使用具有多个输入值的特征函数:
f
(
X
,
i
,
y
i
−
1
,
y
i
)
f(X,i,y_{i-1},y_i)
f(X,i,yi−1,yi)
其中:
X
=
输
入
向
量
集
i
=
我
们
想
要
预
测
的
数
据
点
的
位
置
y
i
−
1
=
数
据
点
i
−
1
的
标
签
y
i
=
数
据
点
i
的
标
签
\begin{aligned} X &= 输入向量集 \\ i &= 我们想要预测的数据点的位置 \\ y_{i-1} &= 数据点i-1的标签 \\ y_i &= 数据点i的标签 \end{aligned}
Xiyi−1yi=输入向量集=我们想要预测的数据点的位置=数据点i−1的标签=数据点i的标签
3 CRF解决NER问题的主要过程
在条件随机场中,我们计算条件概率:
p
(
y
∣
X
)
p(y|X)
p(y∣X)
即在给定输入序列
X
X
X的情况下,输出向量
y
y
y的概率。
为了预测适当的序列,我们需要使概率最大化,然后采用具有最大概率的序列:
y
^
=
arg
max
y
p
(
y
∣
X
)
\hat{y}=\mathop{\arg\max}_{y} p(y|X)
y^=argmaxyp(y∣X)
如上一节所述,我们将使用特征函数
f
f
f。输出序列被建模为特征函数的归一化乘积:
p
(
y
∣
X
,
λ
)
=
1
Z
(
X
)
exp
∑
i
=
1
n
∑
j
λ
j
f
i
(
X
,
i
,
y
i
−
1
,
y
i
)
p(y|X, \lambda)=\frac{1}{Z(X)}\exp \sum_{i=1}^{n} \sum_{j}\lambda_j f_i(X,i,y_{i-1},y_i)
p(y∣X,λ)=Z(X)1expi=1∑nj∑λjfi(X,i,yi−1,yi)
为什么要归一化,这是因为函数
exp
\exp
exp里面的内容不是概率的,文献[2]有解释。至于这里为什么要用函数
exp
\exp
exp,李航老师的《统计机器学习》里面有解释。
其中
Z
(
X
)
Z(X)
Z(X)为归一化因子:
Z
(
X
)
=
∑
y
∈
y
^
∑
i
=
1
n
∑
j
λ
j
f
i
(
X
,
i
,
y
i
−
1
,
y
i
)
Z(X)=\sum_{y\in \hat{y}}\sum_{i=1}^{n}\sum_{j} \lambda_j f_i(X,i,y_{i-1},y_i)
Z(X)=y∈y^∑i=1∑nj∑λjfi(X,i,yi−1,yi)
λ
\lambda
λ是特征函数的权重,由梯度下降法学习得到。为了评估参数
λ
\lambda
λ,我们将使用极大似然估计。因此模型在特征函数上是log-linear:
L
(
X
,
λ
,
y
)
=
−
log
{
∏
k
=
1
m
p
(
y
k
∣
X
k
,
λ
}
L(X,\lambda,y)=-\log \left \{ \prod_{k=1}^{m} p(y^k|X^k,\lambda \right \}
L(X,λ,y)=−log{k=1∏mp(yk∣Xk,λ}
进一步得:
L
(
X
,
λ
,
y
)
=
−
∑
k
=
1
m
{
log
1
Z
(
X
m
)
exp
(
∑
i
=
1
n
∑
j
λ
j
f
i
(
X
m
,
i
,
y
i
−
1
k
,
y
i
k
)
)
}
L(X,\lambda,y)=-\sum_{k=1}^{m} \left \{ \log \frac{1}{Z(X_m)} \exp (\sum_{i=1}^{n} \sum_{j}\lambda_j f_i(X^m, i, y_{i-1}^k,y_{i}^k)) \right \}
L(X,λ,y)=−k=1∑m{logZ(Xm)1exp(i=1∑nj∑λjfi(Xm,i,yi−1k,yik))}
下一步,对
λ
\lambda
λ求导:
∂
L
(
X
,
λ
,
y
)
∂
λ
=
−
1
m
∑
k
=
1
m
F
j
(
y
k
,
X
k
)
+
∑
k
=
1
m
p
(
y
∣
X
k
,
λ
)
F
j
(
y
,
X
k
)
\frac{\partial L(X,\lambda,y)}{\partial \lambda}=\frac{-1}{m}\sum_{k=1}^{m}F_j(y^k,X^k)+\sum_{k=1}^{m} p(y|X^k,\lambda)F_j(y,X^k)
∂λ∂L(X,λ,y)=m−1k=1∑mFj(yk,Xk)+k=1∑mp(y∣Xk,λ)Fj(y,Xk)
其中:
F
j
(
y
,
X
)
=
∑
i
=
1
n
f
i
(
X
,
i
,
y
i
−
1
,
y
i
)
F_j(y,X)=\sum_{i=1}^{n}f_i(X,i,y_{i-1},y_i)
Fj(y,X)=i=1∑nfi(X,i,yi−1,yi)
对于参数优化,使用基于梯度下降的方法:
λ
=
λ
+
α
(
∑
k
=
1
m
F
j
(
y
k
,
X
k
)
+
∑
k
=
1
m
p
(
y
∣
X
k
,
λ
)
F
j
(
y
,
X
k
)
)
\lambda=\lambda+\alpha(\sum_{k=1}^{m}F_j(y^k,X^k)+\sum_{k=1}^{m} p(y|X^k,\lambda)F_j(y,X^k))
λ=λ+α(k=1∑mFj(yk,Xk)+k=1∑mp(y∣Xk,λ)Fj(y,Xk))
假设现在我们已经训练好了我们的CRF模型,现在有一个新的句子需要识别出包含的命名实体,换句话说我们如何给这个句子打上最合适的标签呢?一个天真的想法就是为每个可能的标签计算
p
(
y
∣
X
)
p(y|X)
p(y∣X),然后选择使该概率最大化的标签。但是,由于对大小为
k
k
k的标签集和长度为
m
m
m的句子有
k
m
k^m
km种可能的标签标注方案,因此,此方法将必须检查标签的指数数量。另一个更好的方案是使用Viterbi算法,该算法不再本文的范围内,读者可以查看相关资料。
如果你还没理解上述过程,可以观看徐亦达老师关于HMM的b站视频讲解。
4 CRF中的特征函数
上一节中,我们从全局概括了CRF,我们心中还有一些问题需要知道:特征函数是什么?如何设计特征函数?现在就对这些问题进行阐述;最后以CRF++工具中的特征模板配置来结束本小节。
4.1 特征函数是什么
我在第2节中简要说了一下为什么需要特征函数,以及给出了特征函数的数学表达式。这里还需要提醒一下,在命名实体识别任务中,特征函数的输出是一个实数,通常为0或1。
4.2 特征函数举例
对于命名实体识别,考虑这样一个例子: X = { U . N . o f f i c i a l E k e u s h e a d s f o r B a g h d a d } X= \{U.N. official Ekeus heads for Baghdad\} X={U.N.officialEkeusheadsforBaghdad},对应的标签是 y = { B − O R G , O , B − P E R , O , O , B − L O C } y=\{B-ORG, O, B-PER, O, O, B-LOC\} y={B−ORG,O,B−PER,O,O,B−LOC}。接下来我们要为这个实例设计特征函数,这个特征函数不止一个,而是很多个,假设特征函数集为 F = { f 1 , f 2 , . . . , f k , . . . , f n } F=\{f_1, f_2, ..., f_k ,..., f_n\} F={f1,f2,...,fk,...,fn}。从HMM模型那里得到启发,我们一个简单的想法就是当前标签与上一个标签有关,那么特征函数可设计为:
-
f
i
j
(
X
,
t
,
y
t
,
y
t
−
1
)
=
1
i
f
y
t
=
i
a
n
d
y
t
−
1
=
j
∀
i
,
j
∈
y
f_{ij}(X, t, y_t, y_{t-1}) = 1\ if\ y_t =i\ and\ y_{t-1}= j\ \forall i,j \in y
fij(X,t,yt,yt−1)=1 if yt=i and yt−1=j ∀i,j∈y。这里的
i
,
j
i,j
i,j表示标签集和中的任意标签。在我们的例子中假设标签集合为
y
=
{
B
−
P
E
R
,
I
−
P
E
R
,
B
−
L
O
C
,
I
−
L
O
C
,
B
−
O
R
G
,
I
−
O
R
G
,
O
}
y=\{B-PER, I-PER, B-LOC, I-LOC, B-ORG, I-ORG, O\}
y={B−PER,I−PER,B−LOC,I−LOC,B−ORG,I−ORG,O}。如果我们规定只有满足下列条件时,特征函数等于1:
{
j
=
B
−
O
R
G
,
i
=
I
−
O
R
G
}
,
{
j
=
B
−
P
E
R
,
i
=
B
−
O
R
G
}
\{j=B-ORG, i=I-ORG\}, \{j=B-PER, i=B-ORG\}
{j=B−ORG,i=I−ORG},{j=B−PER,i=B−ORG}。上面只有两个约束,那么我们的特征函数集就有两个特征函数。如果你有100个约束,那么特征函数就有100个,从而特征函数集的大小为100。像这样的约束还有很多,你可以根据自己的数据自己定义约束。这种特征函数有一个名字叫做label-label特征。
除了上面的举例之外,还有很多类型的特征,这方面的参考资料可以阅读论文《An Introduction to Conditional Random Fields》的第2.5和2.6小节[2]。本节的例子也来自于这篇论文。
4.3 CRF++工具的使用
由于这个工具很早就有了,网络上有很多的教程,都写得比较好,我就不在这里重复造轮子了,读者可自行百度。
总结
本文简要的阐述了CRF在命名实体中的应用。本文首先介绍了将CRF用在命名实体识别任务的论文的引言,探寻作者当时是怎么想到这个点。接着本文顺着该作者的思路和当前多数人的介绍简要阐述了CRF模型中特征函数的由来,这些都是启发性的介绍,主要时为了降低理解难度。然后,根据命名实体任务,介绍了CRF解决该问题的步骤,让我们有一个宏观的直觉。最后,本文引用文献[3]的例子进一步加深对特征函数的理解。
这篇文章只算得上是科普性读物,严格意义上的公式推导还请各位读者参见其他大佬的公式推导。最后,我们在水论文毕业的时候,根据自己的数据特点从两个方面来考虑:
- 模型对文本的编码能力,比如可以使用BERT,你自己也可以搞些花里胡哨的模型堆叠或各种特征融合(词性特征,位置特征等等)。
- CRF的特征函数设计。这方面的特征有很多,参考论文[3]。
不过就目前的趋势来看,有的人从模型的鲁棒性来考虑,加入什么对抗训练。关键点还是在特征函数的设计,有的人在标签解码方面也做了工作。总之,遵循奥卡姆剃刀是没错的,谁设计的特征函数新颖或标签解码方式简单,谁就能水论文;前提是你设计的模型性能还看得过去。
参考文献
[1] Lafferty, J., McCallum, A., Pereira, F. Conditional random fields: Probabilistic models for segmenting and labeling sequence data. Proc. 18th International Conf. on Machine Learning. Morgan Kaufmann: 282–289. 2001.
[2] http://nooverfit.com/wp/stanford%e6%95%99%e6%8e%88daphne-koller-%e6%a6%82%e7%8e%87%e5%9b%be%e6%a8%a1%e5%9e%8b-%e7%bb%88%e6%9e%81%e5%85%a5%e9%97%a8-%e7%ac%ac%e4%b8%89%e8%ae%b2-%e9%a9%ac%e5%b0%94%e5%8f%af%e5%a4%ab/
[2] Learning M. An introduction to conditional random fields[J]. Machine Learning, 2011, 4(4): 267-373.