CRF系列——一个简单的例子

我与影子孤独终老i 提交于 2019-11-30 22:05:28

CRF可以应用于对一串序列进行自动标注的问题。例如对文字序列进行词性标,即要自动判断句子中每个单词的词性。在这样的问题中,每一个词的标注结果,不仅依赖于该词语本身,还会依赖于其他词语的标注结果。CRF可以考虑到这样的依赖关系。

本文会以一个词性标注的应用为例,介绍CRF所解决的问题以及CRF模型的建立,学习与预测过程。

任务描述

词性标注(part-of-speech tagging),其目标就是对一个句子即一串单词的序列进行打标签(tagging),标注每个词的词性(ADJECTIVE, NOUN, PREPOSITION, VERB, ADVERB, ARTICLE)。我们假设在词性标准任务中,每个单词的词性不仅依赖其本身,而且也会依赖其前一个单词(这里做了简化,实际上每个单词的标注结果依赖更多东西)。

下面,我将针对对这个问题,建立一个简单的线性链条件随机场(linear-chain CRF)。并介绍这个CRF是如何表示上述的依赖关系,以及如何利用这个CRF来求解这个问题。

实际上,和其他的统计机器学习模型一样,我们有三个任务要完成:

1)指定模型参数(建立模型)

2)估计这些参数(学习)

3)利用这些参数进行预测(预测)

第一个任务——建立模型

特征函数

为了评价序列中每个单词属于各个tag的可能性,我们要根据单词的位置定义一系列特征函数(feature function),在线性链CRF模型中,特征函数表示如下:

其中$s$表示序列,$i$表示该词在序列中的位置,$l_{i}$表示对该单词标注的词性。

每个特征函数表示的是当位置为$i$时,当前位置单词标注为$l_i$且它前一个单词标注为$l_{i-1}$时的”可能性”,不过这个”可能性”并不是一个概率,它通常为0或1。

例如,可以定义如下特征函数:

$f_1(x,l_{i-1},l_{i},i)=cases{1,qquad l_i=ADVERB & 第i个单词以“-ly”结尾\ 0,qquad otherwise}$

$f_2(x,l_{i-1},l_{i},i)=cases{1,qquad i=1 & l_i=VERB & 句子以问号结束\ 0,qquad otherwise}​$

$f_3(x,l_{i-1},l_{i},i)=cases{1,qquad l_{i-1}=ADJECTIVE & l_i=NOUN\ 0,qquad otherwise}$

$f_4(x,l_{i-1},l_{i},i)=cases{1,qquad l_{i-1}=PREPERSITION & l_i=PREPERSITION\ 0,qquad otherwise}$

可以看到每一个特征函数的值只与当前位置和前一个位置有关,因此,可以说它有能力表示出我们之前所说的依赖关系。

模型

有了特征函数,我们就可以开始建立模型了。

所谓的建模,其实就是要表示出当给定句子,也就是单词序列$x={x_1x_2…x_N}$时,整个句子标注为$l=(l_1l_2…l_N)$的概率,即条件概率:

也就是当$X$给定的情况下,$l_1,l_2,…,l_N$的联合概率

权重

每个特征函数对整体的影响应该是不同的,因此,需要为每个函数加上权重$W=(w_1,w_2,…,w_M)$,权重越大,则该特征函数对标注结果的影响越大。那么每个特征函数的权重应该取多少呢?实际上这些权重$W$就是我们所说的参数了,而这些参数如何取值就是我们的第二个任务——参数学习,这个会在下一节讲。

非归一化概率

每个特征函数表示的是每个位置的可能性,那么整个句子被标注为$l=(1_1l_2…l_N)$的可能性当然就是各个位置的可能性的乘积。

不过为了方便计算,我们使用指数形式来表示特征:$exp(w_kf_k(s,l_{i-1},l_i,i))$。这样,我们的乘法就变成了加法:

参数模型

此时,我们的模型已经呼之欲出了,

现在所表示的”可能性”还不是一个概率,应该要做归一化处理,使它的值在0到1之间,因此引入归一化项$Z(x)$:

这样,我们所需要的条件概率就得到了:

其中$l$与$x$都是向量,$l=l_1l_2…l_N,x=x_1x_2…x_N$

小结

这就是我们的线性链CRF参数模型,它有能力表示这样的依赖关系:每个位置的标注结果不仅依赖于该位置的单词本身,同时还依赖前一个位置的标注结果。

