最近在做序列标注的相关任务,为了理解bi-lstm + crf的原理及细节,找了很多相关资料,以及代码实现,这里分享给大家并附上一些自己的理解。
CRF
相关资料推荐
关于crf,我看了很多资料,这里推荐几个 - 英文的crf tutorial - 李航的统计学习方法 这两个讲的很细,公式很多,很多新入坑的小白看了肯定一头雾水,这里推荐一个知乎大神的回答,通俗易懂,有一些机器学习基础的都可以看懂。 - 知乎Scofield的回答
简单总结
这里我简单总结一下,以命名实体识别任务举例,我们有这样一组已标注的数据,B表示一个实体的开头,I表示当前词为命名实体的后面部分,O表示不是命名实体。
the(B) wall(I) street(I) journal(I) reported(O) today(O) that(O) apple(B) corporation(I) made(O) money(O)
很明显"the wall street journal"(华尔街日报)、"apple corporation"(苹果公司)为命名实体。
如果我们有这样一组已标注的数据
每个 x_i 是输入序列,y_i为一个标注序列
我们的目标是学习出一组条件概率分布模型, 即找到一组参数 theta
使得
简单来说一组参数theta可以唯一确定一组模型,我们需要找到一组最优参数使得我训练数据中 x->y 的概率最大化。将上述最大化的目标函数取负,转化为最小化问题,即可用反向传播算法进行优化,找到近似最优参数theta。
好了有了目标就有了方向,下面的问题就是如何设计一个模型,对一个由x到y的序列映射进行打分(可以看做是可能性的大小),即上述公式中的Score(x, y)。在crf模型中我们有一个简单的假设,即当前输出的标签只和上一级输出的标签以及当前的输入有关,所以Score(x, y)应该由两部分组成,一个是转移特征概率,一个是状态特征概率。什么意思呢,转移特征概率是指前一个输出标签为 B 的前提下我当前输出标签为某个值比如 I 的概率大小。而状态特征是指我当前输入的词为 "wall" 的条件下,当前输出标签为某个值比如 I 的概率大小。
则Score(x, y)可以写成