1、隐马尔可夫模型简介
隐马尔可夫模型是一种生成模型,其广泛的应用于自然语言处理,语音识别,生物信息领域。
其模型可以描述为由状态集合,观测集合,初始集合生成相应的状态序列和观测序列的任务。定义如下
设Q表示状态集合,V表示观测集合。状态集合的个数为N,观测集合的个数为M,
I是长度为T的状态序列,O是长度为T的观测序列。
A是状态转移概率矩阵。表示由状态\(q_{i}\)转移到状态\(q_{j}\)的概率大小
B是观测概率矩阵,表示由状态\(q_{j}\)生成观测\(o_{k}\)的概率值。
\(\pi\)表示状态初始值
所以,综上,隐马尔可夫模型可以用一个三元组来表示
隐马尔可夫模型有两个假设:1、任何时刻t的状态只依赖于前一个时刻的状态。2、任意时刻的观测输出只依赖于当前时刻的状态。
隐马尔可夫模型有三个基本问题,接下来我们就一一进行详解,分别是:
- 1、概率计算问题
给定\(\lambda\),计算观测序列O的概率,即\(p(O|\lambda)\) - 2、学习问题
给定观测序列O,学习参数\(\lambda\)使得\(p(O|\lambda)\)最大 - 3、预测问题
给定观测序列O和参数\(\lambda\),求使得\(p(I|O)\)最大的观测序列
2、概率计算问题
概率计算问题是已知参数\(\lambda\)来计算给定的观测序列O,我们有三种方法来计算\(P(O|\lambda)\),暴力解决法,前向计算法,后向计算法
2.1、暴力解决法
根据给定的参数\(\lambda\)我们可以穷举出所有得到序列\(O={o_{1},o_{2}....o_{T}}\)的可能性,并将相应的可能性相加即可得到最终的结果。对于任意一个状态序列\(I={i_{1},i_{2}....i_{T}}\)来说,\(P(I|\lambda) = \pi_{i_{1}} a_{i_{1}i_{2}} a_{i_{2}i_{3}}......a_{i_{T-1}i_{T}}\),对于某一个固定的序列I来说,\(P(O|I,\lambda) = b_{i_{1}}(o_{1}) b_{i_{2}}(o_{2})....b_{i_{T}}(o_{T})\),则对于一条固定的状态序列来说
那么,对于所有的观测序列I来说,其概率为
这里表示说,对于每一条状态序列来说,我们都可以得到相应的概率输出,最终,我们将所有的概率做一个加和,即可得到结果。
这种方法理论上是可行的,但在实际操作的时候,其时间复杂度为\(O(TN^{T})\),这里\(N^{T}\)表示一个排列组合,即将个数为N的状态放在T个时间上的排列组合。\(T\)表示时间步骤,对于每一个固定的状态序列来说,都需要复杂度为\(O(T)\),所以最终的时间复杂度为\(O(TN^{T})\),所以,这种方法由于时间复杂度较高,实际中不适用。
2.2、前向计算法
前向算法的逻辑如下所示。前向算法的整体逻辑是,首先每一个时间t,计算当前时间的每个状态到当前序列的概率值,在时间t+1步,将上一个时间t计算出来的概率值进行相加,然后再计算t+1时刻的每个状态的概率值。再最后一步T,将当前计算的状态概率值相加即可。时间复杂度为\(O(N^{2}T)\)
2.3、后向计算法
后向计算法的逻辑如下所示。其整体逻辑是从后向前进行计算,在每一个t+1步计算所有状态的概率值,在t步利用t+1计算的概率值和当前的概率转移等得到当前所有状态的概率值。
3、学习问题
学习问题是根据观测序列O来学习参数\(\lambda,I\)这两个参数,由于参数有含有隐变量\(I\),这块需要用EM算法(这块的推导稍微有些复杂,后续弄懂了再推吧)
4、预测问题
预测问题是已知\(\lambda\)和\(O\),预测状态序列\(I^{*} = i_{1}^{*},i_{2}^{*}.....i_{t}^{*}\),可以用动态规划的方法来解决(也叫维特比算法)如下
这里可以用这个图来进行理解,维特比算法的思想是对于前一个时间t的状态概率来说,转移到时间t+1的状态中,我们选择可以使概率值最大的状态概率,并用一个集合记录这个最大概率是从时刻t的哪个状态来的,这里选择最大的概率一点好处就是少算了许多不值得算的概率,减少了计算量。换一种方式理解的话,假设我们状态有3个,时间T为10,那其实我们构造了两个3 * 10的矩阵,第一个矩阵为\(W_{ij}\),表示第i个状态在第j个时刻的输出概率值,这个值根据\(max(W_{1j-1}*a_{1j},W_{2j-1}*a_{2j},W_{3j-1}*a_{3j})*b_{j}(o)\)公式得到,而第二个矩阵\(V_{ij}\)表示第i个状态的在第j个时刻的最大值是由j-1时刻的哪个状态得来的,比如刚才式子中最大值是第二个即\(W_{2j-1}*a_{2j}\),则\(V_{ij} = 2\)