python - Baum Welch(EM 算法)似然 (P(X)) 不是单调收敛的

标签 python algorithm machine-learning nlp expectation-maximization

所以我在机器学习方面有点业余,我正在尝试编写 Baum Welch 算法,它是隐马尔可夫模型的 EM 算法的派生。在我的程序中,我正在使用新模型中每个观察序列的概率来测试收敛性,然后在新模型小于或等于旧模型时终止。然而,当我运行该算法时,它似乎有点收敛并给出了比随机好得多的结果,但当收敛时它在最后一次迭代中下降。这是错误的迹象还是我做错了什么?

在我看来,我应该一直使用每个观察概率对数的总和来进行比较,因为它看起来像是我正在最大化的函数。但是,我读过的论文说要使用观察值 (https://www.cs.utah.edu/~piyush/teaching/EM_algorithm.pdf) 的概率总和的对数(我很确定它与概率总和相同)。

我在另一个项目中解决了这个问题,在该项目中,我通过实现一个带有预设轮数的 for 循环而不是一个条件为新迭代严格大于但我的 while 循环来实现前馈神经网络的反向传播我想知道这是否是一种不好的做法。

我的代码在 https://github.com/icantrell/Natural-Language-Processing 在 nlp.py 文件中。

如有任何建议,我们将不胜感激。 谢谢。

最佳答案

对于 EM 迭代,或任何其他被证明是非递减的迭代,您应该看到增加,直到增加的大小与浮点误差相比变小,此时浮点误差违反了证明中的假设,并且您可能不仅会看到增加失败,还会看到非常小的减少 - 但这应该只是非常小的。

检查这些基于概率的计算的一个好方法是创建一个小的测试问题,其中正确的答案非常明显 - 非常明显,您可以看到被测代码的答案是否明显正确。

可能值得将您引用的论文与 https://en.wikipedia.org/wiki/Expectation%E2%80%93maximization_algorithm#Proof_of_correctness 进行比较.我认为像(11)和(12)这样的方程不是为了让你实际计算,而是作为论据来激励和证明最终结果。我认为与您计算的传统 EM 步骤对应的方程是方程 (15),它表示您在每一步更改参数以增加预期的对数似然,这是计算的隐藏状态分布下的期望根据旧参数,这是标准的 EM 步骤。其实翻过来我看到P 8 上面有明确说明这一点。

关于python - Baum Welch(EM 算法)似然 (P(X)) 不是单调收敛的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48311021/

相关文章:

python - 如何在 python matplotlib 中添加第三级刻度

python - 如何在python中制作日志日志直方图

c# - 一组不同的子集

python - 为什么使用 matplotlib 无法正确显示 CIFAR-10 图像?

matlab - 如何在 MATLAB 中预测和扩展作为一维向量获取的数据?

python - 如何添加声音并仅听1次,而不是反复听。 ( python )

python - Pandas 、Python : Pass names of dataframes to function in a loop

c++ - 尽管有很强的依赖类,但设计灵活

algorithm - 找到任何算法难题的时间复杂度的严格下限?

machine-learning - 机器学习中的训练步骤时间是多少?