本文主要介绍HMM和CRF两种模型。
一、HMM模型
我们以序列标注为例来引入HMM模型。
我们怎么产生一个句子,方法可以是先根据语法产生一个词性序列,然后由每个词性产生一个词(借助词典,这个词典是词性到词的映射,一个词性对应多个词)。如下示意图
这里我们就有了词序列和词性序列的pair
给一个词序列,那么产生该词序列的词性序列是什么呢?
上面的计算用到了贝叶斯条件概率公式。忽略分母
,问题就转化为求联合概率P(x,y)上了,我们要找的词性序列y就是使得P(x,y)最大的那个y。
那么P(x,y)怎么算呢?
上式是建立在马尔可夫假设基础之上,即 1)
时刻的tag只收前一时刻
时刻的tag影响;2)
时刻的发射概率只受
时刻的tag影响。
上面的所有概率,比如
,
都是从训练数据中直接统计得到。
我们要找
,使得
在计算的时候你可以穷举出所有可能的y,然后计算每个P(x|y),但是这样的y有可能非常的多,穷举的计算开销太大,这种方法失效,取而代之的是Viterbi Algorithm,该算法专门用来解决给定观测序列,求最有可能的隐藏序列的问题。
HMM存在的问题
HMM有“脑补问题“,HMM可能会给在training data中没见过的序列以很高的概率,参见下面的例子
我们假设transition probability和emission probability为
,
来做一个填空题
通过概率来算的话应该是V,但是在training data却有一个D的数据。这就是HMM的脑补现象。
HMM的脑补现象有时候是好事,比如你的训练数据很少。
HMM为什么会有这种脑补能力呢?是因为HMM的transition probability和emission probability是相互独立的。为了解决这个问题,你可以用更复杂的模型,使transition probability和emission probability是dependent的,但这些方法比较复杂,下面将要介绍的CRF,虽然transition probability和emission probability也是相互独立的,但却可以解决问题。
二、CRF
1.CRF引入
如果说HMM是作用在序列上的朴素贝叶斯,那么CRF就是逻辑回归
—— John Lafferty
CRF和逻辑回归是什么关系?
逻辑回归表达式如下,
下图是一个CRF中的概率问题
可见二者的形式较为接近。
2.CRF模型参数、训练
我们假设联合概率
满足
,
其中
是一个feature vector,
是一个weight vector,
是需要从训练数据中学习的参数。
咋一看,你可能会觉得CRF和HMM根本不一样,但其实二者很像
从这里我们可以知道,
就是
、
这些,而
其实就是
、
。
在CRF模型中,
是作为参数,在训练的过程中进行优化的,这一点与HMM不同,HMM的
、
是直接从训练数据中统计得到,不需要优化。
CRF是怎么训练的呢?(HMM是没有训练过程的)
从上面的CRF的训练目标中我们可以也可以从中看出其与HMM的区别。HMM模型,我们找到使得
最大的y,我们只考虑
,而忽略条件概率的分母
;而在CRF中,我并不忽略
,我们的优化目标除了使得
很大之外还要使得
越小越好。
有了优化目标我们可以使用SGD来进行优化。
那我们来计算
,我们先计算
,后半部分的计算同理可得。
后半部分的计算按照同样的原理算完之后得到
怎么理解上式?如果(s,t)在训练数据
出现,则增加
,否则减小
。
对于后半部分的
,李宏毅老师说可以通过
Viterbi algorithm进行计算,暂时没理解是怎么算的。
所以参数的迭代过程如下
CRF的inference和HMM相同,也是用的Viterbi Algorithm
三、CRF的一般化:从log-linear model到MEMMs、CRFs
1.log-linear model
是输入数据(例如word),
是label(比如名词、动词、介词),我们用
来表示条件概率。我们定义一个feature vector
,我们还定义一个参数向量
。基于这些定义,我们有log-linear model
这公式看着很陌生,其实如果
,而
,就变成了HMM~~
而在log-linear模型中,
待估算的参数,而
可以是任意的形式。
模型的目标函数是log-likelihood 函数,
而最优的参数
满足
那怎么找到最优的
呢?
先把
初始化为0向量,然后执行梯度上升
其中的梯度计算
形式上是和第二部分的梯度计算结果高度相似的。
2.MEMMs
maximum-entropy Markov models,即最大熵马尔可夫模型,它是以log-linear模型为基础。
是输入序列,
是状态序列,
我们对条件分布
建模,对该分布进行分解
上面的(1)式是没问题的,在naive-bayes就曾见过类似的分解。
做一个微小的验证,(1)式的右边=
(2)式是加入了independence assumption,就像HMM那样,第
个位置的state只和
位置的state有关。
基于上面的假设,我们有在每个位置
上的条件概率
可以看到在位置
处,分母中的feature vector
和输入序列
、位置
、
、
四个元素有关。
可以根据实际需要去定义,比如如果你认为
和
不会都为动词,那么你可以给
赋予一个很小的值,例如-10000。
MEMMs的decoding
与HMM类似,我们定义前向变量
,它表示时刻
到达状态
的最大概率
也就是
的递推式为
所以如果把
终止处的判断也类似与HMM
3.CRFs
与MEMMs一样,我们对条件概率
建模
我们也定义feature vector
,然后我们就有关于条件概率的计算
这里的
称为global feature vector(对比下下面的local feature vector),因为它扫描了整个序列
、
。那么怎么定义
呢?
这里的
只是feature vector的一维,共有
维,
for
,第
个feature vector的定义为
这里的
称为local feature vector。
CRFs的decoding
我们的目标是找到最优的序列
,使得
继续推导
所以我们的目标就转换为寻找
,使得
成分
可以为一种transition score,如果
到
的转换是合理的,相应地
值会比较大,反之
值会比较小。
与HMM、MEMMs类似,我们用viterb算法进行CRFs的decoding。
初始化
,递推方法为
终止处
CRFs的参数估计
带正则的目标函数
我们要找到能够最大化目标函数的参数向量
用梯度上升方法进行优化,梯度的计算为
右边第一项很好算,第二项难算,用到动态规划。
四、总结
HMM是生成模型,而MEMMs和CRFs是判别模型
五、概率图模型的应用
1.jieba分词
原理是HMM
2.CRF++
CRF++是CRF算法实现效果最好的工具,他可以用来做序列标注、实体识别、分词等任务。
CRF++的训练数据是如下
这个数据有三列,第一列是词语,第二列是词性(不是必须的),第三列是标注,也是我们要预测的标签。
CRF++最重要的一块内容就是特征模版,特征模版中包含了用户自己定义的若干特征,特征主要包含两大类,即Unigram和Bigram。
如下是一组Unigram的例子
U00:%x[-2,0]
U01:%x[-1,0]
U02:%x[0,0]
U03:%x[1,0]
U04:%x[2,0]
U05:%x[-1,0]/%x[0,0]
U06:%x[0,0]/%x[1,0]
U07:%x[-1,0]/%x[1,0]
U08:%x[0,1]
U09:%x[-1,1]/%x[0,1]
上面每一个元素称为一个特征模版?每一个特征模版都要去扫描整个句子,在句子的每一个位置,该特征模版都生成一个特征函数集合。
举例来说,我们假设有这样一个模版U10:%x[0,1]这个特征模版,它代表的是0行,1列的元素。这里的0行是相对概念(就是特征模版所扫描到的当前位置),1列是绝对位置,就是指的第2列。这个特征模版的含有是根据词语的词性去预测词语的标签。
我们假设当前输入的训练数据(一个句子)为
当我们扫描到句子的第一行时,我们生成如下一批特征函数
这些函数共有多少个?记第三列的标签共有
个,该模版关注的输入数据(也就是第二列)去重后数据共有
个,那么该特征模版在第一行会产生
个数值(0或1),
所以这个特征模版在整个句子上生成一个“特征矩阵“(里面的数字是我随便填的~)
上面只是一个特征模版的例子,那么你可以定义其他模版,比如你除了用第二列的词性预测标注外,你还需要第一列,即词汇本身,所以你还可以设计这样一个特征模版
UXX:%x[0,0],它会利用数据的第一列去生成特征。
再比如你可以设计特征模版UXX:%x[-1,1],它会关注上一个词的词性。
大部分情况下Unigram已经够了,而且生成的特征函数已经够多了。简单介绍一下Bigram,比如你建了一个B01:%x[0,1],它是要考虑当前行的标枪以及上一行的标签,生成如下特征函数
。
参考资料:
Log-Linear Models, MEMMs, and CRFs
Log-linear models and conditional random fields
conditional random fields:probability models for segmenting and labeling sequence data