1,隐马尔可夫模型:
隐马尔可夫模型(HMM)是可用于标注问题的统计学习模型,描述由隐藏的马尔可夫链随机生成观测序列的过程,属于生成模型。
隐马尔可夫模型的两个基本假设:
1),齐次马尔科夫假设:隐藏的马尔科夫链在任意时刻t的状态只依赖于齐前一时刻的状态,其它时刻的状态及观测无关,也与时刻t无关;
2),观测独立性假设:任意时刻的观测只依赖于该时刻的马尔科夫状态,与其它观测及状态无关。
HMM 就是贝叶斯网络的一种——虽然它的名字里有和“马尔可夫网”一样的“马尔可夫”。对变量序列建模的贝叶斯网络又叫做动态贝叶斯网络。HMM就是最简单的动态贝叶斯网络。HMM模型在特征工程时用的多,单独作为模型时用得少,比如NLP中的标注问题等。与lstm极相似,最终的概率会收敛到均衡状态。
1.1,HMM 有三个基本问题:概率计算、学习、预测
1),概率计算问题(前向-后向算法):给定模型λ=(A,B,π)和观测序列Q={q1,q2,...,qT},计算模型λ下观测到序列Q出现的概 率P(Q|λ)。
1.1),首先介绍理论上可行但计算上不可行的直接计算法:
如果不是直接计算,还有什么办法可以算出一个观测序列出现的概率吗?当然有,那就是前向-后向算法。
前向—后向算法是一种动态规划算法。它分两条路径来计算观测序列概率,一条从前向后(前向),另一条从后向前(后向)。这两条路径,都可以分别计算观测序列出现的概率。
在实际应用中,选择其中之一来计算就可以。所以,前向-后向算法其实也可以被看作两个算法:前向算法和后向算法,它们可以分别用来求解。
1.2),前向算法:
1.3),后向算法:
2),学习问题(Bawm-Welch算法):已知观测序列Q={q1,q2,...,qT},估计模型λ=(A,B,π)的参数,使得在该模型下观测序列P(Q|λ)最大。
学习问题可分为监督问题和非监督问题:
2.1),若训练数据包含观测序列和状态序列,则HMM的学习问题非常简单,是监督学习算法。此时,直接利用大数定理的结论“频率的极限是概率”,直接给出HMM的参数估计;
2.2),若训练数据只包含观测序列,则HMM的学习问题需要使用EM算法求解,是非监督学习算法。此时,一般使用Baum-Welch算法。
极大化上述L函数,使用拉格朗日函数,FOC=0解方程组,分别可以求得π、a、b的值:
3),预测问题(近似算法,Viterbi算法):给定模型λ=(A,B,π)和观测序列Q={q1,q2,...,qT},求给定观测序列条件概率P(I|Q,λ) 最大的状态序列I。
3.1),近似算法:直接在每个时刻t时候最优可能的状态作为最终的预测状态,使用下列公式计算概率值。公式如下
3.2),Viterbi算法:Viterbi算法实际是用动态规划的思路求解HMM预测问题,求出概率最大的“路径”,每条“路径”对应一个状态序列。
HMM的常见应用主要用于进行特征提取的场景中或者数据标注的场景中。
2,隐马尔可夫模型应用:hmmlearn、GMM-HMM
2.1,hmmlearn:pip install hmmlearn
Hmmlearn实现了三种HMM模型类,按照观测状态是连续状态还是离散状态,可以分为两类。GaussianHMM和GMMHMM是连续观测状态的HMM模型,而MultinomialHMM是离散观测状态的模型;对于连续观测状态的HMM模型,GaussianHMM类假设观测状态符合高斯分布,而GMMHMM类则假设观测状态符合混合高斯分布。
2.2,GMM-HMM与DNN-HMM:
GMM和DNN都拟合一个观测序列的概率分布,然后作为HMM的观测状态概率矩阵B;从HMM指向GMM或DNN的箭头是指,HMM的某个状态的观察状态概率由某一个GMM或DNN的某一个输出节点决定;两者最主要的差别是利用了DNN 代替了 GMM 实现了观察状态概率输出;后验概率可以看作是监督学习中,根据观察值去求状态值,而DNN是有根据观察值去逆向传播的过程,属于监督学习;另外经过softmax输出,就能得到后验概率了。
在左图GMM-HMM 中,HMM 的观察概率由GMM 生成。一个状态 X 由一个 GMM表征,同时相邻的GMM 之间没有很强的相关性;GMM 作为生成模型,是可以直接生成似然概率P(Y| X),这个似然概率就是HMM 所需要的观察概率。
在第二张图 DNN-HMM 中,HMM 的观察概率由DNN 生成的后验概率P(X |Y)经贝叶斯公式转换得到。DNN的一个输出节点对应一个状态,由于 DNN 的输入是多帧,所以DNN 的建模具有很强的上下文信息,并且引入了非线性的效果,这在语音建模上有显著作用;DNN 作为判别模型,是直接对给定的观察序列Y 后状态的分布进行建模,也是监督学习,输出的是后验概率P(X |Y),需要转为似然概率P(X |Y)。
相同点:HMM 的状态初始概率和状态转移概率都不变,HMM 仍然是对时序进行建模。
3,code:
代码语言:javascript复制# https://github.com/Jesselinux/Mining-Algorithms