HMM系列文章:
隐马尔科夫模型(HMM)原理小结(1)
隐马尔科夫模型(HMM)原理小结(2)
手撸HMM实现词性标注(Part-of-speech)
本博客中使用到的完整代码请移步至: 我的github:https://github.com/qingyujean/Magic-NLPer,求赞求星求鼓励~~~
训练数据包含观测序列
和状态序列
。直接统计频数
求概率。
假设训练样本包含了长度相同的观测序列以及对应的状态序列 { ( O 1 , I 1 ) , ( O 2 , I 2 ) , . . . , ( O S , I S ) } \{(O_1,I_1),(O_2,I_2),...,(O_S,I_S)\} { (O1,I1),(O2,I2),...,(OS,IS)},那么可以利用极大似然估计方法来估计HMM的参数。
设样本中在时刻 t → t + 1 t\rightarrow t+1 t→t+1 由状态 i → j i \rightarrow j i→j 转移的频数为 A i j A_{ij} Aij,则转移概率 a i j a_{ij} aij的估计是:
a ^ i j = A i j ∑ j = 1 N A i j , i , j = 1 , 2 , . . . , N \hat{a}_{ij}=\frac{A_{ij}}{\sum\limits_{j=1}^N A_{ij}},\quad i,j = 1,2,...,N a^ij=j=1∑NAijAij,i,j=1,2,...,N
设样本中由状态 j j j 产生观测 k k k 的频数为 B j k B_{jk} Bjk,则观测概率 b j ( k ) b_j(k) bj(k)的估计是:
b ^ j ( k ) = B j k ∑ k = 1 M B j k , j = 1 , 2 , . . . , N ; k = 1 , 2 , . . . , M \hat{b}_j(k)=\frac{B_{jk}}{\sum\limits_{k=1}^M B_{jk}},\quad j=1,2,...,N;\quad k=1,2,...,M b^j(k)=k=1∑MBjkBjk,j=1,2,...,N;k=1,2,...,M
样本中初始状态为 q i q_i qi 的频数 为初始状态概率 π i \pi_i πi的估计。
训练数据仅包含观测序列
。
假设训练样本中只包含长度为 T T T 的观测序列 { O 1 , O 2 , ⋯ , O S } \{O_1,O_2,\cdots,O_S\} { O1,O2,⋯,OS}而没有对应的状态序列,把观测序列数据 O O O看做显变量,状态序列数据 I I I看做不可观测的隐变量 { I 1 , I 2 , ⋯ , I S } \{I_1,I_2,\cdots,I_S\} { I1,I2,⋯,IS},那么此时HMM就可看做是含有隐变量的概率模型:
P ( O ∣ λ ) = ∑ I P ( O , I ∣ λ ) = ∑ I P ( O ∣ I , λ ) P ( I ∣ λ ) P(O \mid \lambda)=\sum_{I} P(O,I \mid \lambda)=\sum_{I} P(O \mid I, \lambda) P(I \mid \lambda) P(O∣λ)=I∑P(O,I∣λ)=I∑P(O∣I,λ)P(I∣λ)
其参数的学习可以使用 EM算法
来求解。
l o g P ( O , I / λ ) logP(O,I/\lambda) logP(O,I/λ)
而 P ( O , I / λ ) = π i 1 b i 1 ( o 1 ) a i 1 i 2 b i 2 ( o 2 ) . . . a i T − 1 i T b i T ( o T ) P(O,I/\lambda)=\pi_{i_1}b_{i_1}(o_1)a_{i_1 i_2}b_{i_2}(o_2)...a_{i_{T-1} i_T}b_{i_T}(o_T) P(O,I/λ)=πi1bi1(o1)ai1i2bi2(o2)...aiT−1iTbiT(oT)。
设 λ \lambda λ 是需要极大化的HMM的参数, λ ˉ \bar{\lambda} λˉ 是当前迭代步中模型参数的估计值,那么 Q Q Q函数可写为:
Q ( λ ∣ λ ˉ ) = E I [ l o g P ( O , I / λ ) ∣ O , λ ˉ ] = ∑ I l o g P ( O , I ∣ λ ) P ( I ∣ O , λ ˉ ) = ∑ I l o g P ( O , I ∣ λ ) P ( I , O ∣ λ ˉ ) P ( O ∣ λ ˉ ) \begin{aligned}Q(\lambda|\bar{\lambda})&=E_I \big[logP(O,I/\lambda)|O,\bar{\lambda}\big]\\&=\sum_{I} log P(O,I \mid \lambda)P(I|O,\bar{\lambda})\\&=\sum_{I} log P(O,I \mid \lambda)\frac{P(I,O|\bar{\lambda})}{P(O|\bar{\lambda})}\end{aligned} Q(λ∣λˉ)=EI[logP(O,I/λ)∣O,λˉ]=I∑logP(O,I∣λ)P(I∣O,λˉ)=I∑logP(O,I∣λ)P(O∣λˉ)P(I,O∣λˉ)
因为 P ( O ∣ λ ˉ ) P(O|\bar{\lambda}) P(O∣λˉ)对于待求解参数 λ \lambda λ 来说相当于常数,对求解 Q Q Q函数的极大化(求偏导令其等于0)没什么影响,所以去掉该项以简化 Q Q Q函数,所以 Q Q Q 函数为:
Q ( λ ∣ λ ˉ ) = ∑ I l o g P ( O , I ∣ λ ) P ( I , O ∣ λ ˉ ) \begin{aligned}Q(\lambda|\bar{\lambda})=\sum_{I} log P(O,I \mid \lambda)P(I,O|\bar{\lambda})\end{aligned} Q(λ∣λˉ)=I∑logP(O,I∣λ)P(I,O∣λˉ)
注意有:
P ( O , I / λ ) = π i 1 b i 1 ( o 1 ) a i 1 i 2 b i 2 ( o 2 ) . . . a i T − 1 i T b i T ( o T ) = π i 1 ⋅ ∏ t = 1 T − 1 a i t i t + 1 ⋅ ∏ t = 1 T b i t ( o t ) \begin{aligned}P(O,I/\lambda)&=\pi_{i_1}b_{i_1}(o_1)a_{i_1 i_2}b_{i_2}(o_2)...a_{i_{T-1} i_T}b_{i_T}(o_T)\\&=\pi_{i_1}\cdot \prod\limits_{t=1}^{T-1} a_{i_t i_{t+1}} \cdot \prod\limits_{t=1}^{T} b_{i_t}(o_t)\end{aligned} P(O,I/λ)=πi1bi1(o1)ai1i2bi2(o2)...aiT−1iTbiT(oT)=πi1⋅t=1∏T−1aitit+1⋅t=1∏Tbit(ot)
那么
l o g P ( O , I / λ ) = l o g π i 1 + ∑ t = 1 T − 1 l o g a i t i t + 1 + ∑ t = 1 T l o g b i t ( o t ) log P(O,I/\lambda)=log \pi_{i_1}+ \sum\limits_{t=1}^{T-1} log a_{i_t i_{t+1}} +\sum\limits_{t=1}^{T} log b_{i_t}(o_t) logP(O,I/λ)=logπi1+t=1∑T−1logaitit+1+t=1∑Tlogbit(ot)
所以
Q ( λ ∣ λ ˉ ) = ∑ I l o g P ( O , I ∣ λ ) P ( I , O ∣ λ ˉ ) = ∑ I l o g π i 1 P ( I , O ∣ λ ˉ ) ⏟ J 1 + ∑ I ( ∑ t = 1 T − 1 l o g a i t i t + 1 ) P ( I , O ∣ λ ˉ ) ⏟ J 2 + ∑ I ( ∑ t = 1 T l o g b i t ( o t ) ) P ( I , O ∣ λ ˉ ) ⏟ J 3 \begin{aligned}Q(\lambda|\bar{\lambda})&=\sum_{I} log P(O,I \mid \lambda)P(I,O|\bar{\lambda})\\&=\underbrace{\sum_{I} log \,\pi_{i_1}P(I,O|\bar{\lambda})}_{J_1}+\underbrace{\sum_{I} \big( \sum\limits_{t=1}^{T-1} log \,a_{i_t i_{t+1}}\big)P(I,O|\bar{\lambda})}_{J_2}\\&+\underbrace{\sum_{I} \big( \sum\limits_{t=1}^{T} log b_{i_t}(o_t) \big)P(I,O|\bar{\lambda})}_{J_3}\end{aligned} Q(λ∣λˉ)=I∑logP(O,I∣λ)P(I,O∣λˉ)=J1 I∑logπi1P(I,O∣λˉ)+J2 I∑(t=1∑T−1logaitit+1)P(I,O∣λˉ)+J3 I∑(t=1∑Tlogbit(ot))P(I,O∣λˉ)
由于要极大化的参数刚好单独出现在 Q Q Q函数的3个不同的项中,所以只需对各项分别求极大化。
J 1 = ∑ I l o g π i 1 P ( I , O ∣ λ ˉ ) = ∑ i = 1 N l o g π i P ( O , i 1 = i ∣ λ ˉ ) J_1=\sum_{I} log \,\pi_{i_1}P(I,O|\bar{\lambda})=\sum_{i=1}^N log \,\pi_{i}P(O,i_1=i|\bar{\lambda}) J1=I∑logπi1P(I,O∣λˉ)=i=1∑NlogπiP(O,i1=i∣λˉ)
注意到 π i \pi_i πi 满足约束: ∑ i = 1 N π i = 1 \sum\limits_{i=1}^N \pi_i=1 i=1∑Nπi=1,所以可以构建拉格朗日函数:
L ( π i , γ ) = ∑ i = 1 N l o g π i P ( O , i 1 = i ∣ λ ˉ ) + γ ( ∑ i = 1 N π i − 1 ) L(\pi_i,\gamma)=\sum_{i=1}^N log \,\pi_{i}P(O,i_1=i|\bar{\lambda})+\gamma\big(\sum\limits_{i=1}^N \pi_i-1 \big) L(πi,γ)=i=1∑NlogπiP(O,i1=i∣λˉ)+γ(i=1∑Nπi−1)
求偏导并令其等于0: ∂ L ( π i , γ ) ∂ π i = 0 \frac{\partial L(\pi_i,\gamma)}{\partial \pi_i}=0 ∂πi∂L(πi,γ)=0,求得:
π i = P ( O , i 1 = i ∣ λ ˉ ) P ( O ∣ λ ˉ ) = γ 1 ( i ) \pi_i=\frac{P(O,i_1=i|\bar{\lambda})}{P(O|\bar{\lambda})}=\gamma_{1}(i) πi=P(O∣λˉ)P(O,i1=i∣λˉ)=γ1(i)
J 2 = ∑ I ( ∑ t = 1 T − 1 l o g a i t i t + 1 ) P ( I , O ∣ λ ˉ ) = ∑ i = 1 N ∑ j = 1 N ∑ t = 1 T − 1 l o g a i j P ( O , i t = i , i t + 1 = j ∣ λ ˉ ) J_2=\sum_{I} \big( \sum\limits_{t=1}^{T-1} log \,a_{i_t i_{t+1}}\big)P(I,O|\bar{\lambda})=\sum_{i=1}^N\sum_{j=1}^N \sum\limits_{t=1}^{T-1} log \,a_{ij}P(O,i_t=i,i_{t+1}=j|\bar{\lambda}) J2=I∑(t=1∑T−1logaitit+1)P(I,O∣λˉ)=i=1∑Nj=1∑Nt=1∑T−1logaijP(O,it=i,it+1=j∣λˉ)
注意到 a i j a_{ij} aij 满足约束: ∑ j = 1 N a i j = 1 \sum\limits_{j=1}^N a_{ij}=1 j=1∑Naij=1,所以可以构建拉格朗日函数:
L ( a i j , γ ) = ∑ i = 1 N ∑ j = 1 N ∑ t = 1 T − 1 l o g a i j P ( O , i t = i , i t + 1 = j ∣ λ ˉ ) + γ ( ∑ j = 1 N a i j − 1 ) L(a_{ij},\gamma)=\sum_{i=1}^N\sum_{j=1}^N \sum\limits_{t=1}^{T-1} log \,a_{ij}P(O,i_t=i,i_{t+1}=j|\bar{\lambda})+\gamma\big(\sum\limits_{j=1}^N a_{ij}-1 \big) L(aij,γ)=i=1∑Nj=1∑Nt=1∑T−1logaijP(O,it=i,it+1=j∣λˉ)+γ(j=1∑Naij−1)
求偏导并令其等于0: ∂ L ( a i j , γ ) ∂ π i = 0 \frac{\partial L(a_{ij},\gamma)}{\partial \pi_i}=0 ∂πi∂L(aij,γ)=0,求得:
a i j = ∑ t = 1 T − 1 P ( O , i t = i , i t + 1 = j ∣ λ ˉ ) ∑ t = 1 T − 1 P ( O , i t = i ∣ λ ˉ ) = ∑ t = 1 T − 1 ξ t ( i , j ) ∑ t = 1 T − 1 γ t ( i ) a_{ij}=\frac{\sum\limits_{t=1}^{T-1} P(O,i_t=i,i_{t+1}=j|\bar{\lambda})}{\sum\limits_{t=1}^{T-1} P(O,i_t=i|\bar{\lambda})}=\frac{\sum\limits_{t=1}^{T-1} \xi_{t}(i, j)}{\sum\limits_{t=1}^{T-1}\gamma_{t}(i) } aij=t=1∑T−1P(O,it=i∣λˉ)t=1∑T−1P(O,it=i,it+1=j∣λˉ)=t=1∑T−1γt(i)t=1∑T−1ξt(i,j)
J 3 = ∑ I ( ∑ t = 1 T l o g b i t ( o t ) ) P ( I , O ∣ λ ˉ ) = ∑ j = 1 N ∑ t = 1 T l o g b j ( o t ) P ( O , i t = j ∣ λ ˉ ) J_3=\sum_{I} \big( \sum\limits_{t=1}^{T} log b_{i_t}(o_t) \big)P(I,O|\bar{\lambda})=\sum_{j=1}^N \sum\limits_{t=1}^{T} log b_{j}(o_t) P(O,i_t=j|\bar{\lambda}) J3=I∑(t=1∑Tlogbit(ot))P(I,O∣λˉ)=j=1∑Nt=1∑Tlogbj(ot)P(O,it=j∣λˉ)
注意到 b j ( k ) b_{j}(k) bj(k) 满足约束: ∑ k = 1 M b j ( k ) = 1 \sum\limits_{k=1}^M b_{j}(k)=1 k=1∑Mbj(k)=1,所以可以构建拉格朗日函数:
L ( b j ( k ) , γ ) = ∑ j = 1 N ∑ t = 1 T l o g b j ( o t ) P ( O , i t = j ∣ λ ˉ ) + γ ( ∑ k = 1 M b j ( k ) − 1 ) L(b_{j}(k),\gamma)=\sum_{j=1}^N \sum\limits_{t=1}^{T} log b_{j}(o_t) P(O,i_t=j|\bar{\lambda})+\gamma\big(\sum\limits_{k=1}^M b_{j}(k)-1 \big) L(bj(k),γ)=j=1∑Nt=1∑Tlogbj(ot)P(O,it=j∣λˉ)+γ(k=1∑Mbj(k)−1)
求偏导并令其等于0: ∂ L ( b j ( k ) , γ ) ∂ π i = 0 \frac{\partial L(b_{j}(k),\gamma)}{\partial \pi_i}=0 ∂πi∂L(bj(k),γ)=0,求得:
b j ( k ) = ∑ t = 1 T P ( O , i t = j ∣ λ ˉ ) I ( o t = v k ) ∑ t = 1 T P ( O , i t = i ∣ λ ˉ ) = ∑ t = 1 , o t = v k T γ t ( j ) ∑ t = 1 T γ t ( j ) b_{j}(k)=\frac{\sum\limits_{t=1}^{T} P(O,i_t=j|\bar{\lambda})\,I(o_t=v_k)}{\sum\limits_{t=1}^{T} P(O,i_t=i|\bar{\lambda})}=\frac{\sum\limits_{t=1,o_t=v_k}^{T}\gamma_{t}(j)}{\sum\limits_{t=1}^{T}\gamma_{t}(j)} bj(k)=t=1∑TP(O,it=i∣λˉ)t=1∑TP(O,it=j∣λˉ)I(ot=vk)=t=1∑Tγt(j)t=1,ot=vk∑Tγt(j)
注意只有在 o t = v k o_t=v_k ot=vk 时 b j ( o t ) b_{j}(o_t) bj(ot) 对 b j ( k ) b_{j}(k) bj(k) 的偏导数才不为0,上式中以 I ( o t = v k ) I(o_t=v_k) I(ot=vk)表示。
联系一下前面的期望的计算,这里其实就是从“平均”意义上去求解参数的。
求 arg max I P ( I ∣ O , λ ) \arg \max\limits_I P(I|O,\lambda) argImaxP(I∣O,λ) 等价于求 arg max I P ( I , O ∣ λ ) \arg \max\limits_I P(I,O|\lambda) argImaxP(I,O∣λ) ,因为因子 1 P ( O ∣ λ ) \frac{1}{P(O|\lambda)} P(O∣λ)1对于 I I I 来说相当于常数项,对其求max 无影响。
近似算法类似于贪心算法:在每个时刻 t t t选择在该时刻最有可能出现的状态 i t ∗ i^*_t it∗,从而得到一个状态序列 I ∗ = ( i 1 ∗ , i 2 ∗ , ⋯ , i T ∗ ) I^*=(i^*_1,i^*_2,\cdots,i^*_T) I∗=(i1∗,i2∗,⋯,iT∗),将它作为预测的结果。
每个时刻 t t t选择在该时刻最有可能出现的状态 i t ∗ i^*_t it∗:
i t ∗ = arg max 1 ⩽ i ⩽ N [ γ t ( i ) ] , t = 1 , 2 , ⋯ , T i_{t}^{*}=\arg \max _{1 \leqslant i \leqslant N}\left[\gamma_{t}(i)\right], \quad t=1,2, \cdots, T it∗=arg1⩽i⩽Nmax[γt(i)],t=1,2,⋯,T
维特比算法是利用 动态规划
来求解HMM的预测问题的,即使用DP求解概率最大路径
,或者叫最优路径
。
导入两个变量 δ \delta δ和 Ψ \Psi Ψ,定义在时刻 t t t状态为 i i i的所有单个路径 ( i 1 , i 2 , ⋯ , i t ) (i_1,i_2,\cdots,i_t) (i1,i2,⋯,it)中概率最大值为
δ t ( i ) = max i 1 , i 2 , ⋯ , i t P ( i t = i , i t − 1 , ⋯ , i 1 , o t , ⋯ , o 1 ∣ λ ) , i = 1 , 2 , ⋯ , N \delta_{t}(i) =\max _{i_{1}, i_{2}, \cdots, i_{t}} P\left(i_{t}=i, i_{t-1}, \cdots, i_{1}, o_{t}, \cdots, o_{1} \mid \lambda\right),\quad i=1,2, \cdots, N δt(i)=i1,i2,⋯,itmaxP(it=i,it−1,⋯,i1,ot,⋯,o1∣λ),i=1,2,⋯,N
可得变量 δ \delta δ的递推公式为:
δ t + 1 ( i ) = max i 1 , i 2 , ⋯ , i t P ( i t + 1 = i , i t , ⋯ , i 1 , o t + 1 , ⋯ , o 1 ∣ λ ) = max 1 ⩽ j ⩽ N [ δ t ( j ) a j i ] b i ( o t + 1 ) , i = 1 , 2 , ⋯ , N ; t = 1 , 2 , ⋯ , T − 1 \begin{aligned}\delta_{t+1}(i) &=\max _{i_{1}, i_{2}, \cdots, i_{t}} P\left(i_{t+1}=i, i_{t}, \cdots, i_{1}, o_{t+1}, \cdots, o_{1} \mid \lambda\right) \\&=\max _{1 \leqslant j \leqslant N}\left[\delta_{t}(j) a_{j i}\right] b_{i}\left(o_{t+1}\right), \quad i=1,2, \cdots, N ; \quad t=1,2, \cdots, T-1\end{aligned} δt+1(i)=i1,i2,⋯,itmaxP(it+1=i,it,⋯,i1,ot+1,⋯,o1∣λ)=1⩽j⩽Nmax[δt(j)aji]bi(ot+1),i=1,2,⋯,N;t=1,2,⋯,T−1
定义在时刻 t t t状态为 i i i的所有单个路径 ( i 1 , i 2 , ⋯ , i t − 1 , i ) (i_1,i_2,\cdots,i_{t-1},i) (i1,i2,⋯,it−1,i)中概率最大的路径的第 t − 1 t-1 t−1个结点为
Ψ t ( i ) = arg max 1 ⩽ j ⩽ N [ δ t − 1 ( j ) a j i ] , i = 1 , 2 , ⋯ , N \Psi_{t}(i)=\arg \max _{1 \leqslant j \leqslant N}\left[\delta_{t-1}(j) a_{j i}\right], \quad i=1,2, \cdots, N Ψt(i)=arg1⩽j⩽Nmax[δt−1(j)aji],i=1,2,⋯,N
可以说,HMM能干的事情LSTM(RNN)都能干,如果数据量大,LSTM(RNN)是首选,数据量小的时候,HMM是首选。
下面的对比内容摘自:从HMM到RNN
HMM和RNN在基本结构上是挺像的,都是通过hidden state的演化来刻画序列间的依赖关系。不同是:
- HMM本质是一个概率模型,而RNN不是,RNN没有马尔科夫假设,可以考虑很长的历史信息。
- 隐状态的表示: HMM是one hot, RNN是distributed representation。RNN的表示能力强很多,或者说在面对高维度时,表示效率更高。类似nlp里,对单个token的表示,一种是onehot, 一种是word vector。
- 隐状态的演化方式: HMM是线性的,RNN是高度非线性。
- 深度:lstm可以增加depth, 随着depth增加,表示能力指数增加。
RNN的最大优势在于,可以真正充分地利用所有上文信息来预测下一个词,而不像HMM那样,只能开一个k个词的窗口,只用前k个词来预测下一个词。从形式上看,这是一个非常“终极”的模型,毕竟语言模型里能用到的信息,他全用上了。
完整代码请移步至: 我的github:https://github.com/qingyujean/Magic-NLPer,求赞求星求鼓励~~~
最后:如果本文中出现任何错误,请您一定要帮忙指正,感激~
[1] 统计学习方法(第2版) 李航
[2] 从HMM到RNN