Скрытая марковская модель, порог

14

Я разработал концептуальную систему для распознавания звука с использованием моделей 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 (вне словаря) может быть отфильтрован с использованием модели мусора или наполнителя, но он говорит, что он обучается с использованием конечного набора неизвестных слов, где это не может быть применено к моей системе, как я делаю Не знаю всех звуков, которые система может записать.

Как подобная проблема решается в системе распознавания речи? И как я могу решить мою проблему, чтобы избежать ложных срабатываний?

Радек
источник

Ответы:

5

Очень хороший вопрос!

Как вы упоминаете, единственный способ заставить HMM дать вам ответ «Я не знаю» (назовем это OOV) - это дать ему особое состояние, потому что он всегда выводит состояния с наибольшей вероятностью в вашей модели. Таким образом, вы должны убедиться, что OOV имеет более высокую вероятность при каждом входе, который не является speech, watertapили knocking.

Короткий ответ: это невозможно. Потому что HMM не является абсолютным распознавателем образов. Это только сравнивает вероятность результатов по вашей модели, и в контексте, который он был обучен .

Подумайте о входе, который был бы speechи knockingв то же время. Скорее всего, HMM будет «колебаться» между этими двумя состояниями, потому что этот вход имеет особенности каждого. В конце он выдаст один из них, но маловероятно, что он выведет OOV. В случае определения ключевых слов, я предполагаю, что вы могли бы найти умные входные данные, которые бы постоянно обманывали их HMM. Тем не менее, авторы, вероятно, знают, какой вклад следует ожидать, и они выбрали свой конечный список неизвестных слов, так что эти ядовитые вводные данные являются редкостью.

Я советую вам сделать то же самое. Подумайте о ситуациях, когда вы будете использовать HMM, и обучите состояние OOV наиболее распространенным данным, которые вы хотите устранить. Вы можете даже думать о наличии нескольких состояний OOV.

gui11aume
источник
2
Но как насчет пороговой модели на основе hmm для распознавания жестов, описанной здесь: herin.kaist.ac.kr/Publication/PS/hklee_PAMI_i09611.pdf . Они создают пороговую модель, которая представляет собой эргодический хммм, в котором состояния каждого хммм объединены вместе. «Модель порога действует как базовая линия. Жест-кандидат обнаруживается, когда конкретная модель жеста поднимается выше порога». Но моя проблема в том, что я использую библиотеку java и jahmm, и я не думаю, что в ней есть опция для эргодики. хмм.
Радек
Как сказано в заголовке, это алгоритм на основе HMM, поэтому это не HMM. Мне кажется, что чистый HMM не соответствует вашим потребностям, и что пороговый классификатор действительно лучше подходит.
gui11aume
5

Это несколько распространено в области распознавания жестов. Ответ заключается в создании пороговой модели, как описано в статье Ли и Кима (1999).

Он играет ту же роль, что и модель наполнителя или мусора, но не требует отдельного обучения, как вы говорите. Вы можете создать пороговую модель, соединив все состояния самоперехода из других ваших моделей и инициализировав переход с одинаковыми вероятностями, полностью связав эти состояния. Пожалуйста, посмотрите на бумагу, чтобы увидеть, как это можно сделать на самом деле.

Даже если ваша библиотека не поддерживает эргодические модели, это не должно помешать вам вручную создать модель требуемого размера и соответственно установить состояния. Если вам действительно нужна библиотека для этого, то , например, в Accord.NET Framework доступны реализации для скрытых классификаторов моделей Маркова, включая поддержку пороговых моделей .

Отказ от ответственности: я являюсь автором этой библиотеки.

Cesar
источник
Право, я могу вручную создать пороговую модель. Так скажем, например, у меня есть две названные модели hmm: sound1 и sound2. Оба имеют 2 состояния. Затем я создаю пороговую модель с 4 состояниями. Каждое состояние имеет одинаковое начальное значение, равное 0,25. Затем я устанавливаю равномерное распределение для всех возможных переходов, чтобы все возможные переходы состояний (0,0), (0,1), (1,0), (1,1), (1,2), (2,1), (2,2) и т. Д. Получают равномерное распределение 0,0625. Затем для состояний 1 и 2 пороговой модели я устанавливаю opdf состояния 1 и 2 из sound1, а для состояний 3 и 4 порога я устанавливаю opdf состояния 1 и 2 из sound2.
Радек
Является ли описанный выше подход правильным?
Радек
1
Не совсем ... возможно, я был немного не в своем описании. Диагональные элементы вашей матрицы перехода для пороговой модели получают исходные вероятности самоперехода от других ваших моделей. Переходы из состояния в другие состояния инициализируются с равномерными вероятностями. Я знаю, что может показаться ленивым указывать на код, но иногда код легче понять, чем формулы .
Цезарь
Кстати, если вы прочитали статью Ли и Кима и по-разному ее интерпретировали или считаете, что моя реализация неверна, пожалуйста, дайте мне знать.
Цезарь
3

Итак, я сделал: я создал свою упрощенную версию модели наполнителя. Каждый hmm, представляющий звук водяного удара, стучащий звук и речевой звук, представляет собой отдельный 6-миллиметровый hmm, обучаемый звуками из обучающего набора из 30, 50, 90 звуков соответственно различной длительности от 0,3 секунды до 10 секунд. Затем я создал модель наполнителя, состоящую из 1 состояния, хм, состоящую из всех звуков обучающего набора для стука, воды и речи. Так что, если оценка по модели хмм больше для данного звука, чем оценка наполнителя - звук распознается, иначе это неизвестный звук. У меня нет больших данных, но я провел следующий тест на отклонение ложных срабатываний и отклонение истинных положительных результатов на невидимых звуках.

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

Итак, из этого быстрого теста я могу сделать вывод, что этот подход дает разумные результаты, хотя у меня есть странное ощущение, что этого может быть недостаточно.

Радек
источник
+1 Это очень интересно. Если вы еще не забыли об этой работе, сработал ли этот подход в конце? Было ли этого достаточно в качестве модели «наполнитель / другое»? Если нет, то реализовали ли вы что-то еще?
Жубарб