先简单举个例子:
假设你有许多小明同学一天内不同时段的照片,从小明提裤子起床到脱裤子睡觉各个时间段都有(小明是照片控!)。现在的任务是对这些照片进行分类。比如有的照片是吃饭,那就给它打上吃饭的标签;有的照片是跑步时拍的,那就打上跑步的标签;有的照片是开会时拍的,那就打上开会的标签。问题来了,你准备怎么干?
一个简单直观的办法就是,不管这些照片之间的时间顺序,想办法训练出一个多元分类器。就是用一些打好标签的照片作为训练数据,训练出一个模型,直接根据照片的特征来分类。例如,如果照片是早上 6:00 拍的,且画面是黑暗的,那就给它打上睡觉的标签;如果照片上有车,那就给它打上开车的标签。
这样可行吗?
乍一看可以!但实际上,由于我们忽略了这些照片之间的时间顺序这一重要信息,我们的分类器会有缺陷的。举个例子,假如有一张小明闭着嘴的照片,怎么分类?显然难以直接判断,需要参考闭嘴之前的照片,如果之前的照片显示小明在吃饭,那这个闭嘴的照片很可能是小明在咀嚼食物准备下咽,可以给它打上吃饭的标签;如果之前的照片显示小明在唱歌,那这个闭嘴的照片很可能是小明唱歌瞬间的抓拍,可以给它打上唱歌的标签。
所以,为了让我们的分类器能够有更好的表现,在为一张照片分类时,我们必须将与它相邻的照片的标签信息考虑进来。这——就是条件随机场(CRF)大显身手的地方!
CRF:总的来说,就是有条件、有上下文式的考虑当前分类问题。
从例子说起——词性标注问题
啥是词性标注问题?
非常简单的,就是给一个句子中的每个单词注明词性。比如这句话:“Bob drank coffee at Starbucks”,注明每个单词的词性后是这样的:“Bob (名词) drank(动词) coffee(名词) at(介词) Starbucks(名词)”。
下面,就用条件随机场来解决这个问题。
以上面的话为例,有 5 个单词,我们将:(名词,动词,名词,介词,名词)作为一个标注序列,称为 l,可选的标注序列有很多种,比如 l 还可以是这样:(名词,动词,动词,介词,名词),我们要在这么多的可选标注序列中,挑选出一个最靠谱的作为我们对这句话的标注。
怎么判断一个标注序列靠谱不靠谱呢?
就我们上面展示的两个标注序列来说,第二个显然不如第一个靠谱,因为它把第二、第三个单词都标注成了动词,动词后面接动词,这在一个句子中通常是说不通的。
假如我们给每一个标注序列打分,打分越高代表这个标注序列越靠谱,我们至少可以说,凡是标注中出现了动词后面还是动词的标注序列,要给它负分!!
上面所说的动词后面还是动词就是一个特征函数,我们可以定义一个特征函数集合,用这个特征函数集合来为一个标注序列打分,并据此选出最靠谱的标注序列。也就是说,每一个特征函数都可以用来为一个标注序列评分,把集合中所有特征函数对同一个标注序列的评分综合起来,就是这个标注序列最终的评分值。
定义 CRF 中的特征函数
现在,我们正式地定义一下什么是 CRF 中的特征函数,所谓特征函数,就是这样的函数,它接受四个参数:
-
句子 s(就是我们要标注词性的句子)
-
i,用来表示句子 s 中第 i 个单词
-
l_i,表示要评分的标注序列给第 i 个单词标注的词性
-
l_i-1,表示要评分的标注序列给第 i-1 个单词标注的词性
它的输出值是 0 或者 1,0 表示要评分的标注序列不符合这个特征,1 表示要评分的标注序列符合这个特征。
**Note:**这里,我们的特征函数仅仅依靠当前单词的标签和它前面的单词的标签对标注序列进行评判,这样建立的 CRF 也叫作线性链 CRF,这是 CRF 中的一种简单情况。为简单起见,本文中我们仅考虑 线性链CRF
。
从特征函数到概率
定义好一组特征函数后,我们要给每个特征函数 f_j 赋予一个权重 λ_j。现在,只要有一个句子 s,有一个标注序列 l,我们就可以利用前面定义的特征函数集来对 l 评分。
pic1.PNG
上式中有两个求和,外面的求和用来求每一个特征函数 f_j 评分值的和,里面的求和用来求句子中每个位置的单词的的特征值的和。
对这个分数进行指数化和标准化,我们就可以得到标注序列 l 的概率值 p(l|s),如下所示:
pic2.PNG
几个特征函数的例子
前面我们已经举过特征函数的例子,下面我们再看几个具体的例子,帮助增强大家的感性认识。
pic3.PNG
当 l_i 是“副词”并且第 i 个单词以“ly”结尾时,我们就让 f1 = 1,其他情况 f1 为 0。不难想到,f1 特征函数的权重 λ1 应当是正的。而且 λ1 越大,表示我们越倾向于采用那些把以“ly”结尾的单词标注为“副词”的标注序列
pic4.PNG
如果 i=1,l_i=动词,并且句子 s 是以“?”结尾时,f2=1,其他情况 f2=0。同样,λ2 应当是正的,并且 λ2 越大,表示我们越倾向于采用那些把问句的第一个单词标注为“动词”的标注序列。
pic5.PNG
当 l_i-1 是介词,l_i 是名词时,f3 = 1,其他情况 f3=0。λ3 也应当是正的,并且 λ3 越大,说明我们越认为介词后面应当跟一个名词。
pic6.PNG
如果 l_i 和 l_i-1 都是介词,那么 f4 等于 1,其他情况 f4=0。这里,我们应当可以想到 λ4 是负的,并且 λ4 的绝对值越大,表示我们越不认可介词后面还是介词的标注序列。
好了,一个条件随机场就这样建立起来了,让我们总结一下:
为了建一个条件随机场,我们首先要定义一个特征函数集,每个特征函数都以整个句子 s,当前位置 i,位置 i 和 i-1 的标签为输入。然后为每一个特征函数赋予一个权重,然后针对每一个标注序列 l,对所有的特征函数加权求和,必要的话,可以把求和的值转化为一个概率值。
CRF 与逻辑回归的比较
观察公式:
是不是有点逻辑回归的味道?
事实上,条件随机场是逻辑回归的序列化版本。逻辑回归是用于分类的对数线性模型,条件随机场是用于序列化标注的对数线性模型。
CRF 与 HMM 的比较
对于词性标注问题,HMM 模型也可以解决。HMM 的思路是用生成办法,就是说,在已知要标注的句子 s 的情况下,去判断生成标注序列 l 的概率,如下所示:
pic7.PNG
这里:
p(l_i|l_i-1)是转移概率,比如,l_i-1 是介词,l_i 是名词,此时的 p 表示介词后面的词是名词的概率。
p(w_i|l_i)表示发射概率(emission probability),比如 l_i 是名词,w_i 是单词“ball”,此时的 p 表示在是名词的状态下,是单词“ball”的概率。
那么,HMM 和 CRF 怎么比较呢?
答案是:CRF 比 HMM 要强大的多,它可以解决所有 HMM 能够解决的问题,并且还可以解决许多 HMM 解决不了的问题。事实上,我们可以对上面的 HMM 模型取对数,就变成下面这样:
pic8.PNG
我们把这个式子与 CRF 的式子进行比较:
pic1.PNG
不难发现,如果我们把第一个 HMM 式子中的 log 形式的概率看做是第二个 CRF 式子中的特征函数的权重的话,我们会发现,CRF 和 HMM 具有相同的形式。
换句话说,我们可以构造一个 CRF,使它与 HMM 的对数形式相同。怎么构造呢?
对于 HMM 中的每一个转移概率 p(l_i=y|l_i-1=x),我们可以定义这样的一个特征函数:
pic9.PNG
该特征函数仅当 l_i = y,l_i-1=x 时才等于 1。这个特征函数的权重如下:
pic10.PNG
同样的,对于 HMM 中的每一个发射概率,我们也都可以定义相应的特征函数,并让该特征函数的权重等于 HMM 中的 log 形式的发射概率。
用这些形式的特征函数和相应的权重计算出来的 p(l|s)和对数形式的 HMM 模型几乎是一样的!
用一句话来说明 HMM 和 CRF 的关系就是这样:
每一个 HMM 模型都等价于某个 CRF
每一个 HMM 模型都等价于某个 CRF
每一个 HMM 模型都等价于某个 CRF
但是,CRF 要比 HMM 更加强大,原因主要有两点:
-
CRF 可以定义数量更多,种类更丰富的特征函数。HMM 模型具有天然具有局部性,就是说,在 HMM 模型中,当前的单词只依赖于当前的标签,当前的标签只依赖于前一个标签。这样的局部性限制了 HMM 只能定义相应类型的特征函数,我们在上面也看到了。但是 CRF 却可以着眼于整个句子 s 定义更具有全局性的特征函数,如这个特征函数:
pic4.PNG
如果 i=1,l_i=动词,并且句子 s 是以“?”结尾时,f2=1,其他情况 f2=0。
-
CRF 可以使用任意的权重 将对数 HMM 模型看做 CRF 时,特征函数的权重由于是 log 形式的概率,所以都是小于等于 0 的,而且概率还要满足相应的限制,如
pic11.PNG
但在 CRF 中,每个特征函数的权重可以是任意值,没有这些限制。
过些天加入推导过程。
作者:milter
链接:http://www.jianshu.com/p/55755fc649b1
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于