条件随机场conditional random field

主要翻译自http://blog.echen.me/2012/01/03/introduction-to-conditional-random-fields/,原作者是MIT的大神,加入了一些我自己的理解.

问题由来

给你某人一天内一系列生活照片,让你为每一张照片添加label(比如唱歌,跳舞,吃饭...),你要怎么做.

一种方式是忽略照片的顺序性,训练出一个classifier.比如你可以拿一个月的快照作为训练样本,然后训练出一个模型.这样来一个新图片,背景很暗,拍摄于早上,模型可能会将其判断为睡觉.图片里车很多,模型可能判断为驾车.

但是忽略照片的连续性,可能会丢失很多信息,比如说你看到一张图片,是嘴巴的特写,那么怎么知道这张图是在唱歌还是在吃饭?这时候我们既要参考这张图片之前的照片,如果之前的照片是在吃饭,那么当前图片很可能也是吃饭,如果前一张是在唱歌或者跳舞,那么当前图片很可能就是在唱歌.

即为了让我们的分类器更准确,我们需要考虑照片之间的关联,这就是crf大显身手的地方.下面以词性标注来说明条件随机场crf(conditional random field)

什么是词性标注?

比如“Bob drank coffee at Starbucks”,Bob是名词,drank是动词...,最终我们的目标是把每个词的词性标注出来-->“Bob (NOUN) drank (VERB) coffee (NOUN) at (PREPOSITION) Starbucks (NOUN)”

首先,我们要有一组特征函数.

Feature Functions in a CRF

In a CRF, each feature function is a function that takes in as input:

  • a sentence s
  • the position i of a word in the sentence
  • the label li of the current word
  • the label li−1 of the previous word

特征函数的输出是一个实数(实际应用中通常就是0或1)

注意:这里为了简化讨论,我们认为当前词的label只与它前面的一个词的label有关,这实际上是linear-chain CRF的一个特例.

例如,某个单词前面一个词是"very",一个可能的特征函数可以度量我们猜测当前单词应该被标记为形容词的程度。这个后面具体会举例,别心急,慢慢看.

Features to Probabilities

上面我们有一组feature function,可以得到很多数,现在我们要把这些数转换为概率.
\(score(l | s) = \sum_{j = 1}^m \sum_{i = 1}^n \lambda_j f_j(s, i, l_i, l_{i-1})\)
\(\lambda_j\)表示\(f_j\)的权重.这样对输入的一个有n个word的sentence s,我们有m个feature function,我们综合考虑这些feature function,则我们可以得到一个score。
通过指数化和正则化,我们将其转换为0-1之间的一个概率值.

是不是感觉和逻辑回归似曾相识?实际上crf可以理解为序列版本的逻辑回归.

That’s because CRFs are indeed basically the sequential version of logistic regression: whereas logistic regression is a log-linear model for classification, CRFs are a log-linear model for sequential labels.

下面看几个具体的feature function的例子:

  • f1(s,i,li,li−1)=1 if li= ADVERB and the ith word ends in “-ly”; 0 otherwise. ** If the weight λ1 associated with this feature is large and positive, then this feature is essentially saying that we prefer labelings where words ending in -ly get labeled as ADVERB.

  • f2(s,i,li,li−1)=1 if i=1, li= VERB, and the sentence ends in a question mark; 0 otherwise. ** Again, if the weight λ2 associated with this feature is large and positive, then labelings that assign VERB to the first word in a question (e.g., “Is this a sentence beginning with a verb?”) are preferred.

  • f3(s,i,li,li−1)=1 if li−1= ADJECTIVE and li= NOUN; 0 otherwise. ** Again, a positive weight for this feature means that adjectives tend to be followed by nouns.

  • f4(s,i,li,li−1)=1 if li−1= PREPOSITION and li= PREPOSITION. ** A negative weight λ4 for this function would mean that prepositions don’t tend to follow prepositions, so we should avoid labelings where this happens.

  • 如果第i个词为副词,并且以ly结尾,则f1()=1,否则为0. 如果权重λ1很大,意味着我们倾向于认为ly结尾的词被认为是副词

  • f2() if i=1,li=动词,句子以问号结尾.则f2=1,否则f2=0. 如果我们给这个函数一个正数权重λ2,意味着我们倾向于将问句的第一个词认为是动词,例如“Is this a sentence beginning with a verb?"中我们倾向于认为"is"是个动词

  • f3() if li-1=形容词,li=名词,则f3()=1,否则f3()=0. 如果我们给这个函数一个正数权重,意味着我们倾向认为形容词后接的是名词

  • f4() if li-1为介词,li为介词,则f4()=1. 我们给这个函数一个负数权重,意味着我们认为介词后面还接介词 这种情况不太可能

总结一下:要构造一个crf,你需要事先定义一系列的feature function.然后赋以相应的权重,将其score相加,再转换为0-1之间的概率值.

条件随机场crf和隐含马尔科夫模型hmm之间的关系

实际上hmm是crf的一种特例. 每一个hmm都可以用某一种crf表达.
这部分待写了hmm的文章以后,日后补充.

Learning Weights

如何给我们的feature function找到合适的权重?
不出意外的,我们会想到梯度下降法.
假设我们已经有了大量的训练集(比如大量已经做了词性标注的语句)。
在刚开始的时候,我们给每一个feature function一些随机的权重.

对每个样本,我们都重复上述过程,直到误差达到某个很小的阈值.

  • 对每一个feature function,计算概率梯度
  • 梯度的第一项表示的是在真实label下特征函数f的贡献,第二项表示的是当前模型下的期望贡献.
  • 将λi沿着梯度方向移动,`\(\alpha\)是学习率.
  • 重复上述步骤直到停止条件满足

简言之,就是每一步都考虑diff=我们希望模型学到的-模型当前真正学到的,每一次λi的调整都朝着使diff减小的方向调整.

Finding the Optimal Labeling

假设我们已经训练好了一个crf model. 拿到一个新的句子,怎么给出一个合理的label呢(比我拿到句子:我爱你 是标注成:名词/动词/名词还是名词名词名词还是...?)
最直观的思路就是对每一种label,计算p(l|s).但是考虑一个句子有m个词,每个词有k个词性,就得有\(k^m\)种可能.复杂度太高了.
实际上是用a (polynomial-time) dynamic programming algorithm算法来计算的,类似于HMM中的维特比算法.

条件随机场crf和卷积神经网络cnn的思路上有很多相似的地方,cnn中卷积层和池化层提取出不同角度的特征,crf中预先定义好很多的特征函数.都是通过梯度下降更新各个特征的权重值,以达到最优化误差的目的.

猜你喜欢

转载自www.cnblogs.com/sdu20112013/p/10370334.html