【问题标题】:Training of continuous densitiy HMMs with underflow in calculating densities在计算密度时训练具有下溢的连续密度 HMM
【发布时间】:2018-01-07 06:14:23
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: algorithm matlab probability-density underflow gmm


    【解决方案1】:

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

    我想我设法在我的实施中解决了这个问题。我首先检查在 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
    

    另外,我遇​​到了比例系数有时太小的问题。因此,接下来,如果比例系数变得小于某个小值(我使用的是

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

    【讨论】:

      猜你喜欢
      • 2011-04-22
      • 2018-09-27
      • 1970-01-01
      • 2020-04-10
      • 2021-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多