所以在机器学习方面,我是一个业余爱好者,我正在尝试对鲍姆韦尔奇算法进行编程,该算法是隐马尔可夫模型的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 的顶部有明确说明。