隐马尔可夫模型 (Hidden Markov Model): 一种统计模型,用来描述一个含有隐含未知参数的马尔可夫过程。

1 模型实例

首先用一个具体的实例来初步了解隐马尔可夫模型。

3 个桶,每个桶有 3 种颜色(R, G, B)的球,每个桶内球的数量不同:

R 数量G 数量B 数量
#1333
#2123
#3352

第一步:选取初始桶

我们有一个初始概率分布,随机从 3 个桶内选取一个作为初始桶:

桶 1桶 2桶 3
30%20%50%

第二步:根据目前选取的桶,随机在其中抽取一个球

由于每个桶内球的数量不同,因此抽出球的颜色的概率不同。如果目前在 3 号桶,那么抽出来颜色的概率如下:

RGB
30%50%20%

第三步:根据目前选取的桶,随机转移到另一个桶

我们有一个转移概率矩阵,根据矩阵进行桶的转移:

转移到 1转移到 2转移到 3
原来在 110%30%60%
原来在 220%50%30%
原来在 340%20%40%

例如,如果目前在桶 3,那么转移到桶 1 的概率为 40%.

第四步:回到第二步,循环重复这个过程。

以上,便是隐马尔可夫模型的一个具体实例。具体来说,便是:

  • 状态空间 Y={1,2,3}
  • 观测变量 X={R,G,B}
  • 初始状态概率 π=(0.3,0.2,0.5)
  • 状态转移概率 A=[0.10.30.60.20.50.30.40.20.4]
  • 输出观测概率 B=[0.330.330.330.170.330.50.30.50.2]

2 数学定义

隐马尔可夫模型有两个空间:

  • 系统状态空间 Y={s1,s2,,sN}
  • 观测变量空间 X={o1,o2,,oM}

隐马尔可夫模型有两组变量:

  • 状态变量(隐变量){y1,y2,,yn}yiY 是系统在 i 时刻的状态
  • 观测变量 {x1,x2,,xn}。:xiX 是系统在 i 时刻的观测值

隐马尔可夫模型有两个假设:

  • 齐次性假设:t 时刻状态 yt 仅依赖于 t1 时刻的状态 yt1.
  • 观测独立性假设:观测变量的取值仅依赖于状态变量,与其他状态变量与观测变量无关,即 xt 仅由 yt 确定。

除了上述结构,隐马尔可夫模型还包含三个参数,含义不再解释:

  • 初始状态概率 ππi=P(y1=i)
  • 状态转移概率 A​:aij=P(yt+1=jyt=i)
  • 输出观测概率 Bbi(j)=P(xt=jyt=i)

综上,一个隐马尔可夫模型可以由一个三元组表示:

λ=(A,B,π)

它按以下过程产生观测序列 {x1,x2,,xn}

  1. 设置 t=1,根据初始状态概率 π 选择初始状态 y1
  2. 根据状态 yt 和输出观测概率 B 产生观测变量 xt
  3. 根据状态 yt 和状态转移概率 A 转移模型状态到 yt+1
  4. t<n 则令 tt+1 并跳到第 2​ 步,否则停止

可视化如下:

3 基本问题

我们通常关注隐马尔可夫模型的三个基本问题:

  1. 评估匹配程度:给定模型 λ=(A,B,π),如何计算观测序列 x={x1,x2,,xn} 的概率 P(xλ).
  2. 推断隐藏状态:给定模型 λ=(A,B,π) 和观测序列 x={x1,x2,,xn},计算最匹配的隐藏状态 y={y1,y2,,yn}.
  3. 训练模型参数:给定观测序列 x={x1,x2,,xn},训练模型参数 λ=(A,B,π) 使得 P(xλ) 最大。

回到第一节模型实例的具体例子,这三个问题便是:

  1. 我们知道每个桶内球的具体数量,桶的转移概率,初始桶的概率,要求:产生某种观测序列的概率。
  2. 我们知道每个桶内球的具体数量,桶的转移概率,初始桶的概率,要求:某种观测序列对应的隐藏状态序列。
  3. 我们知道一个观测序列,要求:每个桶内球的具体数量,桶的转移概率,初始桶的概率。

4 概率计算(问题一)

4.1 基本方法

首先,对于给定隐藏状态 y={y1,y2,,yn},我们容易求出它的出现概率:

P(yλ)=πy1ay1,y2ay2,y3ayn1,yn=πy1i=2nayi1,yi

对于给定隐藏状态 y={y1,y2,,yn},观测序列 x={x1,x2,,xn} 的出现概率是:

P(xy,λ)=by1(x1)by2(x2)byn(xn)=i=1nbyi(xi)

y,x 联合出现的概率是:

P(x,yλ)=P(xy,λ)P(yλ)=πy1by1(x1)i=2nayi1,yibyi(xi)

然后求边缘概率,即可得到结果:

P(xλ)=yP(x,yλ)

接下来分析一下计算复杂度,对于长 T 的序列,状态空间大小 N,一共有可能出现 NT 种隐藏状态序列 y={y1,y2,,yn}. 对于每个隐藏状态序列,我们需要 T 次计算。

因此计算复杂度为:O(TNT). 复杂度呈指数增长,对于较长序列几乎不可用

4.2 前向算法

前向算法就是一种动态规划算法,通过动态规划算法,我们不再关心每一种状态序列具体的概率,而是关注每一步的概率。这样相当于将许多情况合并到一起,大幅减少了计算复杂度。

给定隐马尔可夫模型 λ,定义到时刻 t 部分观测序列为 x1,x2,,xt 且状态 ytsi​ 的概率为前向概率,记为:

αt(i)=P(x1,x2,,xt,yt=siλ)

状态转移方式:

αt+1(i)=[j=1Nαt(j)asj,si]bsi(xt+1)

对于每一步,我们需要计算 i=1,2,,N 的前向概率。

当然,动态规划的初始值也非常重要。在本问题中初始值为 t=1 的情况:

α1(i)=πibi,1

当我们递推到序列结尾 t=T 时,就可以开始计算结果了:

P(yλ)=i=1NαT(i)

接下来分析一下计算复杂度,每次递推需要计算 N2 次,一共需要 TN2 次计算。该复杂度至少关于 T 呈线性增长了,基本可以。

例题:

  • Y={s1,s2,s3}
  • X={A,B}
  • π=(1,0,0)
  • A=[0.40.6000.80.2001]
  • B=[0.70.30.40.60.80.2]

求观察序列 ABAB 概率。

答案:

ABAB
1×0.7=0.70.7×0.4×0.3=0.0840.084×0.4×0.7=0.023520.02352×0.4×0.3=0.0028224
00.7×0.6×0.6=0.2520.084×0.6×0.4+0.252×0.8×0.4=0.10080.02352×0.6×0.6+0.1008×0.8×0.6=0.0568512
000.252×0.2×0.8=0.040320.1008×0.2×0.2+0.04032×1×0.2=0.012096

P(ABABλ)=i=1Nα4(i)=0.0717696

4.3 后向算法

后向算法实际上就是前向算法反着来求,前后向算法实际上是等价的。

给定隐马尔可夫模型 λ,定义时刻 tT 部分观测序列为 xt+1,,xT 且状态 ytsi​ 的概率为后向概率,记为:

βt(i)=P(xt+1,xt+2,,xTyt=si,λ)

  • 初始化:βT(i)=1
  • 状态转移:βt(i)=j=1Naijbj(yt+1)βt+1(j)
  • 结果:P(yλ)=i=1Nπibi(y1)β1(i)

5 状态预测(问题二)

5.1 近似算法

近似算法就是朴素的贪心算法,即在每个时刻 t 选取在该时刻最有可能出现的状态 yt.

给定模型 λ 和观测序列 x={x1,x2,,xT},在时刻 t 时,系统处于状态 si 的概率 γt(i) 为:

γt(i)=αt(i)βt(i)P(xλ)=αt(i)βt(i)j=1Nαt(j)βt(j)

那么,对于每一时刻选取最有可能出现的状态:

yt=argmax1iNγt(i)

即可得到预测的状态序列:y={y1,y2,,yn}

容易发现,因为该算法完全忽略了相邻状态的限制,该算法求到的序列有可能是实际中不可能存在的非法序列。

即可能会发生,对于相邻状态 yt=siyt+1=sj,它们不可能进行转移 ai,j=0.

5.2 维特比 (Viterbi) 算法

维特比算法是一种动态规划算法,它的核心思路是:如果最优路径在时刻 t 通过状态 yt,那么该路径从 1t 的部分一定是所有可能的路径中最优的部分。

定义在时刻 t 时,状态为 si 的所有状态路径 (y1,y2,,yt) 中概率的最大值为:

δt(i)=maxy1,y2,,ytP(yt=si,yt1,yt2,,y1,xt,,x1λ)

那么,变量 δ 的转移方式即为:

δt+1(i)=max1jN[δt(j)asj,si]bsi(yt+1)

另外再记在时刻 t 时,状态为 si 的所有状态路径 (y1,y2,,yt) 中概率的最大的路径的上一个节点(即 t1 时刻节点)为:

ψt(i)=argmax1jN[δt1(j)asj,si]

通俗来说 ψ 这个变量就相当于动态规划里的 prev 指针,用来后期回溯用的。

那么接下来,维特比算法的步骤为:

  • 初始化:δ1(i)=πibi(y1),ψ1(i)=0.
  • 递推:根据上文转移公式,通过 δt1 计算出 δtψt.
  • 结果:P=max1iNδT(i),yT=argmax1iNδT(i)
  • 反向回溯:it=ψt+1(it+1)

例题:

HMM 模型参数和上一个例题一致,区别是本题求的是最可能的状态序列 y={y1,y2,,yn}.

答案:

ABAB
δ=0.7,ψ=0δ=0.084,ψ=1δ=0.02352,ψ=1δ=0.0028224,ψ=1
δ=0,ψ=0δ=0.252,ψ=1δ=0.08064,ψ=2δ=0.0387072,ψ=2
δ=0,ψ=0δ=0,ψ=0δ=0.04032,ψ=2δ=0.008064,ψ=3
  • P=max1i3δ4(i)=0.0387072
  • y4=argmax1i3δ4(i)=2
  • y={1,2,2,2}

6 参数学习(问题三)

6.1 极大似然估计(有监督)

如果我们同时拥有观测序列和其对应的状态序列,那么就可以用监督学习的方法进行参数学习。

假设训练数据包含 S 个长度相同的观测序列和对应的状态序列:{(x1,y1),(x2,y2),,(xS,yS)}

估计 A

设训练数据中,从状态 i 转移到状态 j 的频数为 Cij,那么:

a^ij=Cijk=1NCik

估计 B

设训练数据中,状态为 i 时观测为 sj 的频数为 Cij,那么:

b^ij=Cijk=1MCik

估计 π

S 个训练数据中,初始状态为 si 的频数为 Ci,那么:

πi=CiS

6.2 Baum-Welch 算法(无监督)

如果我们只拥有观测序列,那么就只能用无监督的方式学习。

本方法基于 EM 算法:https://io.zouht.com/113.html 具体推导省略

aij=t=1T1P(x,yt=si,yt+1=sjλ¯)t=1T1P(x,yt=siλ¯)bjk=t=1TP(x,yt=sjλ¯)I(xt=sk)t=1TP(x,yt=sjλ¯)πi=P(x,y1=siλ¯)P(xλ¯)