HMM模型是个经典模型,处理的是序列的判决问题。本文大体讲解一下HMM的过程,而对其原理不作深入探究。
一阶马尔科夫模型
判断一个状态 vi 到另一个状态 vj 的转变。
比如今天的天气状态是“晴天”,那明天的天气状态是?,我们推测极大的可能也是“晴天”。这就是一个简单的一阶马尔科夫模型的应用。
一阶马尔科夫假设:每个状态只依赖于前一个状态。(不是依赖于其前几个状态)
前后关系用时间 t 和t+1表示,则前后状态的转移概率为: P(vj(t+1)|vi(t))=aij 。
表示在当前时刻 t 时,状态vi向下一时刻 t+1 状态 vj 的转移概率。
一阶马尔科夫图示(w就是s)
一阶隐马尔科夫模型
含有隐藏状态 s(t) ,目标仍然是判断可视状态 v(t) 的转变。
我们若是只能观测到某一状态,但是可观测状态是由隐含的某一状态决定的,那么就需要隐马尔科夫模型出马了。
独立性假设:可视状态只取决于当前隐藏状态。
P(vk(t)|sj(t))=bjk
齐次马尔科夫假设:每个状态只依赖于前一个状态。
P(vj(t+1)|vi(t))=aij
归一化约束: ∑jaij=1 和 ∑kbkj=1
一阶隐马尔科夫的图示(w就是s)
下面解决三个关键问题:
估值:计算可视序列 VT=v1,v2,v3,...,vn 出现的概率。根据转移概率 aij 和 bjk 。
解码:根据可视序列 VT=v1,v2,v3,...,vn 及转移概率 aij 和 bjk ,计算最可能出现的隐状态序列 ST=s1,s2,s3,...,sn 。
学习:由一组样本序列确定状态转移概率 aij 和 bjk 及隐状态的先验概率 πi 。
HMM估值
已知HMM模型( aij 和 bjk ),如何求解产生可视序列 VT 的概率。
可视序列的产生概率如下:
P(VT)=∑rmaxr=1P(VT|STr)P(STr)
其中 rmax 为 c 个隐状态时的可能隐序列种数。
因为隐序列的当前状态仅仅取决于前一状态,故:
P(ST)=∏Tt=1P(st|st−1)
因为当前可视状态仅仅由当前隐状态决定,故:
P(VT|ST)=P(v1|ST)P(v2|ST)∗...∗P(vT|ST) 可视状态间互不影响。
P(VT|ST)=P(v1|s1)P(v2|s2)∗...∗P(vT|sT)=∏Tt=1P(vt|st)
综上所述:
P(VT)=∑rmaxr=1∏Tt=1P(vt|st)∏Tt=1P(st|st−1)
P(VT)=∑rmaxr=1∏Tt=1P(vt|st)P(st|st−1)
上面这个式子计算起来实在太过复杂~现在介绍一种简单计算方法,递归地计算 P(VT) ,累积前面的,计算当次的,再累积前面的,计算当次的,直到整个序列都计算完毕。
设 αi(t) 表示HMM在 t 时刻,位于隐状态si,并且已经产生了可见序列 VT 的前 t 个符号的概率。
αi=⎧⎩⎨⎪⎪01bjkv(t)∑iαi(t−1)aijt=0且j≠初始状态t=0且j=初始状态其他
HMM前向估计的递归方法示意图(这里的 w 是上面的s)。
HMM前向算法过程
1. Initialize t=0,aij,bjk ,可见序列 VT , αj(0)=1
2. for t=t+1
3. αj(t)=bjkv(t)∑ci=1αi(t−1)aij
4. until t=T
5. returnP(VT)
HMM后向算法过程
1. Initialize t=T,aij,bjk ,可见序列 VT , βj(T)
2. for t=t−1
3. βi(t)=bjkv(t+1)∑cj=1βj(t+1)aij
4. until t=1
5. returnP(VT)
其中,定义 βi(t) 为在 t 时刻位于状态si,并且将产生 t 时刻之后的目标序列(时间范围为从t+1到 T )的概率。
βi(t)=⎧⎩⎨⎪⎪01bjkv(t+1)∑jβj(t+1)aijsi(t)≠s0且t=Tsi(t)=s0且t=T其他
HMM解码
已知一个观测序列 VT ,解码就是找到与其对应的最可能的隐状态序列 ST 。
一种简单的方法是遍历所有的可能的隐状态序列的概率,选择最大的作为解码结果。但是这很明显不现实,因为计算量实在过于巨大。
现提供一种简单思路,把每个时刻最可能的隐状态 s(t) 找到。
HMM解码算法(Viterbi)
1. Initialize paht为空 , t=0
2. for t=t+1
3. j=1
4. for j=j+1
5. αj(t)=bjkv(t)∑ci=1αi(t−1)aij
6. until j=c
7. j′=argmaxjαj(t)
8. 将隐状态 sj′ 添加到 path 中
9. until t=T
10. return path
这种解码方法(维特比算法)的缺点是:不能够保证找到的路径就是合法的路径,即找到的路径有可能是不连贯的。因为是用局部最优解串联成的解。
HMM学习
学习模型的过程就是确定模型的参数,转移概率 aij,bjk 及隐状态的先验概率 πi 。
(1)对于有监督问题
a^ij=隐状态si转到sj的频次隐状态si的所有隐状态转移频次
b^ij=隐状态sj转到可视状态vk的频次隐状态sj的所有可视状态转移频次
π^i=样本中 t=1 时,可视状态对应的隐藏状态为si的频率
(2)对于无监督问题
解决无监督的HMM训练问题,就是大名鼎鼎的Baum-Welch算法,也叫前向-后向算法。
该算法是“广义期望最大化算法”的一种具体实现,其核心思想是:通过递归方式更新权重,以得到能够更好地描述(解释)训练样本的模型参数。
定义从隐状态 si(t−1) 到 sj(t) 的概率 γij(t) 如下:
γij(t)=αi(t−1)aijbjkβj(t)P(VT|θ)
其中, P(VT|θ) 是模型用任意的隐含路径产生序列 VT 的概率, γij(t) 则表示了在产生可序列 VT 的条件下,从隐状态 si(t−1) 到 sj(t) 的概率。
aij 的估计值 aij^ 如下, K 表示可转移的状态数量:
a^ij=∑Tt=1γij(t)∑Tt=1∑Kk=1γik(t)
上式中,分子表示了 si 到 sj 的期望;分母表示了 si 转移的总期望。
bjk 的估计值 bjk^ 如下:
b^jk=∑Tt=1∑v(t)=vkγik(t)∑Tt=1∑γik(t)
上式中,分子表示了隐状态 sj 对应的特定的可视状态 vk 对应的频次;分母表示了隐状态 sj 对应的所有的可视状态的频次。
?初始状态概率怎么确定的?
前向-后向算法过程
1. Initial aij,bjk 训练序列 VT ,收敛判据 θ , z=0
2. doz=z+1
3. 由a(z−1)和b(z−1)计算a^(z)
4. 由a(z−1)和b(z−1)计算b^(z)
5. update:
6. aij(z)=a^ij(z−1)
7. bjk(z)=b^jk(z−1)
8. until maxi,j,k[aij(z)−aij(z−1),bjk(z)−bjk(z−1)]<θ
9. return aij=aij(z);
bjk=bjk(z)
πi=当前参数下,初始隐状态s1=si的概率当前参数下,VT的概率=P(VT,s1=si|a,b)P(VT|a,b)
πi 是隐状态的先验概率估计,需要根据样本推测隐状态样本,然后计算。
小结
HMM算法是个经典算法,在语音识别、自然语言处理、生物信息等领域应用广泛。隐马尔科夫模型是关于时序的概率模型,描述一个由隐藏的马尔科夫链随机生成不可观测的状态的序列,再由各个状态随机生成一个观测值而产生观测序列的过程。