NLP进阶之(五)条件随机场CRF

1. 引入CRF

由于小明是一个IG控,在IG上po出了很多自己的照片,假设你有许多小明同学一天内不同时段的照片,现在任务是对照片进行分类,比如有些照片是吃饭,那么就给其打上吃饭的标签,有些照片是跑步,那么标签为跑步。但是照片太多了,这时候应该怎么办呢?
一个直观的方法就是,不管这些照片之间的时间顺序,想办法训练出一个多元分类器,就是用一些打好标签的照片作为训练数据,训练出一个分类模型,来对未分类的照片进行分类。如,照片是早上6点拍的,并且画面主体是黑暗的,那么可以打上睡觉的标签,照片是有车,那么就打上开车的标签。这样可行吗?初略思考下感觉还行,但实际上,我们忽略了照片之间的时间顺序这一重要信息,我们的分类器会有缺陷。举个例子,假如有一张小明闭着嘴的照片,怎么分类?显然难以直接判断,那么需要考虑闭嘴之前的照片,如果之前的照片现实小明在吃饭,那么这个闭嘴的照片很可能是小明在咀嚼食物准备下咽,可以给其打上吃饭的标签,可是如果之前的照片显示小明在唱歌,那这个闭嘴的照片很可能是小明唱歌瞬间的抓拍,可以给它打上唱歌的标签。这里就有混淆的分类,我们的分类器表现就会有很差的表现。
所以,为了让我们的分类器能够有更好的表现,在为一张照片分类时,我们必须将与它相邻的照片的标签信息考虑进来。这就是条件随机场(CRF)大显身手的地方。

1.1 词性标注问题

词性标注问题就是给一个句子中的每个单词注明词性,如“小明(名词)在(介词)星巴克(名词)喝(动词)咖啡(名词)。”
下面,我们就利用条件随机场来解决这个问题。
以上面的句子为例子,我们将:名词,介词,名词,动词,名词作为一个标注序列,称为L,可选的标注序列有多种,例如,L还可以是这样的:名词,动词,动词,介词,名词等,我们要在这么多可选的标注序列中,挑选出一个最靠谱的作为我们对这句话的词性标注。
那么我们如何判断一个标注序列是否靠谱?若使用人工来观察,显然第二个不如第一个靠谱,因为第二、三个词都标注为动词,动词后面接动词,在这个句子中通常是说不通的。
这里我们假设给每一个标注序列打分,打分越高代表这个标注序列越靠谱,我们至少可以说,凡是标注中出现动词后面还是动词的标注序列,都要给负分。那么怎么表示动词后面还是动词的序列呢?我们可以将动词后面还是动词视为一个特征函数,我们可以定义一个特征函数集合,用这个特征函数集来为一个标注序列打分,并据此选出最靠谱的标注序列。也就是说,每一个特征函数都可以用来为一个标注序列评分,把集合中所有特征函数对同一个标注序列的评分综合起来,就是这个标注序列最终的评分值。

1.2 定义CRF特征函数

现在,我们正式地定义一下什么是CRF中的特征函数,所谓特征函数,就是这样的函数,它接受四个参数:

  • 句子 s s (就是我们要标注词性的句子)
  • w i w_i ,用来表示句子 s s 中第 i i 个单词
  • l i l_i ,表示要评分的标注序列给第 i i 个单词标注的词性
    - l i 1 l_{i-1} ,表示要评分的标注序列给第 i 1 i-1 个单词标注的词性
    它的输出值是0,10表示要评分的标注序列不符合这个特征,1表示要评分的标注序列符合这个特征。
    Note:这里的特征函数仅仅依靠当前单词的标签和它前面的单词对序列进行评判,这样建立的CRF也叫作线性链CRF,这是CRF中的一种简单情况。为简单期间,我们仅考虑线性链CRF

1.3 从特征函数到概率

