2

我已经按照 Rabiner 教程针对单个观察序列(基于 MFCC 数据)实现了 HMM 的评估和训练算法。对于前向和后向算法,我还包括了处理下溢问题的建议缩放。对于 Baum-Welch 优化,我相应地计算概率为

log(P) = -sum(log(scaling coefficients))

Baum-Welch 优化似乎在几次迭代中都能正常工作,直到我在计算密度时遇到下溢。我使用 Matlab 内置函数mvnpdf来计算密度。经过几次迭代后,Matlab 开始将最低密度设置为 0。对于 Baum-Welch 优化中的以下计算,Emission/PDF-Matrix 中的零条目产生 NaN,进一步优化失败。

对于如何规避或避免此问题的任何帮助,我将不胜感激。

4

1 回答 1

0

老问题哈哈。但我今天也有同样的。也许其他人也会。

我想我设法在我的实施中解决了这个问题。我首先检查在 M 步骤之后计算的方差是否会导致下溢,然后将这些方差重新分配给不会导致下溢的最小可能方差。例如,我发现对于 python 的 scipy.stats multivariate_normal.pdf 实现,任何超过平均值约 37.77 标准偏差的数据都会导致下溢。因此,在 M 步骤之后,我正在按照以下方式做一些事情:

observation_min, observation_max = (max(observations), min(observations))
aprx_max_std_dev = 37.7733
N = Number of latent states
M = Count of gaussians in mixture model
mu = means (shape: NxM)
U = variances (shape: NXM)
for n in range(N):
    for m in range(M):
        dist_to_min = mu[n,m] - observation_min
        dist_to_max = observation_max - mu[n,m]
        max_dist_from_mean = max(dist_to_min,dist_to_max)
        smallest_good_variance = square(max_dist_from_mean / aprx_max_std_dev) 
        if smallest_good_variances > U[n,m]
            U[n,m] = smallest_good_variance

另外,我遇​​到了比例系数有时太小的问题。因此,接下来,如果比例系数变得小于某个小值(我使用的是 <0.001),从逻辑上讲,正态分布似乎并不重要或对整个混合模型贡献很大。所以我基本上重新分配系数尺度,使它们都有合理的值加起来为 1。因此,例如,如果我有一个 M=3 并且我的系数是 (0.7998, 0.2, 0.0008),我会从最大的一个中窃取一些比例并重新分配到 (0.4, 0.2, 0.4)。

最后,要尝试防止它在 EM 的进一步迭代后回到相同的位置。我在observation_min 和observation_max 之间随机选择一个新的均值,作为具有非常小的尺度的均值。

于 2021-12-10T02:06:12.767 回答