参考:
https://zh.wikipedia.org/wiki/%E7%BB%B4%E7%89%B9%E6%AF%94%E7%AE%97%E6%B3%95
http://sobuhu.com/ml/2013/03/07/hmm-pinyin-input-method.html
https://clyyuanzi.gitbooks.io/julymlnotes/content/dl_nn.html
之前写在印象笔记上的memo,顺序比较乱。
----------------------------------------------------------------------------------
HMM (Hidden Markov Model)是关于时序的概率模型,描述由一个隐藏的马尔科夫链生成不可观测的状态随机序列,再由各个状态生成观测随机序列的过程.
HMM 3要素:
1. 初始概率分布 — 是时刻 t=1 处于状态 qi 的概率
2. 状态转移概率分布 — 在时刻 t 处于状态 qi 的条件下时刻 t+1 转移到状态 qj 的概率
3. 观测概率分布 --在时刻 t 处于状态 qi 的条件下生成观测 vk 的概率
举例1: 根据 体感[观测序列] 推测 身体状态[隐藏序列]
1. 初始概率分布 start_probability = {'Healthy': 0.6, 'Fever': 0.4}
2. 状态转移概率分布 — hidden的部分内部转移,跟外部观测无关
transition_probability = {
'Healthy' : {'Healthy': 0.7, 'Fever': 0.3},
'Fever' : {'Healthy': 0.4, 'Fever': 0.6},
}
3. 观测概率分布 — 从hidden的部分指向外部观测的所有可能
emission_probability = {
'Healthy' : {'normal': 0.5, 'cold': 0.4, 'dizzy': 0.1},
'Fever' : {'normal': 0.1, 'cold': 0.3, 'dizzy': 0.6},
}
举例2:根据 输入拼音 推测 汉字
1. 初始概率 state_transfer = get_trans_prop(第一个汉字,'<s>') = { p(我|<s>),p(窝|<s>),p(握|<s>), ...}
2. 状态转移概率分布 — 算是LM的一部分,汉字内部转移,跟拼音无关
transition_probability = {
‘年’:次数,’以’:次数,’后’:次数,’你’:次数,… #字出现次数
‘奋斗’:次数,’团结’:次数,… # 词出现次数
’年|千’:次数,’以|年’:次数,… # 这个跟上面的词出现次数一样
}
写成上面的格式
transition_probability = {
‘以' : {‘前': 0.7, ‘后': 0.3, … },
'团结' : {'奋斗': 0.4, ‘ , ': 0.6, … }, ...
}
3. 观测概率分布 — 这里乍一看好像跟上面不太一样【是从外部拼音生成内部hidden的概率】,但实际上这里表示的是从hidden的汉字到观测到的拼音的概率。这里只是多包了一层。
如果按照上面例子中的格式来存,可以写成:
emission_probability ={
‘种’:{’zhong4’:「种念zhong4的概率」,’zhong3’:「种念zhong3的概率」},
‘重’:{‘chong2’:「重念chong2的概率」, ’zhong4’:「重念zhong4的概率」}, …
}
这么一来又要复杂很多。
# 从拼音、汉字的映射表中读取汉字及汉字到拼音的发射概率
emission_probability = {
'wo': {‘我':1,’窝’:1 ,’握':1,…}, #这里表示「我」只有一个读音
'zhong': {'中':1,'种':0.5 ,'钟':1,…},…
}
HMM的三个基本问题
- 概率计算问题: 前向-后向算法——动态规划
- 给定模型 λ=(A,B,π) 和观测序列 O={o1,o2,?,oT}
- 计算模型 λ 下观测序列 O 出现的概率 P(O∣λ)
- 学习问题: Baum-Welch算法(状态未知)——EM
- 已知观测序列O={o1,o2,?,oT}
- 估计模型 λ=(A,B,π) 的参数,使得在该模型下观测序列 P(O∣λ) 最大
- 预测问题: Viterbi算法——动态规划
- 已知模型 λ=(A,B,π), 和观测序列 O={o1,o2,?,oT}
- 求给定观测序列条件概率 P(I∣O,λ) 最大的状态序列 I={i1,i2,?,iT}
简单点说:
1、评估问题:给定HMM模型,计算出现某观察序列的可能性 — 前向算法,后向算法
2、学习问题:给出观测序列,估计HMM模型 — Forward-backward algorithm,又称之为Baum-Welch算法,虽然它是EM(Expectation-Maximization)算法的一个特例
3、解码问题:给定HMM模型,计算某观察序列最有可能对应的隐藏序列 — viterbi算法
对于概率计算问题,我们有以下3种计算方法:
下面这个wiki的例子。求体感为『normal-cold-dizzy』的概率。
1. 穷举搜索 Exhaustive search for solution :探索hidden部分所有路径
时间复杂度为 ,其中T指的是观察序列长度,N指的是隐藏状态数目。
2. 为了降低复杂度,避免重复计算,我们有了前向算法forward algorithm。
我们定义: 已知 t 时刻观察状态情况下,隐藏状态为 j 的局部概率为
t ( j )= Pr( 观察状态 | 隐藏状态j ) x Pr( t 时刻所有指向 j 状态的路径), 称其为前向变量
表示 ,【给定到 t 时刻为止的观察序列,t 时刻的隐藏序列为 j 】的概率。
在时间 t 时刻状态为 j 的前提下,输出序列为 的概率
对于最后的观察状态,其局部概率包括了通过所有可能的路径到达这些状态的概率——例如,对于上述网格,最终的局部概率通过如下路径计算得出:
由此可见,对于这些最终局部概率求和等价于对于网格中所有可能的路径概率求和,也就求出了给定隐马尔科夫模型(HMM)后的观察序列概率。
时间复杂度为
3. backward algorithm
相似地,我们也可以定义一个后向变量Bt(i)(同样可以理解为一个局部概率):
表示,【给定从 时刻起 到结束时的观察序列,t 时刻的隐藏序列为 i 】的概率。
在时间 t 时刻状态为 i 的前提下,输出序列为 的概率
所以我们的目标可以表示为:
= 【在 t=1 时刻状态为 healthy 的前提下,输出序列为 [cold,dizzy] 的概率】* 【healthy时改到normal的概率】
+【在 t=1 时刻状态为 fever 的前提下,输出序列为 [cold,dizzy]的概率】* 【fever时改到normal的概率】
后向变量(局部概率)表示的是已知隐马尔科夫模型及t时刻位于隐藏状态Si这一事实,从t+1时刻到终止时刻的局部观察序列的概率。同样与前向算法相似,我们可以从后向前(故称之为后向算法)递归地计算后向变量:
1)初始化,令t=T时刻所有状态的后向变量为1:
2)归纳,递归计算每个时间点,t=T-1,T-2,…,1时的后向变量:
这样就可以计算每个时间点上所有的隐藏状态所对应的后向变量,如果需要利用后向算法计算观察序列的概率,只需将t=1时刻的后向变量(局部概率)相加即可。下图显示的是t+1时刻与t时刻的后向变量之间的关系: