创建时间:2024-10-09
首发时间:2024-10-12
最后编辑时间:2024-10-12
作者:Geeker_LStar
你好呀~这里是 Geeker_LStar 的人工智能学习专栏,很高兴遇见你~
我是 Geeker_LStar,一名高一学生,热爱计算机和数学,我们一起加油~!
⭐(●’◡’●) ⭐
嗨!!这是隐马尔可夫模型 HMM 的第二篇~!在上一篇中,我讲了 HMM 的概念、适用任务以及它的 “三大问题” 中的评估问题。这一篇中来讲 “三大问题” 中的另外两个——评估问题和解码问题!
如果没有看过上一篇的话,可以去看一下,和这篇的联系还是蛮多的(比如 HMM 简介、notation 规定、评估问题等):
【高中生讲机器学习】20. 隐马尔可夫模型好难?看过来!(上篇)
话不多说,我们开始这篇吧!
文章目录
- 学习任务
- Baum-Welch 算法
- 标注任务
- 近似算法
- Viterbi 算法
- HMM 总结
学习任务
Baum-Welch 算法
上篇的介绍中说了,所谓学习任务,就是给定一个观测序列,学习使得这个观测序列出现概率最大的参数。同时,HMM 又是一个含有隐变量(状态序列)的模型,so,HMM 的学习问题实质上就是含有隐变量的模型的参数估计(极大似然估计)问题。
吼,这,这多熟悉呀!! 含有隐变量的模型的参数估计(极大似然估计)问题,这毫无疑问用 EM 算法呀!
关于极大似然估计和 EM 算法,可以参考我的这两篇文章:
【初中生讲机器学习】15. EM 算法一万字详解!一起来学!
【初中生讲机器学习】12. 似然函数和极大似然估计:原理、应用与代码实现
(可以说,HMM 的学习任务使用的就是 EM 算法,所以建议把 EM 好好看看!!(而 EM 的基础又是极大似然估计,so 可以开始《递归学习》了(((
嗯,我原本想在这里直接用 EM 算法的结论(Q 函数)来着的,但是我突然想到这篇的 notation 和 EM 那篇的 notation 还有挺多区别的,所以直接在这里再推一遍吧!!
注:这篇中所有的 notation 均沿用自上一篇,如果有不明白的 notation,可以去上一篇找~
我们记 HMM 的参数为 λ \lambda λ,即 λ = ( A , B , π ) \lambda=(A, B, \pi) λ=(A,B,π)。
我们设隐藏的状态序列
I
I
I 和已知的观测序列
O
O
O 的长度都为
T
T
T,
I
I
I 和
O
O
O 构成完全数据,即:
I
=
(
i
1
,
i
2
,
.
.
.
,
i
T
)
O
=
(
o
1
,
o
2
,
.
.
.
,
o
T
)
\begin{align} I = (i_1, i_2, ..., i_T) \\ O = (o_1, o_2, ..., o_T) \end{align}
I=(i1,i2,...,iT)O=(o1,o2,...,oT)
这样的话,根据极大似然估计那篇里面讲的,完全数据的对数似然函数就可以写为:
L
(
λ
)
=
log
P
(
O
∣
λ
)
\begin{align} L(\lambda) = \text{log} \ P(O|\lambda) \end{align}
L(λ)=log P(O∣λ)
then,根据 EM 算法的处理方式,我们把对数似然函数展开:
L
(
λ
)
=
log
∑
I
P
(
O
∣
I
,
λ
)
P
(
I
∣
λ
)
\begin{align} L(\lambda) = \text{log} \ \sum_I P(O|I,\lambda)P(I|\lambda) \end{align}
L(λ)=log I∑P(O∣I,λ)P(I∣λ)
这很好理解,相当于全概率公式。在参数 λ \lambda λ 下观测到观测序列 O O O 的概率就等于在参数 λ \lambda λ 下,所有可能的(隐藏)状态序列 I I I 下可能观测到 O O O 的概率之和。
豪德,我们继续。下面所有过程在 EM 算法那篇都说过,所以不再赘述,直接写推导过程(当然,会有简单的解释)。
参数估计要干什么,要极大化对数似然函数,对吧。但是现在的这个函数肯定没法算极大化啊(指通过偏导数求出解析解),log 里面套着 sigma,,,so 我们曲线救国,采用迭代的方式,逐步极大化!
嗯,所谓迭代极大化,就是每次增大一点嘛,那我们只需要算出每次迭代后比上一次的增量,然后让这个增量极大,就可以了呀。
好的,虽然但是我又把 EM 的主要思路讲了一遍。好吧那我收回前面那句 “不再赘述”,还是好好讲一下吧…(当然,更完整的版本还是在 EM 那一篇~
设上一次迭代中得到的参数为 λ ‾ \overline{\lambda} λ,则上一次迭代的对数似然函数为 L ( λ ‾ ) L(\overline{\lambda}) L(λ),注意这是我们已经算出来的。
那么,增量为:
L
(
λ
)
−
L
(
λ
‾
)
=
log
∑
I
P
(
O
∣
I
,
λ
)
P
(
I
∣
λ
)
−
log
P
(
O
∣
λ
‾
)
\begin{align} & L(\lambda)-L(\overline{\lambda}) \\ & = \text{log} \ \sum_I P(O|I,\lambda)P(I|\lambda) - \text{log} \ P(O|\overline{\lambda}) \end{align}
L(λ)−L(λ)=log I∑P(O∣I,λ)P(I∣λ)−log P(O∣λ)
好的,但是现在这个东西还是没有办法丝滑地进行任何求导,这意味着我们还要进行变形,把 log 放到 sigma 里面去。
嗯,插一句,这里涉及到一个问题:为什么把 log \log log 放在 sigma 里面(而不是外面,像现在这样)会更容易求导?关于这个问题,我会写一篇随记来说明。就不在这里展开讨论了,但是我们下面会用到这个点。
在处理同时含有
log
\text{log}
log 和
∑
\sum
∑ 的式子,且希望把 log 放到里面的时候,我们考虑
J
e
n
s
e
n
Jensen
Jensen 不等式,如下:
log
∑
j
λ
j
μ
j
≥
∑
j
λ
j
log
μ
j
s
.
t
.
λ
j
≥
0
,
∑
j
λ
j
=
1
\begin{align} \log\sum_j\lambda_j\mu_j \ge \sum_j\lambda_j\log\mu_j \\ s.t.\ \lambda_j \ge 0, \ \sum_j\lambda_j=1 \end{align}
logj∑λjμj≥j∑λjlogμjs.t. λj≥0, j∑λj=1
豪德,这个不等式为我们提供了灵感!它能够帮助我们把 log \log log 放到 ∑ \sum ∑ 外面,进而简化计算!
so we continue.
我们需要关注这个约束条件, λ j ≥ 0 \lambda_j \ge 0 λj≥0 和 ∑ j λ j = 1 \sum_j\lambda_j=1 ∑jλj=1。这是我们使用 jensen 不等式的前提。
每一项大于 0,所有项的和为 1,这很难不让人想到概率分布诶。
so,我们构造一个概率分布,然后使用 jensen 不等式!
L ( λ ) = log ∑ I P ( O ∣ I , λ ) P ( I ∣ λ ) = log ∑ I P ( I ∣ O , λ ‾ ) P ( O ∣ I , λ ) P ( I ∣ λ ) P ( I ∣ O , λ ‾ ) ≥ ∑ I P ( I ∣ O , λ ‾ ) log P ( O ∣ I , λ ) P ( I ∣ λ ) P ( I ∣ O , λ ‾ ) \begin{align} & L(\lambda)=\log \ \sum_I P(O|I,\lambda)P(I|\lambda) \\ & = \log \ \sum_I P(I|O, \overline{\lambda})\frac{P(O|I,\lambda)P(I|\lambda)}{P(I|O, \overline{\lambda})} \\ & \ge \sum_I P(I|O, \overline{\lambda})\log \frac{P(O|I,\lambda)P(I|\lambda)}{P(I|O, \overline{\lambda})} \\ \end{align} L(λ)=log I∑P(O∣I,λ)P(I∣λ)=log I∑P(I∣O,λ)P(I∣O,λ)P(O∣I,λ)P(I∣λ)≥I∑P(I∣O,λ)logP(I∣O,λ)P(O∣I,λ)P(I∣λ)
豪德,把这个结果带回去:
L
(
λ
)
−
L
(
λ
‾
)
=
log
∑
I
P
(
O
∣
I
,
λ
)
P
(
I
∣
λ
)
−
log
P
(
O
∣
λ
‾
)
≥
∑
I
P
(
I
∣
O
,
λ
‾
)
log
P
(
O
∣
I
,
λ
)
P
(
I
∣
λ
)
P
(
I
∣
O
,
λ
‾
)
−
log
P
(
O
∣
λ
‾
)
\begin{align} & L(\lambda)-L(\overline{\lambda}) \\ & = \text{log} \ \sum_I P(O|I,\lambda)P(I|\lambda) - \log \ P(O|\overline{\lambda}) \\ & \ge \sum_I P(I|O, \overline{\lambda})\log \frac{P(O|I,\lambda)P(I|\lambda)}{P(I|O, \overline{\lambda})} -\log \ P(O|\overline{\lambda}) \\ \end{align}
L(λ)−L(λ)=log I∑P(O∣I,λ)P(I∣λ)−log P(O∣λ)≥I∑P(I∣O,λ)logP(I∣O,λ)P(O∣I,λ)P(I∣λ)−log P(O∣λ)
根据 jensen 不等式的约束条件,我们有:
∑
I
P
(
I
∣
O
,
λ
‾
)
=
1
\begin{align} \sum_I P(I|O, \overline{\lambda})=1 \end{align}
I∑P(I∣O,λ)=1
所以,上面的式子可以进一步变形为:
∑
I
P
(
I
∣
O
,
λ
‾
)
log
P
(
O
∣
I
,
λ
)
P
(
I
∣
λ
)
P
(
I
∣
O
,
λ
‾
)
−
log
P
(
O
∣
λ
‾
)
=
∑
I
P
(
I
∣
O
,
λ
‾
)
log
P
(
O
∣
I
,
λ
)
P
(
I
∣
λ
)
P
(
I
∣
O
,
λ
‾
)
−
∑
I
P
(
I
∣
O
,
λ
‾
)
log
P
(
O
∣
λ
‾
)
=
∑
I
P
(
I
∣
O
,
λ
‾
)
[
log
P
(
O
∣
I
,
λ
)
P
(
I
∣
λ
)
P
(
I
∣
O
,
λ
‾
)
−
log
P
(
O
∣
λ
‾
)
]
=
∑
I
P
(
I
∣
O
,
λ
‾
)
log
P
(
O
∣
I
,
λ
)
P
(
I
∣
λ
)
P
(
I
∣
O
,
λ
‾
)
P
(
O
∣
λ
‾
)
\begin{align} & \sum_I P(I|O, \overline{\lambda})\log \frac{P(O|I,\lambda)P(I|\lambda)}{P(I|O, \overline{\lambda})} -\log \ P(O|\overline{\lambda}) \\ & = \sum_I P(I|O, \overline{\lambda})\log \frac{P(O|I,\lambda)P(I|\lambda)}{P(I|O, \overline{\lambda})} -\sum_IP(I|O, \overline{\lambda}) \log \ P(O|\overline{\lambda}) \\ & = \sum_I P(I|O, \overline{\lambda}) \bigg[\log \frac{P(O|I,\lambda)P(I|\lambda)}{P(I|O, \overline{\lambda})} - \log \ P(O|\overline{\lambda})\bigg] \\ & = \sum_I P(I|O, \overline{\lambda}) \log \frac{P(O|I,\lambda)P(I|\lambda)}{P(I|O, \overline{\lambda})P(O|\overline{\lambda})} \\ \end{align}
I∑P(I∣O,λ)logP(I∣O,λ)P(O∣I,λ)P(I∣λ)−log P(O∣λ)=I∑P(I∣O,λ)logP(I∣O,λ)P(O∣I,λ)P(I∣λ)−I∑P(I∣O,λ)log P(O∣λ)=I∑P(I∣O,λ)[logP(I∣O,λ)P(O∣I,λ)P(I∣λ)−log P(O∣λ)]=I∑P(I∣O,λ)logP(I∣O,λ)P(O∣λ)P(O∣I,λ)P(I∣λ)
豪德!现在我们得到了这个,但是,呃呃呃,这玩意最初是怎么算的来着。。?什么式子最终得到了它??
哦,原来是 L ( λ ) − L ( λ ‾ ) L(\lambda)-L(\overline{\lambda}) L(λ)−L(λ) 这个,当前的对数似然函数减去上一轮的对数似然函数。
最终,我们得到:
L
(
λ
)
−
L
(
λ
‾
)
≥
∑
I
P
(
I
∣
O
,
λ
‾
)
log
P
(
O
∣
I
,
λ
)
P
(
I
∣
λ
)
P
(
I
∣
O
,
λ
‾
)
P
(
O
∣
λ
‾
)
\begin{align} & L(\lambda)-L(\overline{\lambda}) \\ & \ge \sum_I P(I|O, \overline{\lambda}) \log \frac{P(O|I,\lambda)P(I|\lambda)}{P(I|O, \overline{\lambda})P(O|\overline{\lambda})} \\ \end{align}
L(λ)−L(λ)≥I∑P(I∣O,λ)logP(I∣O,λ)P(O∣λ)P(O∣I,λ)P(I∣λ)
也就是:
L
(
λ
)
≥
L
(
λ
‾
)
+
∑
I
P
(
I
∣
O
,
λ
‾
)
log
P
(
O
∣
I
,
λ
)
P
(
I
∣
λ
)
P
(
I
∣
O
,
λ
‾
)
P
(
O
∣
λ
‾
)
\begin{align} & L(\lambda) \ge L(\overline{\lambda}) + \sum_I P(I|O, \overline{\lambda}) \log \frac{P(O|I,\lambda)P(I|\lambda)}{P(I|O, \overline{\lambda})P(O|\overline{\lambda})} \\ \end{align}
L(λ)≥L(λ)+I∑P(I∣O,λ)logP(I∣O,λ)P(O∣λ)P(O∣I,λ)P(I∣λ)
还是按照 EM 算法,我们把不等号右边的部分记作
B
(
λ
,
λ
‾
)
B(\lambda, \overline{\lambda})
B(λ,λ),那么我们有:
L
(
λ
)
≥
B
(
λ
,
λ
‾
)
\begin{align} L(\lambda) \ge B(\lambda, \overline{\lambda}) \end{align}
L(λ)≥B(λ,λ)
同时,我们有
L
(
λ
‾
)
=
B
(
λ
‾
,
λ
‾
)
L(\overline{\lambda})=B(\overline{\lambda}, \overline{\lambda})
L(λ)=B(λ,λ).
(这就不解释了,把
λ
‾
\overline{\lambda}
λ 带进去算一下就好了,这真的是《注意到》((()
上面的推导说明什么?
说明,只要我们能够使得
B
(
λ
,
λ
‾
)
≥
B
(
λ
‾
,
λ
‾
)
B(\lambda, \overline{\lambda}) \ge B(\overline{\lambda}, \overline{\lambda})
B(λ,λ)≥B(λ,λ),也就是让这一轮迭代的
B
B
B 函数大于上一轮迭代的
B
B
B 函数,我们就实现了让对数似然函数
L
L
L 增大的需求!
yes,其实 B B B 函数可以看作 L ( λ ) L(\lambda) L(λ) 的一个下界,在 λ = λ ‾ \lambda=\overline{\lambda} λ=λ 的时候两者相等,在其它任何时候 L L L 均大于 B B B,所以只要我们能够让这一轮的 B B B 函数的值比上一轮的大,我们就实现了迭代更新对数似然函数的目标。
豪德,到这里总结一下。
我们原先要最大化
L
(
λ
)
L(\lambda)
L(λ),但是因为不能直接求偏导(这就导致既不能直接算解析解,也不能梯度下降),所以我们通过迭代的方式,极大化这一轮的对数似然函数与上一轮的对数似然函数的差(就是每次让对数似然函数尽可能增加的多)。但这个差依然不能直接求偏导,所以我们使用了 jensen 不等式,构造出差的下界,并通过极大化这个下界的方式极大化差,进而达到极大化这一轮的对数似然函数的目标。
(嗯,关于 EM 算法的收敛性,这个之前还没有写过,在这里也不展开写了,可能会开一篇新的文章写,也可能在 EM 那篇的基础上补充。)
豪德!我们已经快成功了,现在还剩一点…
看看这个 B B B 函数,貌似这里面有一些项是常数,有没有这些项并不会影响最终的极大化结果,我们可以把它们略去,以简化计算。
所有包含
λ
‾
\overline{\lambda}
λ 的项都是常数,因为对于 HMM 来说,一旦它的参数确定了,所有的概率分布也就都确定了。
但是注意,并不是所有含有
λ
‾
\overline{\lambda}
λ 的项都可以略去,作为系数的项比如
P
(
I
∣
O
,
λ
‾
)
P(I|O, \overline{\lambda})
P(I∣O,λ) 会影响最终结果,所以不能略去。
所以,为了简洁,我们把这些对于极大化而言是常数且不会影响最终结果的项略去,得到最终需要极大化的式子,记作 Q Q Q 函数。
也就是说:
B
(
λ
,
λ
‾
)
=
L
(
λ
‾
)
+
∑
I
P
(
I
∣
O
,
λ
‾
)
log
P
(
O
∣
I
,
λ
)
P
(
I
∣
λ
)
P
(
I
∣
O
,
λ
‾
)
P
(
O
∣
λ
‾
)
Q
(
λ
,
λ
‾
)
=
∑
I
P
(
I
∣
O
,
λ
‾
)
log
P
(
O
∣
I
,
λ
)
P
(
I
∣
λ
)
\begin{align} & B(\lambda, \overline{\lambda})=L(\overline{\lambda}) + \sum_I P(I|O, \overline{\lambda}) \log \frac{P(O|I,\lambda)P(I|\lambda)}{P(I|O, \overline{\lambda})P(O|\overline{\lambda})} \\ & Q(\lambda, \overline{\lambda})=\sum_I P(I|O, \overline{\lambda}) \log P(O|I,\lambda)P(I|\lambda) \end{align}
B(λ,λ)=L(λ)+I∑P(I∣O,λ)logP(I∣O,λ)P(O∣λ)P(O∣I,λ)P(I∣λ)Q(λ,λ)=I∑P(I∣O,λ)logP(O∣I,λ)P(I∣λ)
然后,我们再变形一下,条件概率和边缘概率相乘,得到联合概率,即:
Q
(
λ
,
λ
‾
)
=
∑
I
P
(
I
∣
O
,
λ
‾
)
log
P
(
O
∣
I
,
λ
)
P
(
I
∣
λ
)
=
∑
I
P
(
I
∣
O
,
λ
‾
)
log
P
(
O
,
I
∣
λ
)
\begin{align} & Q(\lambda, \overline{\lambda})=\sum_I P(I|O, \overline{\lambda}) \log P(O|I,\lambda)P(I|\lambda) \\ & = \sum_I P(I|O, \overline{\lambda}) \log P(O,I|\lambda) \\ \end{align}
Q(λ,λ)=I∑P(I∣O,λ)logP(O∣I,λ)P(I∣λ)=I∑P(I∣O,λ)logP(O,I∣λ)
这个式子还可以进一步变形,注意
∑
\sum
∑ 后面的第一项,即没有
log
\log
log 的那一项。
还是使用条件概率、联合概率和边缘概率之间的等式关系,我们有:
P
(
I
∣
O
,
λ
‾
)
=
P
(
O
,
I
∣
λ
‾
)
P
(
O
∣
λ
‾
)
\begin{align} P(I|O, \overline{\lambda})=\frac{P(O, I|\overline{\lambda})}{P(O|\overline{\lambda})} \end{align}
P(I∣O,λ)=P(O∣λ)P(O,I∣λ)
即条件概率等于联合概率除以边缘概率。
豪德,接下来把条件概率用联合概率和边缘概率的商表示,带进原式。
Q
(
λ
,
λ
‾
)
=
∑
I
P
(
I
∣
O
,
λ
‾
)
log
P
(
O
,
I
∣
λ
)
=
∑
I
P
(
O
,
I
∣
λ
‾
)
P
(
O
∣
λ
‾
)
log
P
(
O
,
I
∣
λ
)
\begin{align} & Q(\lambda, \overline{\lambda}) = \sum_I P(I|O, \overline{\lambda}) \log P(O,I|\lambda) \\ & = \sum_I \frac{P(O, I|\overline{\lambda})}{P(O|\overline{\lambda})} \log P(O,I|\lambda) \end{align}
Q(λ,λ)=I∑P(I∣O,λ)logP(O,I∣λ)=I∑P(O∣λ)P(O,I∣λ)logP(O,I∣λ)
不难发现,这里新出现的这个分母
P
(
O
∣
λ
‾
)
P(O|\overline{\lambda})
P(O∣λ) 相对于
Q
Q
Q 函数的优化而言只是一个常数,我们把它略去,得到最终的
Q
Q
Q 函数。
Q
(
λ
,
λ
‾
)
=
∑
I
P
(
O
,
I
∣
λ
‾
)
log
P
(
O
,
I
∣
λ
)
\begin{align} & Q(\lambda, \overline{\lambda}) = \sum_I P(O, I|\overline{\lambda}) \log P(O,I|\lambda) \\ \end{align}
Q(λ,λ)=I∑P(O,I∣λ)logP(O,I∣λ)
好的!通过这么——多——的变形,我们终于把原来的怎么算也不方便的对数似然函数变成了现在这个非常 nice 的形式!
我们最终要求的就是:
λ
=
arg max
λ
Q
(
λ
,
λ
‾
)
\begin{align} \lambda = \argmax_\lambda Q(\lambda, \overline\lambda) \end{align}
λ=λargmaxQ(λ,λ)
也就是让 Q Q Q 函数(等价于原始的对数似然函数)极大化的参数 λ \lambda λ.
记住,HMM 的学习算法其实就是 EM 算法,没有任何区别,只不过换了个名字。核心思想就是迭代,迭代,迭代。
很好,现在我们已经得到了最终要极大化的 Q Q Q 函数,然而,现在这个函数中,代求的参数有三个,且这三个参数不能合在一个式子中表示,所以我们没有办法直接对这个 Q Q Q 函数求极大值。
(什么叫可以放在一个式子中表示呢?比如说,我们考虑,如果现在的参数
λ
\lambda
λ 是高斯分布的两个参数
μ
\mu
μ 和
σ
\sigma
σ,那么它们两个就可以一起放在高斯分布的式子中,如果后面要求解偏导,只需要让高斯分布的式子分别对它们两个求偏导就可以了。
(但是在这里,我们的三个参数没有被统一到一个式子当中,也就是说我们现在还是没有办法求解偏导数。
en,那么接下来,我们可以开始进一步对
Q
Q
Q 函数进行变形了,我们的目标是把三个参数拆解到三个式子中,再分别求解。
我们看
log
P
(
O
,
I
∣
λ
)
\log P(O,I|\lambda)
logP(O,I∣λ) 这一项。
首先再回顾一下最开始规定的 notation:
I
=
(
i
1
,
i
2
,
.
.
.
,
i
T
)
O
=
(
o
1
,
o
2
,
.
.
.
,
o
T
)
\begin{align} I = (i_1, i_2, ..., i_T) \\ O = (o_1, o_2, ..., o_T) \end{align}
I=(i1,i2,...,iT)O=(o1,o2,...,oT)
其它的 notation(参数的)在上一篇。
我们有:
P
(
O
,
I
∣
λ
)
=
π
i
1
b
i
1
(
o
1
)
a
i
1
i
2
b
i
2
(
o
2
)
.
.
.
a
i
T
−
1
i
T
b
i
T
(
o
T
)
\begin{align} P(O,I|\lambda)=\pi_{i_1}b_{i_1}(o_1)a_{i_1i_2}b_{i_2}(o_2)...a_{i_{T-1}i_T}b_{i_T}(o_{T}) \end{align}
P(O,I∣λ)=πi1bi1(o1)ai1i2bi2(o2)...aiT−1iTbiT(oT)
啊虽然这个式子很长,但是其实很好理解,上一篇里面提到了。
根据对数的运算性质
log
A
B
=
log
A
+
log
B
\log AB = \log A+ \log B
logAB=logA+logB,我们有:
log
P
(
O
,
I
∣
λ
)
=
log
π
i
1
+
∑
t
=
1
T
−
1
log
a
i
t
i
t
+
1
+
∑
t
=
1
T
log
b
i
T
(
O
t
)
\begin{align} \log P(O,I|\lambda)=\log \pi_{i_1}+\sum_{t=1}^{T-1}\log a_{i_ti_{t+1}}+\sum_{t=1}^{T}\log b_{i_T}(O_t) \end{align}
logP(O,I∣λ)=logπi1+t=1∑T−1logaitit+1+t=1∑TlogbiT(Ot)
很好,现在我们已经得到了最终的
Q
Q
Q 函数,however,现在所有的参数被写在一起,我们没有
okay,我们把这个带回式(31),得到:
Q
(
λ
,
λ
‾
)
=
∑
I
[
P
(
O
,
I
∣
λ
‾
)
(
log
π
i
1
+
∑
t
=
1
T
−
1
log
a
i
t
i
t
+
1
+
∑
t
=
1
T
log
b
i
T
(
O
t
)
)
]
=
∑
I
[
P
(
O
,
I
∣
λ
‾
)
log
π
i
1
+
P
(
O
,
I
∣
λ
‾
)
∑
t
=
1
T
−
1
log
a
i
t
i
t
+
1
+
P
(
O
,
I
∣
λ
‾
)
∑
t
=
1
T
log
b
i
T
(
O
t
)
]
=
∑
I
P
(
O
,
I
∣
λ
‾
)
log
π
i
1
+
∑
I
P
(
O
,
I
∣
λ
‾
)
∑
t
=
1
T
−
1
log
a
i
t
i
t
+
1
+
∑
I
P
(
O
,
I
∣
λ
‾
)
∑
t
=
1
T
log
b
i
T
(
O
t
)
=
∑
I
log
π
i
1
P
(
O
,
I
∣
λ
‾
)
+
∑
I
(
∑
t
=
1
T
−
1
log
a
i
t
i
t
+
1
)
P
(
O
,
I
∣
λ
‾
)
+
∑
I
(
∑
t
=
1
T
log
b
i
T
(
O
t
)
)
P
(
O
,
I
∣
λ
‾
)
\begin{align} & Q(\lambda, \overline{\lambda}) = \sum_I \bigg[P(O, I|\overline{\lambda}) (\log \pi_{i_1}+\sum_{t=1}^{T-1}\log a_{i_ti_{t+1}}+\sum_{t=1}^{T}\log b_{i_T}(O_t))\bigg] \\ &= \sum_I \bigg[P(O, I|\overline{\lambda}) \log \pi_{i_1}+P(O, I|\overline{\lambda})\sum_{t=1}^{T-1}\log a_{i_ti_{t+1}}+P(O, I|\overline{\lambda})\sum_{t=1}^{T}\log b_{i_T}(O_t) \bigg]\\ & =\sum_I P(O, I|\overline{\lambda}) \log \pi_{i_1}+\sum_IP(O, I|\overline{\lambda})\sum_{t=1}^{T-1}\log a_{i_ti_{t+1}}+\sum_IP(O, I|\overline{\lambda})\sum_{t=1}^{T}\log b_{i_T}(O_t) \\ & =\sum_I \log \pi_{i_1} P(O, I|\overline{\lambda}) +\sum_I\bigg(\sum_{t=1}^{T-1}\log a_{i_ti_{t+1}}\bigg)P(O, I|\overline{\lambda})+\sum_I\bigg(\sum_{t=1}^{T}\log b_{i_T}(O_t)\bigg)P(O, I|\overline{\lambda}) \\ \end{align}
Q(λ,λ)=I∑[P(O,I∣λ)(logπi1+t=1∑T−1logaitit+1+t=1∑TlogbiT(Ot))]=I∑[P(O,I∣λ)logπi1+P(O,I∣λ)t=1∑T−1logaitit+1+P(O,I∣λ)t=1∑TlogbiT(Ot)]=I∑P(O,I∣λ)logπi1+I∑P(O,I∣λ)t=1∑T−1logaitit+1+I∑P(O,I∣λ)t=1∑TlogbiT(Ot)=I∑logπi1P(O,I∣λ)+I∑(t=1∑T−1logaitit+1)P(O,I∣λ)+I∑(t=1∑TlogbiT(Ot))P(O,I∣λ)
看着很多,但其实只是把括号打开了而已,不涉及到任何其它的变形。
式(39)和式(40)是一样的,只是把
∑
\sum
∑ 放到了一起,看起来更清晰。
完美!现在我们把
Q
Q
Q 函数表示成了三项之和的形式,要极大化
Q
Q
Q 函数,只需要对这三项分别极大化就可以啦!!
同时,回想一下我们刚才讲的,我们要求的是使得
Q
Q
Q 函数极大化的参数
π
,
A
,
B
\pi, A, B
π,A,B,这种三项拆分的方式允许我们分别对这三项进行极大化,也就是分别找出要求的三个参数!
okay!! 那我们分别来看吧。
第一项是 ∑ I log π i 1 P ( O , I ∣ λ ‾ ) \sum_I \log \pi_{i_1} P(O, I|\overline{\lambda}) ∑Ilogπi1P(O,I∣λ),但是我们发现, ∑ I \sum_I ∑I 就相当于 ∑ i = 1 N \sum_{i=1}^N ∑i=1N(一共有 N N N 种可能的状态),和全概率公式一个道理。
so,“等量代换”,我们得到:
∑
I
log
π
i
1
P
(
O
,
I
∣
λ
‾
)
=
∑
i
=
1
N
log
π
i
P
(
O
,
i
1
=
i
∣
λ
‾
)
\begin{align} \sum_I \log \pi_{i_1} P(O, I|\overline{\lambda})=\sum_{i=1}^N \log \pi_{i} P(O,i_1=i|\overline{\lambda}) \end{align}
I∑logπi1P(O,I∣λ)=i=1∑NlogπiP(O,i1=i∣λ)
wait,我们要求什么来着?要求出让这个式子极大化的参数
π
\pi
π 对吧,嗯…
现在这个式子可以直接求偏导数,但是我们还要注意一个点,
π
\pi
π 是初始概率,所以所有可能的
π
i
\pi_i
πi 加起来应该等于 1,即我们有一个约束条件。
所以,现在问题变成了一个约束最优化问题。
π
=
arg max
π
∑
i
=
1
N
log
π
i
P
(
O
,
i
1
=
i
∣
λ
‾
)
s
.
t
∑
i
=
1
N
π
i
=
1
\begin{align} & \pi = \argmax_\pi\sum_{i=1}^N \log \pi_{i} P(O,i_1=i|\overline{\lambda}) \\ & s.t \ \sum_{i=1}^N \pi_i = 1 \end{align}
π=πargmaxi=1∑NlogπiP(O,i1=i∣λ)s.t i=1∑Nπi=1
不用说了,拉格朗日乘子法启动,构造拉格朗日函数:
∑
i
=
1
N
log
π
i
P
(
O
,
i
1
=
i
∣
λ
‾
)
+
γ
(
∑
i
=
1
N
π
i
−
1
)
\begin{align} \sum_{i=1}^N \log \pi_{i} P(O,i_1=i|\overline{\lambda})+\gamma(\sum_{i=1}^N \pi_i-1) \end{align}
i=1∑NlogπiP(O,i1=i∣λ)+γ(i=1∑Nπi−1)
okay,这就是最终的函数,它的偏导就蛮好求了:
∂
∂
π
i
[
∑
i
=
1
N
log
π
i
P
(
O
,
i
1
=
i
∣
λ
‾
)
+
γ
(
∑
i
=
1
N
π
i
−
1
)
]
=
0
\begin{align} \frac{\partial}{\partial \pi_i}\bigg[\sum_{i=1}^N \log \pi_{i} P(O,i_1=i|\overline{\lambda})+\gamma(\sum_{i=1}^N \pi_i-1)\bigg]=0 \end{align}
∂πi∂[i=1∑NlogπiP(O,i1=i∣λ)+γ(i=1∑Nπi−1)]=0
根据偏导数的运算法则,和的偏导数等于偏导数的和,我们可以把两项分开求导,即:
∂
∂
π
i
[
∑
i
=
1
N
log
π
i
P
(
O
,
i
1
=
i
∣
λ
‾
)
+
γ
(
∑
i
=
1
N
π
i
−
1
)
]
=
∂
∂
π
i
∑
i
=
1
N
log
π
i
P
(
O
,
i
1
=
i
∣
λ
‾
)
+
∂
∂
π
i
γ
(
∑
i
=
1
N
π
i
−
1
)
\begin{align} & \frac{\partial}{\partial \pi_i}\bigg[\sum_{i=1}^N \log \pi_{i} P(O,i_1=i|\overline{\lambda})+\gamma(\sum_{i=1}^N \pi_i-1)\bigg] \\ & =\frac{\partial}{\partial \pi_i}\sum_{i=1}^N \log \pi_{i} P(O,i_1=i|\overline{\lambda}) + \frac{\partial}{\partial \pi_i}\gamma(\sum_{i=1}^N \pi_i-1) \end{align}
∂πi∂[i=1∑NlogπiP(O,i1=i∣λ)+γ(i=1∑Nπi−1)]=∂πi∂i=1∑NlogπiP(O,i1=i∣λ)+∂πi∂γ(i=1∑Nπi−1)
先算第一项吧,我们是对 π i \pi_i πi 求偏导数,或者说,我们考虑每一个 π i \pi_i πi,并对它求偏导数。
∂ ∂ π i log π i P ( O , i 1 = i ∣ λ ‾ ) = 1 π i P ( O , i 1 = i ∣ λ ‾ ) \begin{align} & \frac{\partial}{\partial \pi_i}\log \pi_{i} P(O,i_1=i|\overline{\lambda}) \\ & =\frac{1}{\pi_i}P(O,i_1=i|\overline{\lambda}) \end{align} ∂πi∂logπiP(O,i1=i∣λ)=πi1P(O,i1=i∣λ)
well,这里需要解释一下,为什么在求偏导数的时候,求和符号消失了?
其实这还算好想,可以把 ∑ \sum ∑ 看作一个 for 循环,也就是说,我们每次只是针对一个特定的 i i i 对应的 π i \pi_i πi 求偏导,那么其它的(和现在这个正在被计算的 i i i 不相等的) i i i 以及它们对应的 π i \pi_i πi 就都可以被看作常数。而对于偏导数来说,和当前变量无关的变量的都可以被看作常数,它们的偏导数是 0. so, ∑ \sum ∑ 中的其它部分就都可以被忽略了,也就是说,我们可以 “穿透”(忽略) ∑ \sum ∑,直接对它里面的部分求偏导。
然后再来看第二项,第二项也有
∑
\sum
∑,对
∑
\sum
∑ 的处理和第一项同理,so 我们有:
∂
∂
π
i
γ
(
∑
i
=
1
N
π
i
−
1
)
=
γ
\begin{align} & \frac{\partial}{\partial \pi_i}\gamma(\sum_{i=1}^N \pi_i-1) \\ & =\gamma \end{align}
∂πi∂γ(i=1∑Nπi−1)=γ
豪德,最终把对两项的偏导加起来,得到最终的偏导:
1
π
i
P
(
O
,
i
1
=
i
∣
λ
‾
)
+
γ
=
0
→
P
(
O
,
i
1
=
i
∣
λ
‾
)
+
γ
π
i
=
0
\begin{align} & \frac{1}{\pi_i}P(O,i_1=i|\overline{\lambda})+\gamma = 0 \\ & \to P(O,i_1=i|\overline{\lambda})+\gamma\pi_i=0 \end{align}
πi1P(O,i1=i∣λ)+γ=0→P(O,i1=i∣λ)+γπi=0
嗯,进一步变形:
P
(
O
,
i
1
=
i
∣
λ
‾
)
=
−
γ
π
i
\begin{align} & P(O,i_1=i|\overline{\lambda})=-\gamma \pi_i \end{align}
P(O,i1=i∣λ)=−γπi
记住,现在我们一直是在对某一个
π
i
\pi_i
πi 求偏导,接下来我们把所有的
π
i
\pi_i
πi 求偏导的结果加起来。
∑
i
=
1
N
P
(
O
,
i
1
=
i
∣
λ
‾
)
=
∑
i
=
1
N
−
γ
π
i
→
P
(
O
∣
λ
‾
)
=
−
γ
\begin{align} & \sum_{i=1}^NP(O,i_1=i|\overline{\lambda})=\sum_{i=1}^N-\gamma \pi_i \\ & \to P(O|\overline{\lambda})=-\gamma \end{align}
i=1∑NP(O,i1=i∣λ)=i=1∑N−γπi→P(O∣λ)=−γ
呃其实就相当于,我们最开始不是把 P ( O ∣ λ ) P(O|\lambda) P(O∣λ) 展开变成 ∑ I P ( O , I ∣ λ ) \sum_IP(O,I|\lambda) ∑IP(O,I∣λ) 了嘛,然后又把 ∑ I P ( O , I ∣ λ ) \sum_IP(O,I|\lambda) ∑IP(O,I∣λ) 变成了 ∑ i = 1 N P ( O , i 1 = i ∣ λ ‾ ) \sum_{i=1}^NP(O,i_1=i|\overline{\lambda}) ∑i=1NP(O,i1=i∣λ),所以现在我们干的事情只是又把这些一项项倒回原样了而已,就这么简单~
then,根据式(54),我们有:
π
i
=
P
(
O
,
i
1
=
i
∣
λ
‾
)
−
γ
=
P
(
O
,
i
1
=
i
∣
λ
‾
)
P
(
O
∣
λ
‾
)
\begin{align} \pi_i=\frac{P(O,i_1=i|\overline{\lambda})}{-\gamma}=\frac{P(O,i_1=i|\overline{\lambda})}{P(O|\overline{\lambda})} \end{align}
πi=−γP(O,i1=i∣λ)=P(O∣λ)P(O,i1=i∣λ)
嘿!!!我们求出来了!!!
我们已经求出了三个参数之一的 π i \pi_i πi 的新值!!! 这个值就是这一轮迭代的最终结果~!
至于分子和分母的具体算法,就是上一篇中的评估问题讲的啦~~(已知参数和观测序列,求该观测序列出现的概率。
嗯,现在我们不妨换个视角,用更加 intuition 的方式看一看这个结果。
这个结果其实很符合直觉。
分子是在已知参数的情况下,对于一个给定的观测序列 O O O,某个特定的状态 i i i 作为第一个状态出现的概率;而分母是,在已知参数(和分子相同的参数)的情况下,一个特定的观测序列 O O O 出现的概率。分数的值恰好就是在上一轮迭代中,某个特定的状态 i i i 出现的频率。
经过如此复杂的推导,我们最终得到了一个非常符合直觉的结果,这非常 nice!!
其实在极大似然估计那一篇中我说过,极大似然估计的结果有些时候非常符合直觉,当时举了一个高斯分布参数估计的例子。
okay,我们来看看第二项。其实对于第二项也是同理。
首先还是全概率公式,换一个形式:
∑
I
(
∑
t
=
1
T
−
1
log
a
i
t
i
t
+
1
)
P
(
O
,
I
∣
λ
‾
)
=
∑
i
=
1
N
∑
j
=
1
N
∑
t
=
1
T
−
1
log
a
i
t
i
t
+
1
P
(
O
,
i
t
=
i
,
i
t
+
1
=
j
∣
λ
‾
)
\begin{align} & \sum_I\bigg(\sum_{t=1}^{T-1}\log a_{i_ti_{t+1}}\bigg)P(O, I|\overline{\lambda}) \\ & = \sum_{i=1}^N \sum_{j=1}^N \sum_{t=1}^{T-1} \log a_{i_ti_{t+1}}P(O,i_t=i, i_{t+1}=j|\overline{\lambda}) \end{align}
I∑(t=1∑T−1logaitit+1)P(O,I∣λ)=i=1∑Nj=1∑Nt=1∑T−1logaitit+1P(O,it=i,it+1=j∣λ)
嗯,然后对于这个参数,我们的约束条件是 ∑ j = 1 N a i j = 1 \sum_{j=1}^N a_{ij}=1 ∑j=1Naij=1,还是一样的套路,构造拉格朗日函数,然后求解偏导。除了多套了一层 ∑ \sum ∑ 之外,别的地方没有任何区别。而且其实,我们前面说过,有 ∑ \sum ∑ 的求导可以直接忽略 ∑ \sum ∑,直接对 ∑ \sum ∑ 里面的东西求偏导,所以其实操作是一模一样的~!
最终结果:
a
i
j
=
P
(
O
,
i
t
=
i
,
i
t
+
1
=
j
∣
λ
‾
)
P
(
O
,
i
t
=
i
∣
λ
‾
)
\begin{align} & a_{ij}=\frac{P(O,i_t=i, i_{t+1}=j|\overline{\lambda})}{P(O,i_t=i|\overline{\lambda})} \end{align}
aij=P(O,it=i∣λ)P(O,it=i,it+1=j∣λ)
嗯!然后对于第三个参数
b
j
(
k
)
b_j(k)
bj(k) 也是一样的,还是先换个形式:
∑
I
(
∑
t
=
1
T
log
b
i
T
(
O
t
)
)
P
(
O
,
I
∣
λ
‾
)
=
∑
j
=
1
N
∑
t
=
1
T
log
b
j
(
O
t
)
P
(
O
,
i
t
=
j
∣
λ
‾
)
\begin{align} & \sum_I\bigg(\sum_{t=1}^{T}\log b_{i_T}(O_t)\bigg)P(O, I|\overline{\lambda}) \\ & = \sum_{j=1}^N\sum_{t=1}^{T}\log b_{j}(O_t)P(O, i_t=j|\overline{\lambda}) \end{align}
I∑(t=1∑TlogbiT(Ot))P(O,I∣λ)=j=1∑Nt=1∑Tlogbj(Ot)P(O,it=j∣λ)
解释一下这个形式。
这个形式和之前的两个也都是一样的,按照全概率公式的思想,把所有的
I
I
I 分成了在
t
t
t 时间步状态为
j
j
j 的
N
N
N 个部分相加(因为状态
j
j
j 一共有
N
N
N 种可能的取值)。
然后使用完全一样的方法,不过这次的约束条件变成了
∑
k
=
1
M
b
j
(
k
)
=
1
\sum_{k=1}^M b_j(k)=1
∑k=1Mbj(k)=1,构造拉格朗日函数,求解偏导,得到:
b
j
(
k
)
=
∑
t
=
1
T
P
(
O
,
i
t
=
j
∣
λ
‾
)
I
(
o
t
=
k
)
∑
t
=
1
T
P
(
O
,
i
t
=
j
∣
λ
‾
)
\begin{align} b_j(k)=\frac{\sum_{t=1}^TP(O, i_t=j|\overline{\lambda})I(o_t=k)}{\sum_{t=1}^TP(O, i_t=j|\overline{\lambda})} \end{align}
bj(k)=∑t=1TP(O,it=j∣λ)∑t=1TP(O,it=j∣λ)I(ot=k)
其中 I I I 是指示函数,即如果 o t = k o_t=k ot=k 成立,则 I I I 值为 1,否则为 0
耶!!! 我们已经使用相似的方法,求出了新一轮迭代的参数的结果!
总结一下,对于 HMM 的学习任务,即给定一个观测序列 O O O,求这个观测序列最有可能对应的参数,或者说求使得这个观测序列出现概率最大的参数,我们有一套严谨的流程。
我们的目标是极大化对数似然函数,但是对数似然函数的形式复杂,无法直接极大化。所以我们利用 jensen 不等式构造对数似然函数的下界,得到
Q
Q
Q 函数,将极大化对数似然函数的问题转换为极大化
Q
Q
Q 函数的问题。
随后,我们将
Q
Q
Q 函数拆解为三项,每一项都是一个约束最优化问题,包含一个待求的参数。利用拉格朗日乘子法构建拉格朗日函数,并让拉格朗日函数的偏导数为 0,求得最终的结果。
再简单一点,HMM 的学习算法的内核其实就是 EM 算法,通过多轮迭代逐步极大化对数似然函数,只是后面的计算上有一点 specific 的地方。
豪德!!那学习任务就到这里吧~~已经 1w 多字了诶(感觉又把 EM 重新推了一遍哈哈哈哈哈),我们继续!下一个,标注任务!
标注任务
(前置:标注任务相对于学习任务来说简单不少,没有那么多公式,但是算法本身比较 impressive~!)
HMM 的标注任务,即给定参数 λ \lambda λ 和观测序列 O O O,求使得这个观测序列出现概率最大的状态序列 I I I。
呃当然,你可以说,我只需要找出所有可能的状态序列,然后分别计算
P
(
I
∣
O
,
λ
)
P(I|O,\lambda)
P(I∣O,λ),最后选取使得这个概率最大的
I
I
I 就可以了()
好吧()暴力计算当然是可以的,但,,,,但但但,,(
但你要考虑时间复杂度的a!
so,除了暴力计算以外,对于标注任务,有两个算法——类似于“贪心算法”的近似算法,和使用动态规划的 viterbi 算法,vertibi 算法比较巧妙~!(或者说 dp 本来就是个巧妙的东西()dp 系列的算法很多都很巧妙(((
近似算法
en,近似算法和贪心算法很像,它不考虑全局最优,它在每一步都只考虑在这一步最可能出现的状态。
在上一篇的评估问题中,我们已经计算出了一个 P ( O , i t = i ∣ λ ) P(O, i_t=i|\lambda) P(O,it=i∣λ)。即在给定参数 λ \lambda λ 和观测序列 O O O 的情况下,在时刻 t t t 处于状态 i i i 的概率。
那么,对于一个时间步的每一个状态,我们都可以通过上面的公式,计算在给定参数的观测序列的情况下,在这个时间步处于这个状态的概率。
沿用上一篇的表达,我们有:
γ
t
(
i
)
=
α
t
(
i
)
β
t
(
i
)
P
(
O
∣
λ
)
=
α
t
(
i
)
β
t
(
i
)
∑
j
=
1
N
α
t
(
j
)
β
t
(
j
)
\begin{align} \gamma_t(i)=\frac{\alpha_t(i)\beta_t(i)}{P(O|\lambda)}=\frac{\alpha_t(i)\beta_t(i)}{\sum_{j=1}^N\alpha_t(j)\beta_t(j)} \end{align}
γt(i)=P(O∣λ)αt(i)βt(i)=∑j=1Nαt(j)βt(j)αt(i)βt(i)
嗯,然后就很简单啦,对于每个时间步,我们都选择出在这个时间步处于这个状态的概率最大的那个状态,即:
i t ∗ = arg max 1 ≤ i ≤ N [ δ t ( i ) ] , t = 1 , 2 , . . . , T i^*_t=\argmax_{1 \le i \le N}[\delta_t(i)], \ t=1,2,...,T it∗=1≤i≤Nargmax[δt(i)], t=1,2,...,T
i t ∗ i^*_t it∗ 代表在第 t t t 个时间步被选出来的状态,下文同。
嗯!那这样的话,我们就得到了最终的状态序列 I ∗ = ( i 1 ∗ , i 2 ∗ , . . . , i T ∗ ) I^*=(i_1^*, i_2^*, ..., i^*_T) I∗=(i1∗,i2∗,...,iT∗).
emm 但是,这个算法简单是简单,但是和众多的贪心算法一样,它不能保证找到全局最优解。
如果想要找到全局最优解,那还得是 dp 出场呀,so 我们请出 viterbi 算法吧!!
Viterbi 算法
well,近似算法在每一步都尝试找到那一步的最优解,但这并不一定能保证找到整个序列的最优解。
so,viterbi 算法出现了!它是一种动态规划方法,通过前向递归的方式保证最终找到的序列是全局最优的序列。
先举个例子说明一下 viterbi 算法的核心思想。
先不管概率,就按照最简单的寻找最短路径的方式来看。
看下面这个图,部分连接的长度已经标注在图上了(不过后面不会用到,所以没关系)。我们现在想找出从起点 S S S 到终点 E E E 的最短路径。当然前面已经说过了,不能用暴力计算(((
嗯,,,我们不妨来举个例子。我们计算从起点到
B
1
B_1
B1 的长度。
我们一共有三条到达
B
1
B_1
B1 的线路:
S
−
A
1
−
B
1
,
S
−
A
2
−
B
1
,
S
−
A
3
−
B
1
S-A_1-B_1, S-A_2-B_1, S-A_3-B_1
S−A1−B1,S−A2−B1,S−A3−B1,如下图。
不难发现,当三条线路都汇集到 B 1 B_1 B1 之后,它们的长度被计算出来,then,它们在后续被处理的方式都是一样的——都会以 fully connection 的方式向前连接,继续计算长度,直到终点。
关于相同的处理方式,这里还是举个例子。
这三条线路到达
B
1
B_1
B1 后,都会继续被 “传送” 到
C
1
C_1
C1,也就是说,
B
1
B_1
B1 到
C
1
C_1
C1 的长度会被加到原来的三条线路上。
但是,我们转念一想…
在三个已知的数( S S S 分别经过 A 1 , A 2 , A 3 A_1, A_2, A_3 A1,A2,A3 到达 B 1 B_1 B1 的长度)上加上同一个数( B 1 B_1 B1 到达 C 1 C_1 C1 的长度),并不会改变原来的三个已知的数之间的大小关系呀。
再回头看我们最开始的目标——找出最短的那条路径。
嗯。。既然在原有的三个路径上加上 B 1 B_1 B1 到 C 1 C_1 C1 的长度,并不会影响这三条路径的大小关系,再向前推一步,并不会影响最终的结果,那我们为什么不能直接选择 S − A 1 − B 1 , S − A 2 − B 1 , S − A 3 − B 1 S-A_1-B_1, S-A_2-B_1, S-A_3-B_1 S−A1−B1,S−A2−B1,S−A3−B1 这三个路径里最短的一个,再向前计算呢?反正它们的大小关系已经确定了呀,后面的计算并不会改变它们之间的大小关系。
okay,不过注意一下,这里只是以 B 1 B_1 B1 作为例子,对于 B 2 B_2 B2 和 B 3 B_3 B3,也是同理。
嗯,按照上面的说法,在第二个时间步的时候,最终只会有三条路径被留下,
B
1
,
B
2
,
B
3
B_1, B_2, B_3
B1,B2,B3 各对应一条。比如:
S
−
A
3
−
B
1
S
−
A
2
−
B
2
S
−
A
2
−
B
3
\begin{align} & S-A_3-B_1\\ & S-A_2-B_2\\ & S-A_2-B_3 \end{align}
S−A3−B1S−A2−B2S−A2−B3
路径的筛选规则前面已经讲的很完善啦,被选出来的这三条将会继续向前递推,并在第三个时间步的每个点( C 1 , 2 , 3 C_{1,2,3} C1,2,3) 执行相同的路经筛选操作。
也就是说,viterbi 算法的核心思想就是,在从第二步开始的每一步都删掉那些不可能成为答案的路径,这些路径在后续的计算中不再被考虑;而那些可能成为答案的路径则会被继续计算(有点类似于把可能的路径递归向前计算),直到它成为不可能成为答案的路径,或它成为答案。
那么,了解了 viterbi 算法,把它应用到 HMM 中也就简单了呀。我们只需要把上面例子中的【让路径之和最小】改成【让每一个时间步的概率之积最大】就可以了呀。
豪德,我们来具体看看 viterbi 算法在 HMM 解码问题中的应用。
首先,对于时间步
t
(
t
≥
2
)
t \ (t \ge 2)
t (t≥2) 的任意一个状态
i
i
i,按照上面说的那套流程,我们计算从头开始到时间步
t
t
t 状态
i
i
i 的概率最大值,如下:
δ
t
(
i
)
=
max
i
1
,
i
2
,
.
.
,
i
t
−
1
P
(
i
t
=
i
,
i
t
−
1
,
.
.
.
,
i
1
,
o
t
,
.
.
.
,
o
1
∣
λ
)
,
i
=
1
,
2
,
.
.
.
N
\begin{align} \delta_t(i) = \max_{i_1,i_2, .., i_{t-1}}P(i_t=i, i_{t-1}, ..., i_1, o_t, ..., o_1|\lambda), \ i=1, 2, ... N \end{align}
δt(i)=i1,i2,..,it−1maxP(it=i,it−1,...,i1,ot,...,o1∣λ), i=1,2,...N
嗯,这样的话,我们就得到了变量
δ
\delta
δ 的递推公式,其实就是从时间步
t
t
t 推到时间步
t
+
1
t+1
t+1 的公式,如下:
δ
t
+
1
(
i
)
=
max
i
1
,
i
2
,
.
.
,
i
t
P
(
i
t
+
1
=
i
,
i
t
,
.
.
.
,
i
1
,
o
t
+
1
,
.
.
.
,
o
1
∣
λ
)
,
i
=
1
,
2
,
.
.
.
N
=
max
1
≤
j
≤
N
[
δ
t
(
j
)
a
j
i
]
b
i
(
o
t
+
1
)
,
i
=
1
,
2
,
.
.
.
,
N
;
t
=
1
,
2
,
.
.
.
,
T
−
1
\begin{align} & \delta_{t+1}(i) = \max_{i_1,i_2, .., i_{t}}P(i_{t+1}=i, i_{t}, ..., i_1, o_{t+1}, ..., o_1|\lambda), \ i=1, 2, ... N \\ & = \max_{1\le j \le N}[\delta_t(j)a_{ji}]b_i(o_{t+1}), \ \ i=1,2, ..., N; \ t=1,2,..., T-1 \end{align}
δt+1(i)=i1,i2,..,itmaxP(it+1=i,it,...,i1,ot+1,...,o1∣λ), i=1,2,...N=1≤j≤Nmax[δt(j)aji]bi(ot+1), i=1,2,...,N; t=1,2,...,T−1
a,这其实和我们在上面讲的完全就是一个东西呀,对于每一个时间步的每一个点,选择到这个点的时候概率最大的序列。
嗷,不过现在还有一个问题——我们怎么记录完整的路径?
好吧,这也好办,既然是递推,那我们就记录 t t t 时间步状态 i i i 对应的概率最大的序列的上一个状态(在 t − 1 t-1 t−1 时间步的状态)是什么,就可以了。这样每一步的最优序列的状态都会递推地给到后一步,最终等到全部序列确定以后再回溯就可以了。
嗯,按照这个定义,我们用
ψ
t
(
i
)
\psi_t(i)
ψt(i) 来存储在时间步
t
t
t 的时候状态
i
i
i 对应的概率最大的路径的上一个节点(就是
t
−
1
t-1
t−1 时刻对应的节点):
ψ
t
(
i
)
=
arg max
1
≤
j
≤
N
[
δ
t
−
1
(
j
)
a
j
i
]
,
i
=
1
,
2
,
.
.
.
N
\begin{align} \psi_t(i)=\argmax_{1\le j \le N} [\delta_{t-1}(j)a_{ji}], \ i=1,2,...N \end{align}
ψt(i)=1≤j≤Nargmax[δt−1(j)aji], i=1,2,...N
这里我们不需要考虑 b i ( o t + 1 ) b_i(o_{t+1}) bi(ot+1),因为对于所有的 j j j,这个值都是一样的。
嗯!那么这样的话,我们就可以完整地写一遍 HMM 中的 viterbi 算法啦!
首先,我们需要初始化,或者说单独考虑一下第一个时间步的每个状态的情况。
δ
1
(
i
)
=
π
i
b
i
(
o
1
)
,
i
=
1
,
2
,
.
.
.
N
ψ
1
(
i
)
=
0
,
i
=
1
,
2
,
.
.
.
N
\begin{align} & \delta_1(i)=\pi_i b_i(o_1), \ i=1,2,...N \\ & \psi_1(i)=0, \ i=1,2,...N \\ \end{align}
δ1(i)=πibi(o1), i=1,2,...Nψ1(i)=0, i=1,2,...N
then,从第二个时间步开始,一直到第
T
T
T 个也就是最后一个时间步,我们按照上面的两个递推式子进行递推:
δ
t
(
i
)
=
max
1
≤
j
≤
N
[
δ
t
−
1
(
j
)
a
j
i
]
b
i
(
o
t
)
,
i
=
1
,
2
,
.
.
.
N
ψ
t
(
i
)
=
arg max
1
≤
j
≤
N
[
δ
t
−
1
(
j
)
a
j
i
]
,
i
=
1
,
2
,
.
.
.
N
\begin{align} & \delta_t(i)=\max_{1\le j \le N}[\delta_{t-1}(j)a_{ji}]b_i(o_t), \ i=1,2,...N \\ & \psi_t(i)=\argmax_{1\le j \le N} [\delta_{t-1}(j)a_{ji}], \ i=1,2,...N \end{align}
δt(i)=1≤j≤Nmax[δt−1(j)aji]bi(ot), i=1,2,...Nψt(i)=1≤j≤Nargmax[δt−1(j)aji], i=1,2,...N
在第
T
T
T 个时间步,终止,其实就是在最后一步递推出来的
N
N
N 个状态对应的
N
N
N 个路径中选择了概率最大的一个:
P
∗
=
max
1
≤
i
≤
N
δ
T
(
i
)
i
T
∗
=
arg max
1
≤
i
≤
N
[
δ
T
(
i
)
]
\begin{align} & P^*=\max_{1\le i\le N}\delta_T(i) \\ & i_T^*=\argmax_{1\le i \le N}[\delta_T(i)] \\ \end{align}
P∗=1≤i≤NmaxδT(i)iT∗=1≤i≤Nargmax[δT(i)]
豪德,最后回溯一下:
i
t
∗
=
ψ
t
+
1
(
i
t
+
1
∗
)
\begin{align} i^*_t = \psi_{t+1}(i^*_{t+1}) \end{align}
it∗=ψt+1(it+1∗)
呃这个回溯关系也很好理解,因为 ψ t + 1 ( i ) \psi_{t+1}(i) ψt+1(i) 记录的是第 t + 1 t+1 t+1 个时间步的第 i i i 个状态对应的最优序列在上一个(也就是第 t t t 个)时间步的状态,所以 ψ t + 1 ( i t + 1 ∗ ) \psi_{t+1}(i^*_{t+1}) ψt+1(it+1∗) 就可以一直回溯上一个状态,直到第一个状态。
okaaaaaaaaay!! 以上就是 HMM 中的解码问题!
记住这句话:viterbi 算法在 HMM 解码问题中的应用,实质就是对于第二个时间步及后面的每一个时间步的每一个点(可能的状态)来说,选择到达这个点(状态)的多个路径中概率最大的一个,并删掉其它的。对于这个被选出来的路径,再进行后面的计算。
至于可以这么做的原因,是因为对于一个点(状态)来说,各条路径汇集到它这里的长度就是这条路径从第一个点开始到这个点的【整条路径】的长度,而各条路径汇集到它之后,后面要进行的计算都是一样的(因为既然都汇集到这里了,就说明在这个时间步的状态是一样的,那么在下一个时间步参与的计算也就都会是一样的)。
然后这样,在每一个时间步的每一个点,都进行这样的筛选和删除,直到最后一个时间步。
好耶!!我们已经把 HMM 的标注任务讲完啦!!(撒花~! ★,°:.☆( ̄▽ ̄)/$:.°★ 。
这样的话,整个 HMM 就都讲完啦~!oye!
HMM 总结
小小总结,HMM 用于含有隐藏状态的时间序列数据相关的问题,主要有三个问题:
- 评估问题:已知参数和观测序列,求观测序列出现的概率,使用前向后向算法
- 学习问题:已知观测序列,求使观测序列出现概率最大的参数,使用 EM 算法
- 解码问题:已知参数和挂测序列,求观测序列最有可能对应的状态序列,使用 viterbi 算法
其中前向后向算法和 viterbi 算法的基本思想都是递推,EM 算法的基本思想是迭代。
那,HMM 就到这里啦~!
okay! 那这篇就到这里啦!我们下篇再见!(啊啊啊啊下篇可能就是期中考试以后了 errrr(
这篇文章讲解了 HMM 中的学习问题和解码问题,并给出了完整的数学推导,希望对你有所帮助!⭐
欢迎三连!!一起加油!🎇
——Geeker_LStar