我已经根据本教程 http://cs229.stanford.edu/section/cs229-hmm.pdf实现了一个离散 HMM
本教程和其他教程总是谈到在给定观察序列的情况下训练 HMM。
当我有多个训练序列时会发生什么?我应该按顺序运行它们,一个接一个地训练模型吗?
另一种选择是将序列连接到一个序列并对其进行训练,但随后我将进行从一个序列的结尾到下一个序列的开始的状态转换,这是不真实的。
我已经根据本教程 http://cs229.stanford.edu/section/cs229-hmm.pdf实现了一个离散 HMM
本教程和其他教程总是谈到在给定观察序列的情况下训练 HMM。
当我有多个训练序列时会发生什么?我应该按顺序运行它们,一个接一个地训练模型吗?
另一种选择是将序列连接到一个序列并对其进行训练,但随后我将进行从一个序列的结尾到下一个序列的开始的状态转换,这是不真实的。
用不同的序列连接或运行每次训练迭代都不是正确的做法。正确的方法需要一些解释:
通常使用EM 算法训练 HMM. 这包括几个迭代。每次迭代都有一个“估计”和一个“最大化”步骤。在“最大化”步骤中,您将每个观察向量 x 与模型中的状态 s 对齐,以便最大化某个似然度量。在“估计”步骤中,对于每个状态 s,您估计 (a) 与 s 对齐的 x 向量的统计模型的参数和 (b) 状态转换概率。在接下来的迭代中,使用更新的统计模型等再次运行最大化步骤。该过程重复设定的次数或当似然度量停止显着上升时(即,模型收敛到稳定的解)。最后,(至少在语音识别中)HMM 通常会有一个指定的“开始”
因此,如果您有多个训练序列,则在估计步骤中,您应该运行每个序列,使其初始观察向量与初始状态对齐。这样,关于初始状态的统计数据是从所有观察序列的第一次观察中收集的,并且通常观察向量与每个序列中最可能的状态对齐。在为训练提供所有序列之后,您只会执行最大化步骤(和未来的迭代) 。在下一次迭代中,你会做完全相同的事情。
通过将每个观察序列的开始与初始状态对齐,您可以避免连接序列的问题,在这种情况下,您会错误地对一个序列的结尾和下一个序列的开始之间的转换进行建模。并且通过在每次迭代中使用所有序列,您可以避免在每次迭代中提供不同的序列,正如响应者指出的那样,这并不能保证收敛。
Lawrence Rabiner 在IEEE 77的本教程中描述了一种数学上有充分根据的方法。该教程也是Rabiner 和 Juang所著《语音识别基础》一书的第 6 章。
RIA戴维斯等。人。在本文中提供了一些额外的建议。
我还没有彻底研究过数学,但对我来说,拉宾纳的方法听起来最有前途,而戴维斯的方法似乎缺乏数学基础。
如果您按照数学计算,添加额外的训练示例意味着重新计算您计算可能性的方式。不是对维度求和,而是对训练示例求和。
如果您一个接一个地训练一个模型,则无法保证 EM 会覆盖每个训练示例,并且您最终会得到错误的估计。
这是一篇针对卡尔曼滤波器(具有高斯概率的 HMM)执行此操作的论文,它可以让您了解如何修改代码,以便支持更多示例。
http://ntp-0.cs.ucl.ac.uk/staff/S.Prince/4C75/WellingKalmanFilter.pdf
他也有关于 HMM 的讲座,但逻辑非常简单。
这更多是对Bittenus 引用的 RIA Davis 论文的评论(上图)。我不得不同意 Bittenus 的观点,论文中提出的技术背后没有太多的数学支持——它更多的是一种经验比较。
本文仅考虑 HMM 属于受限拓扑(前馈)的情况。(在我的例子中,我有一个标准的拓扑结构,通过对使用 Baum-Welch 训练的所有模型进行非加权平均,我发现了最一致的结果。论文中提到了这种方法,但只引用了边际结果)。
RIA Davis 在一篇期刊文章中详细介绍了另一种类型的模型平均训练,它使用 Vitterbi 训练而不是 Baum-Welch比较和评估 HMM 集成训练算法,使用训练和测试以及条件数标准。然而,本文只探讨了具有相同受限前馈拓扑的 HMM。(我计划探索这种方法,并将用我的发现更新这篇文章。)