条件随机场更多应用是用在文本语言标注
为简单起见,本文中我们仅考虑线性链CRF。
入门实例:照片打标签
照片中显示6点拍摄,画面黑暗,可以给它打上睡觉的标签,如果有车,那就打上开车的标签。
就这么训练分类器,但是可行吗?
实际上,我们忽略了这些照片的时间顺序的问题,假如小明有一个闭嘴的照片,怎么分类呢?难以直接判断,需要参考前一个动作,如果之前的照片显示在吃饭,那么这可能在咀嚼食物准备下咽,如果之前的照片显示在唱歌,那么可能就是小明唱歌瞬间抓拍的,可以打上唱歌的标签。
所以,为了让分类器有更好的表现,必须将与它相邻的照片的标签信息考虑进来。
词性标注问题
“Bob drank coffee at Starbucks”
对他进行标注,我们将:(名词,动词,名词,介词,名词)作为一个标注序列,称为l,可选的标注序列有很多种,比如l还可以是这样:(名词,动词,动词,介词,名词),我们要在这么多的可选标注序列中,挑选出一个最靠谱的作为我们对这句话的标注。
怎么判断一个标注序列靠谱不靠谱呢?
就我们上面展示的两个标注序列来说,第二个显然不如第一个靠谱,因为它把第二、第三个单词都标注成了动词,动词后面接动词,这在一个句子中通常是说不通的。但是这只是人脑智能,我们是凭借经验判断的。
假如我们给每一个标注序列打分,打分越高代表这个标注序列越靠谱,我们至少可以说,凡是标注中出现了动词后面还是动词的标注序列,要给它负分!!
上面所说的动词后面还是动词就是一个特征函数,我们可以定义一个特征函数集合,用这个特征函数集合来为一个标注序列打分,并据此选出最靠谱的标注序列。也就是说,每一个特征函数都可以用来为一个标注序列评分,把集合中所有特征函数对同一个标注序列的评分综合起来,就是这个标注序列最终的评分值。
定义CRF中的特征函数
现在,我们正式定义一下什么是CRF中的特征函数,所谓特征函数,就是这样的函数,它接受四个参数:
- 句子s(就是我们要标注词性的句子)
- i i i,用来表示句子s中第 i i i个单词
- l i l_i li,表示要评分的标注序列给第 i i i个单词标注的词性
- l i − 1 l_{i-1} li−1,表示要评分的标注序列给第 i − 1 i-1 i−1个单词标注的词性
它的输出值是0或者1:
- 0表示要评分的标注序列不符合这个特征
- 1表示要评分的标注序列符合这个特征。
Note: 这里,我们的特征函数仅仅依靠当前单词的标签和它前面的单词的标签对标注序列进行评判,这样建立的CRF也叫作线性链CRF,这是CRF中的一种简单情况。为简单起见,本文中我们仅考虑线性链CRF。
从特征函数到概率
定义好一组特征函数后,我们要给每个特征函数 f j f_j fj赋予一个权重 λ j λ_j λj。现在,只要有一个句子 s s s,有一个标注序列 l l 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 ) score(l|s)= \sum_{j=1}^m \sum_{i=1}^n λ_jf_j(s,i,l_i,l_{i-1}) score(l∣s)=∑j=1m∑i=1nλjfj(s,i,li,li−1)
个人见解:
- 只有前一个对后一个有影响,不会隔代影响
- i是句子中词语遍历,j是特征遍历
上式中有两个求和,外面的求和用来求每一个特征函数 f j f_j fj评分值的和,里面的求和用来求句子中每个位置的单词的的特征值的和。
对这个分数进行指数化和标准化,我们就可以得到标注序列l的概率值 p ( l ∣ s ) p(l|s) p(l∣s),如下所示:
p ( l ∣ s ) p(l|s) p(l∣s) = s c o r e ( l ∣ s ) ∑ l ′ e x p [ s c o r e ( l ′ ∣ s ) ] \frac{score(l|s)}{\sum_{l'}exp[score(l'|s)]} ∑l′exp[score(l′∣s)]score(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 ′ ) ] \frac{exp[\sum_{j=1}^m \sum_{i=1}^n λ_jf_j(s,i,l_i,l_{i-1})]}{\sum_{l'}exp[\sum_{j=1}^m \sum_{i=1}^n λ_jf_j(s,i,l'_i,l'_{i-1})]} ∑l′exp[∑j=1m∑i=1nλjfj(s,i,li′,li−1′)]exp[∑j=1m∑i=1nλjfj(s,i,li,li−1)]
几个特征函数的例子
f
1
(
s
,
i
,
l
i
,
l
i
−
1
)
=
1
f_1(s,i,l_i,l_{i-1}) = 1
f1(s,i,li,li−1)=1
当
l
i
l_i
li是“副词”并且第
i
i
i个单词以
“
l
y
”
“ly”
“ly”结尾时,我们就让
f
1
f_1
f1 = 1,其他情况
f
1
f_1
f1为0。不难想到,
f
1
f_1
f1特征函数的权重
λ
1
λ_1
λ1应当是正的。而且
λ
1
λ_1
λ1越大,表示我们越倾向于采用那些把以
“
l
y
”
“ly”
“ly”结尾的单词标注为“副词”的标注序列。
f
2
(
s
,
i
,
l
i
,
l
i
−
1
)
=
1
f_2(s,i,l_i,l_{i-1}) = 1
f2(s,i,li,li−1)=1
如果
i
=
1
i=1
i=1,
l
i
l_i
li=动词,并且句子s是以“?”结尾时,
f
2
=
1
f_2=1
f2=1,其他情况
f
2
=
0
f_2=0
f2=0。同样,
λ
2
λ_2
λ2应当是正的,并且
λ
2
λ_2
λ2越大,表示我们越倾向于采用那些把问句的第一个单词标注为“动词”的标注序列。
好了,一个条件随机场就这样建立起来了,让我们总结一下:
为了建一个条件随机场,我们首先要定义一个特征函数集,每个特征函数都以整个句子s,当前位置i,位置i和i-1的标签为输入。然后为每一个特征函数赋予一个权重,然后针对每一个标注序列l,对所有的特征函数加权求和,必要的话,可以把求和的值转化为一个概率值。
CRF与逻辑回归的比较
观察公式:
p
(
l
∣
s
)
p(l|s)
p(l∣s) =
s
c
o
r
e
(
l
∣
s
)
∑
l
′
e
x
p
[
s
c
o
r
e
(
l
′
∣
s
)
]
\frac{score(l|s)}{\sum_{l'}exp[score(l'|s)]}
∑l′exp[score(l′∣s)]score(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
′
)
]
\frac{exp[\sum_{j=1}^m \sum_{i=1}^n λ_jf_j(s,i,l_i,l_{i-1})]}{\sum_{l'}exp[\sum_{j=1}^m \sum_{i=1}^n λ_jf_j(s,i,l'_i,l'_{i-1})]}
∑l′exp[∑j=1m∑i=1nλjfj(s,i,li′,li−1′)]exp[∑j=1m∑i=1nλjfj(s,i,li,li−1)]
是不是有点逻辑回归的味道?
事实上,条件随机场是逻辑回归的序列化版本。逻辑回归是用于分类的对数线性模型,条件随机场是用于序列化标注的对数线性模型。
CRF与HMM(隐马尔可夫模型)的比较
对于词性标注问题,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∣s)=p(l1)∏ip(li∣li−1)p(wi∣li)
这里:
p ( l i ∣ l i − 1 ) p(l_i|l_{i-1}) p(li∣li−1)是转移概率,比如, l i − 1 l_{i-1} li−1是介词, l i l_i li是名词,此时的p表示介词的概率。
p ( w i ∣ l i ) p(w_i|l_i) p(wi∣li)表示发射概率,比如 l i l_i li是名词, w i w_i wi是单词 " b a l l " "ball" "ball",此时的 p p p表示在是名词的状态下,是单词 " b a l l " "ball" "ball"的概率。
那么,HMM和CRF怎么比较呢?
答案是:CRF比HMM要强大的多,它可以解决所有HMM能够解决的问题,并且还可以解决许多HMM解决不了的问题。事实上,我们可以对上面的HMM模型取对数,就变成下面这样:
l o g p ( l ∣ s ) = l o g p ( l 0 ) + ∑ i l o g p ( l i ∣ l i − 1 ) + ∑ i l o g 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) logp(l∣s)=logp(l0)+∑ilogp(li∣li−1)+∑ilogp(wi∣li)
我们把这个式子与CRF的式子进行比较:
s c o r e ( l ∣ s ) = ∑ j = 1 m ∑ i = 1 n λ j f j ( s , i , l i , l i − 1 ) score(l|s)= \sum_{j=1}^m \sum_{i=1}^n λ_jf_j(s,i,l_i,l_{i-1}) score(l∣s)=∑j=1m∑i=1nλjfj(s,i,li,li−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) p(li=y∣li−1=x),我们可以定义这样的一个特征函数:
f x , y ( s , i , l i , l i − 1 ) = 1 f_{x,y}(s,i,l_i,l_{i-1}) = 1 fx,y(s,i,li,li−1)=1
该特征函数仅当 l i = y , l i − 1 = x l_i=y,l_{i-1}=x li=y,li−1=x时才等于1,这个特征函数的权重如下:
w x , y = l o g p ( l i = y ∣ l i − 1 = x ) w_{x,y} = logp(l_i = y|l_{i-1} = x) wx,y=logp(li=y∣li−1=x)
同样的,对于HMM中的每一个发射概率,我们也都可以定义相应的特征函数,并让该特征函数的权重等于HMM中的log形式的发射概率。
用这些形式的特征函数和相应的权重计算出来的p(l|s)和对数形式的HMM模型几乎是一样的!
用一句话来说明HMM和CRF的关系就是这样:
每一个HMM模型都等价于某个CRF
每一个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 f2(s,i,li,li−1)=1
如果 i = 1 , l i i=1,l_i i=1,li = 动词,并且句子 s s s是以?结尾时, f 2 = 1 f_2=1 f2=1,其他情况 f 2 = 0 f_2 = 0 f2=0。 -
CRF可以使用任意的权重 将对数HMM模型看做CRF时,特征函数的权重由于是log形式的概率,所以都是小于等于0的,而且概率还要满足相应的限制,如:
0 < = p ( w i ∣ l i ) < = 1 , ∑ w p ( w i = w ∣ l i ) = 1 0 <= p(w_i|l_i) <= 1, \sum_wp(w_i=w|l_i) = 1 0<=p(wi∣li)<=1,∑wp(wi=w∣li)=1
但在CRF中,每个特征函数的权重可以是任意值,没有这些限制。