三个问题的共同点就是已知模型的一部分,求另一部分,不同点就是已知的部分和要求的部分不一样。
评估:已知模型参数,计算某一特定输出序列的概率。通常使用forward算法解决。 解码:已知模型参数,寻找最可能的能产生某一特定输出序列的隐含状态的序列。通常使用Viterbi算法解决。 学习:已知输出序列,寻找最可能的状态转移以及输出概率。通常使用Baum-Welch算法以及Reversed Viterbi算法解决。2. 词性标注与HMM三个典型问题
在词性标注问题中,已知单词序列,需要给出对应的词性序列。单词序列是可观察的,因此单词作为观察状态,词性作为隐藏状态。
评估:根据给定模型,求指定单词序列的概率,这在词性标注中没什么意义。 解码:根据给定模型和单词序列,寻找概率最大的词性序列,在词性标注中,这属于预测阶段。 学习:根据单词序列和词性序列,寻找最可能的HMM参数(A,B),在词性标注中,这属于学习阶段。3. 评估-向前算法-举例
假设:一共M种天气,N种活动,HMM参数为A[M][M], B[M][N], P[M]。 指定的观察序列为int O[LEN]; 3.1 穷举法 分别计算每种可能的隐藏序列下的,指定观察序列的概率值,然后求和。这样就是M^LEN种不同的隐藏序列,太费时。3.2 向前算法实际上,穷举法中有很多重复计算,向前算法就是利用已有的结果,减少重复计算。
定义:P[LEN][M],其中P[i][j]表示从第0天到第i天,满足观察序列,且第i天隐藏状态为Sj的所有可能的隐藏序列的概率之和。最终所求结果为P[LEN-1][0]+...+P[LEN-1][M-1],即最后一天,所有隐藏状态下,分别满足观察序列的概率值之和。 P[ 0 ][j] = P[j] * B[j][O[ 0 ]]; // j=0,1,2,...,M-1, 第一天计算,状态的初始概率,乘上隐藏状态到观察状态的条件概率。 P[i][j] = { P[i - 1 ][ 0 ] * A[ 0 ][i] + P[i - 1 ][ 1 ] * A[ 1 ][i] + ... + P[i - 1 ][M - 1 ] * A[M - 1 ][i] } * B[j][O[i]]; // i>1, j=0,1,2,...,M-1, 第一天以后的计算,首先从前一天的每个状态,转移到当前状态的概率求和,然后乘上隐藏状态到观察状态的条件概率。
复杂度:第一天是M次乘法,从第二天开始,每天都是M^2次乘法,T=O(LEN * M^2)。
4. 解码-维特比算法-距离
假设:一共M种天气,N种活动,HMM参数为A[M][M], B[M][N], P[M]。 指定的观察序列为int O[LEN];
4.1 穷举法 首先回忆上面评估算法中,要算的实际上是M^LEN不同隐藏序列满足观察序列的概率和,这里要计算的是M^LEN不同隐藏序列满足观察序列的概率的最大值。相同点:因子都是相同的,不同点:评估算的是和,解码算的是最大值。4.2 维特比算法 定义:Max[LEN][M],其中P[i][j]表示从第0天到第i天,满足观察序列,且第i天隐藏状态为Sj的所有可能的隐藏序列的概率的最大值。Path[LEN][M],其中Prev[i][j]=prev,其中Max[i][j]=Max[i][prev]*A[prev][j]; Max[ 0 ][j] = P[j] * B[j][O[ 0 ]]; // j=0,1,2,...,M-1, 第一天计算,状态的初始概率,乘上隐藏状态到观察状态的条件概率。 Path[ 0 ][j] = - 1 ; // 第一天的前面的路径为空,用-1代表。 Max[i][j] = Max{P[i - 1 ][k] * A[k][i]} * B[j][O[i]]; // i>1, j=0,1,2,...,M-1, k=0,1,2,...,M-1, 第一天以后的计算,首先从前一天的每个状态,转移到当前状态的概率的最大值,然后乘上隐藏状态到观察状态的条件概率。 Path[i][j] = prev; // 其中prev即为Max{P[i-1][k]*A[k][i]}中对应的k值。
时间复杂度:与向前算法类似,只不过求和变成了取最大值,此外多记录一个Path数组,也是O(LEN * M^2)
5. 学习
学习问题,是根据若干观察序列和对应的隐藏序列样本,得到HMM参数的过程。常用的算法为Baum-Welch算法,也称为向前向后算法。这个算法是EM算法的一个特例,首先需要理解EM算法。由于EM算法一时半会我还搞不清楚,就先写到这里,日后单独补一下EM算法,和向前向后算法。
6. 重点
向前算法:已知模型,计算指定观察序列的概率,要求的是每种隐藏序列的概率的和。
维特比算法:已知模型,计算使得指定观察序列概率最大的隐藏序列,要求的是每种隐藏序列里面的一个序列。 计算过程都是一样的,只不过一个是计算值的和,另一个使计算最大值+路径。7. 参考
HMM中的前向法(Forward Agorithm)
HMM中的维特比解码(Viterbi Agorithm) 我爱自然语言处理中的若干篇文章