序列的算法(一·b)隐马尔可夫模型

序言

…..
本系列对算法的讲解都会从两篇部分予以呈现:

a. 湿货部分要浅入浅出,形象生动,读得明白。
b. 干货部分要一文以蔽之,公式罗列,看得通透;


下面是(一)的 b 部分内容


Unigram

Unigram模型认为序列中的每一项都是独立发生的,所以很自然,假设我们有N个序列,每个序列长度是 Mn ,那么整个序列的联合概率分布就是:

P(X)=iNjMip(Xji)

如果 xji 的取值是有限的,属于集合 V ,上式可以转化为
P(X)=vp(x=v)count(v)

其中 count(v) 表示 v 在序列中的出现次数,上式就是Unigram模型的似然函数,并且它的对数似然函数为:
L=lnP(X)=vcount(v)lnp(x=v)vp(v)=1

我们将限制条件通过 拉格朗日算子加到对数似然函数里并分别对参数求导:
L=lnP(X)Lp(v)Lλ=vcount(v)lnp(v)+λ(1vp(v))=count(v)p(v)λ=1vp(v)

令两个偏导为0,我们先有
p(v)=count(v)λvp(v)=vcount(v)λ=1λ=count()

所以Unigram模型的最大似然估计就是
p(v)=count(v)count()

这是一个非常符合直觉的公式,一个term出现的概率就是它在训练数据里的频率,所以甚至有人会觉得这就是常识,但实际上背后是有数学推导支撑的

马尔可夫模型

按照上面类似的逻辑,一阶马尔可夫的最大似然估计就是

p(xt=vi,xt+1=vj)=count(vi,vj)count(vi,)

这里不作推导了,有兴趣可以自己推导一下。(多说一句,很多书上上面这两个公式都是直接给出来的,但你自己从头推导过一次后会感觉概率论这东西还是靠谱的……233)

隐马尔可夫模型HMM

根据我们a部分的描述,隐马尔可夫链其实是有两条序列的,我们分别用 H O 来表示,以一阶隐马尔可夫链为例:
【图1】
那么对于某个训练样本 {o,h} 它的联合概率应该如何表示呢

P(o,h|θ)=p(h1|θ)t=2Tp(ht|ht1,θ)t=1Tp(ot|ht,θ)

主要是三个部分:1)第一个隐藏层的初始状态。2)隐藏层的 转移概率。3)从隐藏层到表示层的 表现概率,我们分别用特殊的符号来标记对应的参数:
πqiAqi,qjBqj,sk=p(h1=qi),qQ,Q=p(ht=qj|ht1=qi)=p(ot=sk|ht=qj),skS,S

所以上面的联合概率公式可以表示为:
P(o,h|θ)=πh1t=2TAht1htt=1TBhtot

如果我们同时知道 {o,h} ,想要求得 θ ,那其实问题很简单,无非就是类似Unigram和Bigram统计一下各个term和pair出现的次数,并计算出概率。

但问题的关键来了:在实际中我们多半是不知道隐藏层状态是什么样的,否则它们就不叫「隐藏层」了,所以我们只能期望表现序列 o 的概率最大:

p(o|θ)=hp(o,h|θ)

记住h可是一个序列,在任何一个位置的取值都有 |Q| 种,所以对于一个长度为N的序列,我们需要加和的隐藏层候选集大小为 |Q|T (T是序列长度),这是一个极其庞大的数字。而且当 h 的状态不同时,从 h 表现为 o 的概率也不一样。所以我们想直接去最大化这个联合分布(最大似然)是不现实的。

Baum-Welch算法(EM算法)

所以在这里只能通过EM算法,去一步步迭代计算求得 θ ,EM算法首先假设参数是知道的,然后最大化Q函数来更新参数值(Baum-Welch是EM算法在HMM中的具体实现)
EM算法作为十大数据挖掘算法之一,后面我们可以单独开一篇博客学习,我自己现在也没有理解得很深入,但在这里你只需要知道它有两步,Q&M,Q步骤中计算Q函数,M步骤中最大化Q函数
在HMM问题中, θoldθ ,第一个公式里可以认为是Q函数的定义:

Q(θ,θold)p(o|θold)θp(o,h|θ)=hp(o,h|θold)ln p(o,h|θ)=hp(h|o,θold)p(o|θold)ln p(o,h|θ)hp(h|o,θold)ln p(o,h|θ)=hp(h|o,θold)ln πh1    +hp(h|o,θold)t=2ln Aht1,ht    +hp(h|o,θold)t=1ln Bht,ot