定义好一组特征函数后,我们要给每个特征函数 f j f_j 赋予一个权重 λ j λ_j 。现在,只要有一个句子 s s ,有一个标注序列 l l ,我们就可以利用前面定义的特征函数集来对 l l 评分。
s c o r e ( l s ) = j = 1 m i = 1 n λ j f j ( s , i , l i , l i 1 ) \boldsymbol{score(l|s)} = \sum_{j=1}^m \sum_{i=1}^n \lambda_j f_j(s,i,l_i,l_{i-1})
上式中有两个求和,外面的求和用来求每一个特征函数 f j f_j 评分值的和,里面的求和用来求句子中每个位置的单词的的特征值的和。
对这个分数进行指数化和标准化,我们就可以得到标注序列 l l 的概率值 p ( l s ) p(l|s) ,如下所示:

p ( l s ) = e x p [ s c o r e ( l s ) ] l e x p [ s c o r e ( l s ) ] = e x p [ j = 1 m i = 1 n λ j f j ( s , i , l i , l i 1 ) ] l e x p [ j = 1 m i = 1 n λ j f j ( s , i , l i , l i 1 ) ] \boldsymbol{p(l|s)} = \frac{exp[score(l|s)]}{\sum_{l'}exp[score(l'|s)]} =\frac{exp[ \sum_{j=1}^m \sum_{i=1}^n \lambda_j f_j (s,i,l_i,l_{i-1})]}{\sum_{l'}exp[ \sum_{j=1}^m \sum_{i=1}^n \lambda_j f_j (s,i,l'_i,l'_{i-1})]}

1.4 几个特征函数例子

前面我们已经举过特征函数的例子,下面我们再看几个具体的例子,帮助增强大家的感性认识。
f 1 ( s , i , l i , l i 1 ) = 1 f_1(s,i,l_i,l_{i-1})=1
对于英文单词来说,当 l i l_i 是“副词”并且第i个单词以ly结尾时,我们就让f1 = 1,其他情况f10。不难想到,f1特征函数的权重λ1应当是正的。而且λ1越大,表示我们越倾向于采用那些把以ly结尾的单词标注为“副词”的标注序列。
f 2 ( s , i , l i , l i 1 ) = 1 f_2(s,i,l_i,l_{i-1})=1
如果 i = 1 i=1 l i l_i 为动词,并且句子s是以结尾时, f 2 = 1 f_2=1 ,其他情况 f 2 = 0 f_2=0 。同样, λ 2 λ_2 应当是正的,并且 λ 2 λ_2 越大,表示我们越倾向于采用那些把问句的第一个单词标注为“动词”的标注序列。
f 3 ( s , i , l i , l i 1 ) = 1 f_3(s,i,l_i,l_{i-1})=1
l i 1 l_{i-1} 是介词, l i l_i 是名词时, f 3 = 1 f_3 = 1 ,其他情况 f 3 = 0 f_3=0 λ 3 λ_3 也应当是正的,并且 λ 3 λ_3 越大,说明我们越认为介词后面应当跟一个名词。

这样,一个条件随机场就这样建立起来了,让我们总结一下:
为了建一个条件随机场,我们首先要定义一个特征函数集,每个特征函数都以整个句子s,当前位置i,位置ii-1的标签为输入。然后为每一个特征函数赋予一个权重,然后针对每一个标注序列L,对所有的特征函数加权求和,必要的话,可以把求和的值转化为一个概率值。

2 CRF对比

2.1 CRF与逻辑回归比较

观察公式:
p ( l s ) = e x p [ s c o r e ( l s ) ] l e x p [ s c o r e ( l s ) ] = e x p [ j = 1 m i = 1 n λ j f j ( s , i , l i , l i 1 ) ] l e x p [ j = 1 m i = 1 n λ j f j ( s , i , l i , l i 1 ) ] \boldsymbol{p(l|s)} = \frac{exp[score(l|s)]}{\sum_{l'}exp[score(l'|s)]} =\frac{exp[ \sum_{j=1}^m \sum_{i=1}^n \lambda_j f_j (s,i,l_i,l_{i-1})]}{\sum_{l'}exp[ \sum_{j=1}^m \sum_{i=1}^n \lambda_j f_j (s,i,l'_i,l'_{i-1})]}

是不是有点逻辑回归的味道?
事实上,条件随机场是逻辑回归的序列化版本。逻辑回归是用于分类的对数线性模型,条件随机场是用于序列化标注的对数线性模型

##2.2 CRF与HMM的比较
对于词性标注问题,HMM模型也可以解决。HMM的思路是用生成办法,就是说,在已知要标注的句子s的情况下,去判断生成标注序列l的概率,如下所示:

p ( l , s ) = p ( l 1 ) i p ( l i l i 1 ) p ( w i l i ) p(l,s)=p(l_1)\prod_i p(l_i|l_{i-1})p(w_i|l_i)
这里, p ( l i l i 1 ) p(l_i|l_{i-1}) 是转移概率,比如, l i 1 l_{i-1} 是介词, l i l_i 是名词,此时的 p p 表示介词后面的词是名词的概率。
p ( w i l i ) p(w_i|l_i) 表示发射概率(emission probability),比如 l i l_i 是名词, w i w_i 是单词ball,此时的p表示在是名词的状态下,是单词ball的概率。
那么,HMM和CRF怎么比较呢?
答案是:CRF比HMM要强大的多,它可以解决所有HMM能够解决的问题,并且还可以解决许多HMM解决不了的问题。事实上,我们可以对上面的HMM模型取对数,就变成下面这样:
log p ( l , s ) = log p ( l 0 ) + i log p ( l i l i 1 ) + i log p ( w i l i ) \log p(l,s)=\log p(l_0) + \sum_i \log p(l_i|l_{i-1}) + \sum_i \log p(w_i|l_i) 我们把这个式子与CRF的公式比较:
s c o r e ( l s ) = j = 1 m i = 1 n λ j f j ( s , i , l i , l i 1 ) \boldsymbol{score(l|s)} = \sum_{j=1}^m \sum_{i=1}^n \lambda_j f_j(s,i,l_i,l_{i-1}) 不难发现,如果我们把第一个HMM式子中的log形式的概率看做是第二个CRF式子中的特征函数的权重的话,我们会发现,CRF和HMM具有相同的形式。
换句话说,我们可以构造一个CRF,使它与HMM的对数形式相同。怎么构造呢?
对于HMM中的每一个转移概率 p ( l i = y l i 1 = x ) p(l_i=y|l_{i-1}=x) ,我们可以定义这样的一个特征函数:
f x , y ( s , i , l i , l i 1 ) = 1 f_{x,y}(s,i,l_i,l_{i-1})=1 该特征函数仅当 l i = y l_i = y , l i 1 = x l_{i-1}=x 时才等于1。这个特征函数的权重如下:
w x , y = log p ( l i = y l i 1 = x ) w_{x,y}=\log p(l_i = y|l_{i-1}=x) 同样的,对于HMM中的每一个发射概率,我们也都可以定义相应的特征函数,并让该特征函数的权重等于HMM中的log形式的发射概率。
用这些形式的特征函数和相应的权重计算出来的 p ( l s ) p(l|s) 和对数形式的HMM模型几乎是一样的!
用一句话来说明HMM和CRF的关系就是这样:
每一个HMM模型都等价于某个CRF
但是,CRF要比HMM更加强大,原因主要有两点:

  • CRF可以定义数量更多,种类更丰富的特征函数。HMM模型具有天然具有局部性,就是说,在HMM模型中,当前的单词只依赖于当前的标签,当前的标签只依赖于前一个标签。这样的局部性限制了HMM只能定义相应类型的特征函数,我们在上面也看到了。但是CRF却可以着眼于整个句子s定义更具有全局性的特征函数,如这个特征函数:
    f 2 ( s , i , l i , l i 1 ) = 1 f_2(s,i,l_i,l_{i-1})=1 如果 i = 1 i=1 l i l_i =动词,并且句子s是以?结尾时, f 2 = 1 f_2=1 ,其他情况 f 2 = 0 f_2=0
  • CRF可以使用任意的权重。将对数HMM模型看做CRF时,特征函数的权重由于是`log``形式的概率,所以都是小于等于0的,而且概率还要满足相应的限制,如 0 < = p ( w i l i ) < = 1 , w p ( w i = w l 1 ) = 1 0 <= p(w_i|l_i) <=1, \sum_w p(w_i=w|l_1)=1 但在CRF中,每个特征函数的权重可以是任意值,没有这些限制。

3 参考链接

如何轻松愉快地理解条件随机场(CRF)?

猜你喜欢

转载自blog.csdn.net/qq_35495233/article/details/86623670