同时我们还指定了模型的参数为每个特征函数的权重$W=(w_1,w_2,…,w_M)$。

第二个任务——学习

目标

学习的目标其实就是找到一组参数$w=(w_1,w_2,…,w_M)$,在训练数据序列$x=(x_1,x_2,…,x_N)$和标注$l=(l_1,l_2,…,l_N)$上,使条件概率$P(L=l|X=x)$最大化,即找到​$w^*$,使:

学习的方法有很多,例如梯度下降,最大似然估计等,这里就不多说了。

这样学习的任务看似就完成了,不过等等!问题好像并不是这么简单。

计算问题

我们再看看$Z(x)$:

看到最左边的求和:$sum_{L=l’}​$,这里其实写得简单了,$L​$是一个向量,所以其完整形式应该是:

即在每个位置上都有$m$种可能的标注结果,那么长度为$N$的句子,就有$m^N$种情况,即使每个单词只分两种词性,长度为15个单词的序列,其计算量都有$2^{15}$,因此想要直接计算$Z(x)$是很难的

前向-后向算法

我们所研究的对象,通常都是很长的序列,根据上面所说,对于这种高维数据,想要直接计算$Z(x)$是很难的,因此,在线性链CRF中,为了得到$Z(x)$需要前向-后向算法

对于前向-后向算法,在这里先不做过多说明,在之后的文章中会详细介绍。

小结

这样,我们第二个任务也搞定了。

参数的学习就是根据训练数据找到能使条件概率最大化的参数;

但是由于数据维度高,计算量很大,因此会使用前向-后向算法来计算线性链条件随机场的归一化项$Z(x)$。

第三个任务——预测

现在我们已经有了模型,并且在已知的数据集上得到了该模型最优的参数,接下来就是根据这个模型及参数对未知的数据进行推测了。具体到我们的词性标注问题,就是给定一个已知句子$x$,但是其标注未知,通过模型推测每个单词可能性最大的词性,即找到最优的一组$l^*$,使:

计算问题

这回我们谨慎一点,先看看计算有没有问题。

把公式展开:

我们只是要找到能使$P(L=l|X=x)$概率最大的一个$l$,而对于每一个$l$,$Z(x)$都是一样的,因此原问题变成:

太好了,$Z(x)$不用计算了。

不过为了找到最优的$l^*$,总不可能真的把每一个$l$都试一遍吧,这样计算量仍然很大。

那么维特比算法就是为了解决上述问题的,它利用了动态规划的思想,不过具体算法我们也先暂时不说,会在后面的文章里详细说明。

小结

这样,我们知道了如何利用建立好的模型以及学习好的参数,对词性未知的句子进行标注了。同时,为了得到这个最优的标注,需要使用维特比算法

总结

至此,我们通过一个词性标注的例子,了解了:

  1. CRF适用于这样的情况:对于多个位置的标注,每一个位置的标注结果,不仅与其本身有关,而且依赖于其他位置的标注结果。
  2. CRF与其他统计机器学习模型一样,可以分为三个部分,分别是:
    1. 模型的建立
    2. 参数的学习
    3. 推测
  3. 对于模型的建立,我们使用了特征函数,它保证了模型拥有表示我们所需的依赖关系的能力。
  4. 对于模型参数的学习以及结果的预测,发现高维数据带来很大的计算量,因此需要一些算法来简化计算。

但是,还有一些问题需要探索:

  1. CRF是一种概率图模型,那么什么是概率图模型?从概率图的角度我们怎么看条件随机场?其他的概率图模型又能解决什么样的问题?
  2. 我们在这里说的都是线性链条件随机场(Linear Chain CRF),那么其他形式的CRF是怎样的,它们能解决什么问题?
  3. 在线性链CRF中,为了解决计算问题,在学习和预测中所用到的前向-后向算法以及维特比算法分别是什么?
  4. 我们现在看到的是CRF在NLP方面的应用,那么在图像处理中,如何利用CRF提高预测效果?

参考资料

[1] introduction to conditional random fields

[2] 如何直观地理解条件随机场,并通过PyTorch简单地实现

[3] FCN(2)——CRF通俗非严谨的入门

[4] 李航. 统计学习方法[J]. 清华大学出版社, 北京, 2012.

原文:大专栏  CRF系列——一个简单的例子


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!