隐马尔可夫模型阈值

机器算法验证 机器学习 隐马尔可夫模型 模式识别
2022-03-22 20:45:24

我开发了一个使用 mfcc 和隐藏马尔可夫模型进行声音识别的概念验证系统。当我在已知声音上测试系统时,它给出了有希望的结果。尽管系统在输入未知声音时返回最接近匹配的结果,并且得分不是那么明显,但它是未知声音,例如:

我已经训练了 3 个隐藏马尔可夫模型,一个用于语音,一个用于从水龙头流出的水,一个用于敲桌子。然后我在看不见的数据上测试它们并得到以下结果:

input: speech
HMM\knocking:  -1213.8911146444477
HMM\speech:  -617.8735676792728
HMM\watertap:  -1504.4735097322673

So highest score speech which is correct

input: watertap
HMM\knocking:  -3715.7246152783955
HMM\speech:  -4302.67960438553
HMM\watertap:  -1965.6149147201534

So highest score watertap which is correct

input: knocking
HMM\filler  -806.7248912250212
HMM\knocking:  -756.4428782636676
HMM\speech:  -1201.686687761133
HMM\watertap:  -3025.181144273698

So highest score knocking which is correct

input: unknown
HMM\knocking:  -4369.1702184688975
HMM\speech:  -5090.37122832872
HMM\watertap:  -7717.501505674925
Here the input is an unknown sound but it still returns the closest match as there is no system for thresholding/garbage filtering.

我知道在关键字发现中,可以使用垃圾或填充模型过滤掉 OOV(词汇表外)声音,但它说它是使用一组有限的未知单词进行训练的,而这不能像我一样应用于我的系统不知道系统可能记录的所有声音。

语音识别系统中的类似问题如何解决?以及如何解决我的问题以避免误报?

3个回答

这在手势识别领域有些常见。答案是创建一个阈值模型,如Lee 和 Kim (1999)的论文中所述

它与填充或垃圾模型的作用相同,但不需要像你说的那样单独训练。您可以通过连接来自其他模型的所有自转换状态并使用统一概率初始化转换来创建阈值模型,从而完全连接这些状态。请看一下论文,看看它实际上是如何完成的。

即使您的库不支持遍历模型,它也不应该阻止您手动创建所需大小的模型并相应地设置状态。如果你真的想要一个库,那么隐藏马尔可夫模型分类器的实现,包括对阈值模型的支持,例如Accord.NET Framework中可用。

免责声明:我是这个库的作者。

非常好的问题!

正如你所提到的,让 HMM 给你一个“我不知道”(我们称之为 OOV)答案的唯一方法是给它一个特殊的状态,因为它总是输出在你的模型下具有最高可能性的状态。因此,您必须确保 OOV 在每个不是 或 的输入speech下都有更高watertap的可能性knocking

简短的回答是这是不可能的。因为HMM 不是绝对的模式识别器。它仅比较您的模型下输出的可能性,并且在它被训练的上下文中

考虑一个speech同时是的输入knockingHMM 很可能会在这两种状态之间“犹豫”,因为该输入具有每种状态的特征。最后它会输出其中一个,但它不太可能输出OOV。在关键字发现的情况下,我的猜测是你可以找到可以始终欺骗他们的 HMM 的聪明输入。然而,作者可能知道预期的输入,并且他们选择了有限的未知单词列表,因此这些有毒输入并不常见。

我建议你也这样做。考虑一下您将使用 HMM 并在您希望消除的最常见输入上训练 OOV 状态的情况。您甚至可以考虑拥有多个 OOV 状态。

所以我所做的是:我创建了填充模型的简化版本。每个代表水龙头声音、敲击声音和语音声音的 hmm 是一个单独的 6 状态 hmm,由来自 30、50、90 个不同长度的 30、50、90 个声音的训练集的声音训练,分别为 0.3 秒到 10 秒。然后我创建了一个填充模型,它是一个状态为 1 的 hmm,包含所有用于敲击、敲击和语音的训练集声音。因此,如果给定声音的 hmm 模型分数大于填充物的分数 - 声音会被识别,否则它是未知声音。我并没有真正的大数据,但我已经对看不见的声音进行了假阳性拒绝和真阳性拒绝的以下测试。

true positives rejection
knocking 1/11 = 90% accuracy
watertap 1/9 = 89% accuracy
speech 0/14 = 100% accuracy


false positives rejection
Tested 7 unknown sounds
6/7 = 86% accuracy

所以从这个快速测试中我可以得出结论,这种方法给出了合理的结果,尽管我有一种奇怪的感觉,它可能还不够。