公式复杂度似乎有些不可控了,我们单把上式的 第一部分拎出来
F=hp(h|o,θold)ln πh1

假设我们指定 h1=q
则F中和 h1=q 相关的部分就是
hHqp(h|o,θold)ln πq

Hq H h1=q 的所有可能的 h 序列构成的集合,此时 hHp(h|o,θold) 发生了微妙的变化:
hHp(h|o,θold)=p(h1=q|o,θold)

所以原式F:
F=qp(h1=q|o,θold)ln πq

类似的方法我们可以吧 Q(θ,θold) 变成下式:
Q(θ,θold)=qp(h1=q|o,θold)ln πq+t=2q1Qq2Qp(ht1=q1,ht=q2|o,θold)lnAq1,q2+tqp(ht=q|o,θold)ln Bq,ot

为了方便后续计算表示,我们用:
γtγt(q)ξtξt(q1,q2)=p(ht|o,θold)=p(ht=q|o,θold)=p(ht1,ht|o,θold)=p(ht1=q1,ht=q2|o,θold)

所以:
Q(θ,θold)=qγ1(q)ln πq+t=2q1Qq2Qξt(q1,q2)lnAq1,q2+tqγt(q)ln Bq,ot

然后我们最大化Q,分别对每个参数进行求导,将限定(主要是各种概率和为1)以拉格朗日乘子的方式加入,比如对 πq 求导:
Qπqπqqπqπqγ1=γ1(q)πqλ使=0=γ1(q)λ=qγ1(q)λ=1=γ1(q)qγ1(q)=γ1(q)1

类似的方式可以分别求得:
Aq1,q2Bq,s=t=2ξt(q1,q2)t=2qξt(q,q2)=t=2ξt(q1,q2)t=2γt(q2)=tTγt(q)tγt(q),Tot=s

上面三个公式就是我们在EM算法的M步骤中更新参数值的公式。
但在这里, 我们遗留了一个很重要的问题 γξ 应该如何计算呢,我们只是为了简化公式引入的这两个符号,它们背后还是概率公式啊。

前向后向算法(forward-backward)

所以接下来我们就要解决这个问题,就是如何计算 γ ξ ,也就是在知道了表现序列 o 和相关参数 θold 后,想要知道和 h 相关的一些概率。
【图2】
上面是一个示意图, |Q|=3 ,每个隐藏状态的取值都有3种情况,所以下面就变成了那样一个全连接的网络,看起来有点像一个NN了。
有(下面公式省略 θold ):

γt=p(ht|o).()=p(o|ht)p(ht)p(o)=p(o1,o2...,ot|ht)p(ot+1..oT|ht)p(ht)p(o)=p(o1,o2...,ot,ht)p(ot+1..oT|ht)p(o)

上式分母中的部分其实跟 θold 没啥关系, 我们把分子的两部分分别定义为 α β :
α(ht)β(ht)=p(o1,o2...,ot,ht)=p(ot+1..oT|ht)

其中
α(ht)qht=p(o1,o2...,ot,ht=q)=p(o1...t|ht=q)p(ht=q)=p(ot|ht=q)p(o1...(t1)|ht=q)p(ht=q)=p(ot|ht=q)p(o1...(t1),ht=q)=p(ot|ht=q)qp(o1...(t1),ht1=q,ht=q)ht1=p(ot|ht=q)qp(o1...(t1),ht1=q)p(ht=q|ht1=q)=p(ot|ht=q)qα(ht1)qp(ht=q|ht1=q)

上面推导过程用到的性质无非是 马尔可夫假设条件概率的概念而已,此时我们已经发现 α 是可以迭代进行计算的了,整个计算过程是 从前往后的,所以是 前向算法,其实也很好理解,比如下图的a中标红的节点 h3=q2 ,其实只能从 h2 几个状态转移过来,箭头的参数值就是 p(h3=q2|h2=q) ,也就是A可以指示的。
对于序列的第一个隐藏状态,它的初始值就是
α(h1)q=πqp(o1|q)

类似的方法我们可以推导得到 β ,这是 后向算法的部分,示意图如下面图(b)所示:
β(ht)q=p(ot+1..oT|ht=q)=qβ(ht+1)qp(ot+1|ht+1=q)p(ht+1=q|ht=q)

【图ab】

现在回头去看就有

