繁体   English   中英

Baum Welch 算法中的 Gamma 和浮点精度

[英]Gamma in the Baum Welch algorithm and float precision

我目前正在尝试用 C 实现 Baum Welch 算法,但我遇到了以下问题:伽马函数:

gamma(i,t) = alpha(i,t) * beta(i,t) / sum over `i` of(alpha(i,t) * beta(i,t))

不幸的是,对于足够大的观察集,随着t增加,alpha 迅速下降到 0,随着t减少,beta 迅速下降到 0,这意味着,由于四舍五入,永远不会有 alpha 和 beta 都非零的地方,这使事情变得相当有问题。

有没有办法解决这个问题,还是我应该尝试提高值的精度? 我担心如果我尝试这种方法,问题可能会再次出现,因为每次观察的 alpha 和 beta 下降大约一个数量级。

您应该在对数空间中进行以下计算,并且通常应进行概率模型的所有计算:

lg_gamma(i, t) = (lg_alpha(i, t) + lg_beta(i, t)
                  - logsumexp over i of (lg_alpha(i, t) + lg_beta(i, t)))

其中lg_gamma(i, t)表示gamma(i, t)等的对数, logsumexp此处描述的函数 在计算结束时,可以根据需要使用exp转换为概率(通常只需要显示概率,但是甚至最好有日志)。

对数的底数并不重要,只要您在各处使用相同的底数即可。 我更喜欢自然对数,因为log相比,节省了打字log2 :)

我认为您应该对使alphabeta显着小于1的每个观察结果执行缩放程序。 它将系数乘以alphabeta ,使其保持可比范围。
您应该将系数乘以c使每个alpha变量保持在可比较的范围内,该c的形式应为:

c(t) = 1 / sum(alpha(t,i)) , i=1... number of states , t=time step ( observation)

请注意,在每个时间步长上,您都将计算c(t)乘以该时间步长上所有状态的所有alpha 接下来对beta执行相同的步骤。

关于HMM的很好的教程可以很好地解释此过程: 有关隐藏的markov模型和语音识别中所选应用程序的教程(rabiner 1989)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM