自然语言处理--HMM,MEMM和CRF(一)

写在前面 这一系列是要详细讨论这三种模型内在的关联与区别,深入地探讨每个模型内在的机理,希望自己可以成功。首先声明,仅作笔记用。
朴素贝叶斯(NB) 我们先不直接说HMM,MEMM,CRF这三种模型的事,在此之前,我们先来聊聊朴素贝叶斯。
假设我们有训练样本 x1,x2,...,xnx 1 , x 2 , . . . , x n ,它们属于K个标签内。每一个样本有 dd 维特征即, xi={xi1,xi2,...,xid}x i = { x 1 i , x 2 i , . . . , x d i } .我们的目前是对如下的联合概率进行建模:

P(Y=yk,X=xi)P ( Y = y k , X = x i )
更具体点,就是
P(Y=yk,X1=x1,X2=x2,...,Xd=xd)=P(Y=yk)∏j=1dP(Xj=xj|Y=yk)P ( Y = y k , X 1 = x 1 , X 2 = x 2 , . . . , X d = x d ) = P ( Y = y k ) ∏ j = 1 d P ( X j = x j | Y = y k )
这里用到了 特征条件独立假设,这也是朴素贝叶斯之所以称为“朴素”的原因。这里不多说。
模型已经有了,下面我们来看看怎么从训练样本中得到参数估计
极大似然估计(MLE) 当有一个测试样本输入模型时,我们的目标是:

argmaxyp(y,x1,x2,...,xd)=argmaxy(p(y)∏j=1dpj(x|y)a r g max y p ( y , x 1 , x 2 , . . . , x d ) = a r g max y ( p ( y ) ∏ j = 1 d p j ( x | y )
我们有两种参数需要估计。第一个是:
p(y)p ( y )
就是每一个样本属于某类的概率。
第二个是
pj(x|y)p j ( x | y )
即在类确定的情况下,第 jj个特征是 xx的概率。
很多书里说到NB的时候都会直接给极大似然估计的结果:

p(y)=∑ni=1[[yi=y]]n=count(y)np ( y ) = ∑ i = 1 n [ [ y i = y ] ] n = c o u n t ( y ) n
简单点,就是某个样本属于某类的概率等于该类样本占所有样本的比例。
pj(x|y)=∑ni=1[[y(i)=yandxij=x]]∑(i=1)n[[y(i)=y]]=countj(x|y)count(y)p j ( x | y ) = ∑ i = 1 n [ [ y ( i ) = y a n d x j i = x ] ] ∑ ( i = 1 ) n [ [ y ( i ) = y ] ] = c o u n t j ( x | y ) c o u n t ( y )
打这么多字只是为了严谨,大家直接看最右就好了,我想这很容易理解。
但是, 为什么呢??? 这是的估计结果似乎是合理的,符合直觉的,但是大家有没有想过这个结果是怎么来的呢?
我就跑个题带着大家一起来看一看。
对于朴素贝叶斯模型使用MLE,对数似然函数为:

L(θ)=∑i=1nlogp(x(i),y(i))=∑i=1nlog(p(y(i))∏j=1dpj(x(i)j|y(i)))=∑i=1nlogp(y(i))+∑i=1nlog(∏j=1dpi(x(i)j|y(i)))=∑i=1nlogp(y(i))+∑i=1n∑j=1dlogpi(x(i)j|y(i))L ( θ ) = ∑ i = 1 n log ? p ( x ( i ) , y ( i ) ) = ∑ i = 1 n log ? ( p ( y ( i ) ) ∏ j = 1 d p j ( x j ( i ) | y ( i ) ) ) = ∑ i = 1 n log ? p ( y ( i ) ) + ∑ i = 1 n log ? ( ∏ j = 1 d p i ( x j ( i ) | y ( i ) ) ) = ∑ i = 1 n log ? p ( y ( i ) ) + ∑ i = 1 n ∑ j = 1 d log ? p i ( x j ( i ) | y ( i ) )
上面的推算应该都能理解,不难。我们现在先看上式的前半部分。

∑i=1nlogp(y(i))∑ i = 1 n log ? p ( y ( i ) )
我们将这一部分重写成:
∑i=1nlogp(y(i))=∑i=1n∑y=1k[[y(i)=y]]logp(y)=∑y=1k∑i=1n[[y(i)=y]]logp(y)=∑y=1klogp(y)∑i=1n[[y(i)=y]]=∑y=1k(logp(y))?count(y)∑ i = 1 n log ? p ( y ( i ) ) = ∑ i = 1 n ∑ y = 1 k [ [ y ( i ) = y ] ] log ? p ( y ) = ∑ y = 1 k ∑ i = 1 n [ [ y ( i ) = y ] ] log ? p ( y ) = ∑ y = 1 k log ? p ( y ) ∑ i = 1 n [ [ y ( i ) = y ] ] = ∑ y = 1 k ( log ? p ( y ) ) ? c o u n t ( y )
上面的过程只要第一步理解了,往下应该就顺理成章了。
同样的,后半部分可以写成:

∑i=1n∑j=1dlogpi(x(i)j|y(i))=∑j=1d∑y=Y∑xcountj(x|y)logpj(x|y)∑ i = 1 n ∑ j = 1 d log ? p i ( x j ( i ) | y ( i ) ) = ∑ j = 1 d ∑ y = Y ∑ x c o u n t j ( x | y ) log ? p j ( x | y )【自然语言处理--HMM,MEMM和CRF(一)】
那么整个对数似然函数就可以写成

∑y=1k(logp(y))?count(y)+∑j=1d∑y=Y∑xcountj(x|y)logpj(x|y)∑ y = 1 k ( log ? p ( y ) ) ? c o u n t ( y ) + ∑ j = 1 d ∑ y = Y ∑ x c o u n t j ( x | y ) log ? p j ( x | y )
p(y)p ( y )跟后半部分没有关系,我们只用看前半部分, 要使半部分取得最大值,这里不加证明的给出结论(主要是打公式太麻烦了,以后补)。
p(y)=count(y)np ( y ) = c o u n t ( y ) n
同样后半部分:
pj(x|y)=countj(x|y)∑xcountj(x|y)p j ( x | y ) = c o u n t j ( x | y ) ∑ x c o u n t j ( x | y )
好,现在关于NB ,我们说完了第一阶段,但是我们的目的并不仅仅是学习一下NB模型而已,诸君忘了我们的宏图大业了吗,哈哈。
下面我们转入第二个问题。
无标签时的朴素贝叶斯模型参数估计问题 我们设想一种情况,假如训练样本里的标签全部丢失了,我们怎么去估计NB 模型的参数呢?对于任何的样本 xx ,其在模型下出现的概率为:

p(x)=∑i=1kp(x,y)=∑y=1k(p(y)∏i=1dp(xj|y))p ( x ) = ∑ i = 1 k p ( x , y ) = ∑ y = 1 k ( p ( y ) ∏ i = 1 d p ( x j | y ) )
记住这个公式,下一篇会发现有一个类似的,我们还会提到。给定一个训练集( x(i)x ( i )),i=1, …,n, 我们依然求诸极大似然估计,对数似然函数为:
L(θ)=∑i=1nlogp(x(i))=∑i=1nlog∑y=1k(p(y)∏i=1dp(x(i)j|y))L ( θ ) = ∑ i = 1 n log ? p ( x ( i ) ) = ∑ i = 1 n log ? ∑ y = 1 k ( p ( y ) ∏ i = 1 d p ( x j ( i ) | y ) )
我们的目标从没有变过,最大化之。观察上式,我们需要知道一个无标签的样本它属于某类的概率 p(y)p ( y )(这里符号和下文的 p(y)p ( y )意思不同),还需要知道 p(x(i)j|y)p ( x j ( i ) | y ),又因为我们已经丢失了标签,所以这就变得很困难了,极大似然估计在这种情况下显得无能为力。下面请出我们的主角 EM(expectation-maximization)算法。
EM算法在这种情况下会怎么做?
在这里我先不给出EM 算法的定义, 参数估计等等等等,如果要是那样的话,这篇博客就没什么意义了。我就是想避开抽象的算法理解,一点点引出问题的解决办法。
现在我们面临的难点是什么?不知道训练集中每个样本的标签,那么对 p(y)p ( y ) , pj(x|y)p j ( x | y ) 都无从下手。那我们就先猜,没错,就是猜。
初始化:
我们先赋予类概率 p(y)p ( y ) 以及 pj(x|y)p j ( x | y ) 随机值(就是猜嘛), p0(y)p 0 ( y ) ,p0j(x|y)p j 0 ( x | y ) , 但是,需要满足以下的条件:
(1)p0(y)p 0 ( y )>=0 , 且∑ky=1p0(y)=1∑ y = 1 k p 0 ( y ) = 1
(2)对所有的 y,i,xy , i , x , 有 p0j(x|y)>=0p j 0 ( x | y ) >= 0 , 且对所有的类,所有的特征维度: ∑p0j(x|y)=1∑ p j 0 ( x | y ) = 1
(暂停总结一下,我们现在知道了(猜到)什么?, 1.样本集每个类出现的概率,以及2.在类确定的情况下,样本每一维特征取值的概率, 也就是我们本来应该知道,但是因为标签丢失我们无法知道的东西)。
迭代:
既然我们已经知道(猜到)了我们想知道的东西,我们就可以继续往下算了。我们不是需要知道每个样本属于某类的概率吗?那我们可以这样算:

δ(y|i)=p(y|x(i); θt?1)=qt?1(y)∏dj=1qt?1j(x(i)j|y)∑ky=1qt?1(y)∏dj=1qt?1j(x(i)j|y)δ ( y | i ) = p ( y | x ( i ) ; θ t ? 1 ) = q t ? 1 ( y ) ∏ j = 1 d q j t ? 1 ( x j ( i ) | y ) ∑ y = 1 k q t ? 1 ( y ) ∏ j = 1 d q j t ? 1 ( x j ( i ) | y )
(注意区别 p(y)p ( y )和 δ(y|i)δ ( y | i )一个是某类出现的概率, 一个是一个样本属于某类的概率)然后最大化我们的目标函数:
∑i=1n∑y=Yδ(y|i)logp(x(i),y,θ)∑ i = 1 n ∑ y = Y δ ( y | i ) log ? p ( x ( i ) , y , θ )
(不知道有没有注意到此时要最大化的目标函数和上面提到的无标签时的朴素贝叶斯模型参数估计的对数似然函数不一样)
最后更新参数,今天真的写了太多公式了,直接给出结果吧,
pt(y)=1n∑i=1nδ(y|i)p t ( y ) = 1 n ∑ i = 1 n δ ( y | i )
ptj(x|y)=∑i:x(i)j=xδ(y|i)∑iδ(y|i)p j t ( x | y ) = ∑ i : x j ( i ) = x δ ( y | i ) ∑ i δ ( y | i )
直到迭代完成。
好,我们似乎用EM算法解决了无标签时的NB参数估计问题。可是EM 算法到底是什么呢?为什么EM算法可以这样解决无标签时的朴素贝叶斯模型参数估计呢?我们要学的还远没有结束。
下篇

    推荐阅读