γt(q):p(o)=α(ht)qβ(ht)qp(o)=qα(ht)qβ(ht)q.(γt


ξt(q1,q2)p(o)=p(ht1=q1,ht=q2|o)=p(o|ht1=q1,ht=q2)p(ht1=q1,ht=q2)p(o)=p(o1...t1|ht1=q1)p(ot|ht=q2)p(ot+1...T|ht=q2)p(ht1=q1|ht=q2)p(ht=q2)p(o)α,β=α(ht1)q1p(ot|ht=q2)β(ht)q2p(ht1=q1|ht=q2)p(o)=α(ht1)q1Bq2,otβ(ht)q2Aq1,q2p(o)=qqα(ht1)qBq,otβ(ht)qAq,q.ξ

可以看到, 前向后向算法我们一开始的意图已经达到了,而实际上前向后向算法也可以用来计算出当所有参数给定时,o的概率,这在实际应用中我们判断一个序列出现的概率时非常有用:
p(o)p(o)=qα(ht)qβ(ht)q=qqα(ht1)qBq,otβ(ht)qAq,q

至此,我们已经得到 γ ξ 了,所以完全可以带回到EM算法去迭代地学习到模型中的参数集合 θ={A,B,π} 了。但在实际的应用中,我们通常希望给出一个观测序列 o ,可以知道对应概率最大的 h 是什么,因为 h 有可能是一些有意义的状态比如单词词性、语音词之类的东西,在湿货部分的例子里就是我们希望通过表现 外在行为去猜测其最大可能的 内在意愿,这也是 我们人在日常生活中潜意识会干的事情

Viterbi算法

如何解决上一节提到的问题呢,最简单的方法,我们不是知道 γt(q) 是t时刻隐状态为q的概率吗,对于每一个时刻我们找一个最大的q不就好了。也就是

qt=argmaxqi[γt(qi)]

这样的做法被称为 「近似算法」,但我们知道,所有可能的序列有 |Q|T 种,近似算法不能保证求得的解是整体序列概率最大的那一个。说白了,我们希望找到的是下面概率图(c)(注意此时的连线已经不是转移概率了)中的一个 最优路径(概率累乘最大)
【图cd】
一提到最优路径,做过OI/ACM题目的同学可能都会想到 动态规划,没错,这里我们就要通过动态规划来求解,在序列算法中被称为 Viterbi算法
首先我们定义一个概率计算函数 ft(q) 表示 ht=q 的前提下从1到t所有序列中最大概率值
ft(q)=maxh1...t1p(ht=q,o1...t)

在上面那个图(d)中,我们想求到 f3(q1) ,你会发现它 只能从前一个隐藏状态的三种可能性转移过来,我们只需要看哪个 q ft1(q)Aq,q 更大就好了,至于 ft1(q) 怎么求解我并不关心,交给递归就好了,这就是递归算法 无后效性的体现。
ft(q)=(maxqft1(q)Aq,q)Bq,ot

对于第一个状态,初始值为
f1(q)=πqBq,o1

这样直到最后,我们从 fT(q) 找一个概率最大的就是我们求解最优路径的值了。
等等,我们是想找到 最优路径本身,你算一个最大概率值算怎么回事啊?其实要得到最优路径也很简单,我们只需要在计算 ft(q) 顺带记录一下最大的概率是从之前哪个状态转移过来的就好了,令:
gt(q)=argmaxqft1(q)Aq,q

gt(q) 表示 当t时刻隐藏状态确认是q的情况下,它的上一时刻状态应该是什么,我们最后在 fT(q) 找到一个概率最大的q,只需要要根据这个q一步步回溯回去就可以找到对应的序列了,如图e所示,我们在最后一步挑选了q1。
【图e】

尾巴

隐马尔可夫模型在语音识别、NLP等领域有着非常广泛的应用,序列算法里未来还有其它跟「隐变量」打交道的东西,隐马尔可夫应该算经典之一。

之前在不同的书上都看过多次隐马尔可夫模型,但记忆不深刻,时间稍微一长就忘掉了,所以借着这个机会从头到尾梳理一次,按照概率表示)->(EM算法)->(前向后向算法)->(Viterbi)这个顺序理解相当酣畅,都是有需求才进入下一步的介绍,承上启下,相信这次要记得久一点了。

在过程中参考了《PRML》和《统计学习方法》,发现书上并不一定按照这个思路来讲,不是很好串起来,而且一些概率公式之间跳的太快(估计是我数学比较渣)或者压根没有,这次从头搞一次,我感觉应该是比较丰实了。

猜你喜欢

转载自blog.csdn.net/Dark_Scope/article/details/63683686