Limiar oculto do modelo Markov

14

Desenvolvi um sistema de prova de conceito para reconhecimento de som usando modelos mfcc e markov oculto. Dá resultados promissores quando testo o sistema em sons conhecidos. Embora o sistema, quando um som desconhecido seja inserido, retorne o resultado com a correspondência mais próxima e a pontuação não seja tão distinta para conceber, é um som desconhecido, por exemplo:

Treinei três modelos de markov ocultos, um para fala, um para água saindo da torneira e outro para bater na mesa. Depois, testo-os em dados invisíveis e obtenho os seguintes resultados:

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.

Eu sei que na detecção de palavras-chave um som OOV (fora do vocabulário) pode ser filtrado usando um modelo de lixo ou preenchimento, mas ele diz que é treinado usando um conjunto finito de palavras desconhecidas, onde isso não pode ser aplicado ao meu sistema, como eu conhece todos os sons que o sistema pode gravar.

Como é resolvido um problema semelhante no sistema de reconhecimento de fala? E como posso resolver meu problema para evitar falsos positivos?

Radek
fonte

Respostas:

5

Muito boa pergunta!

Como você mencionou, a única maneira de obter o HMM para lhe dar uma resposta "não sei" (vamos chamá-lo de OOV) é dar a ele um estado especial, porque sempre gera os estados com a maior probabilidade no seu modelo. Então você tem que garantir que OOV tem maior probabilidade em cada entrada que não é speech, watertapou knocking.

A resposta curta é que isso não é possível. Porque um HMM não é um reconhecedor de padrão absoluto. Ele apenas compara a probabilidade dos resultados no seu modelo e no contexto em que foi treinado .

Pense em uma entrada que seria speeche knockingao mesmo tempo. Muito provavelmente, o HMM "hesitará" entre esses dois estados, porque essa entrada possui características de cada um. No final, ele produziria um desses, mas é pouco provável que produzisse OOV. No caso da identificação de palavras-chave, meu palpite é que você poderia encontrar entradas inteligentes que enganariam consistentemente o HMM. No entanto, os autores provavelmente sabem que contribuições esperar e escolheram sua lista finita de palavras desconhecidas para que essas informações venenosas sejam incomuns.

Eu aconselho que você faça o mesmo. Pense nas situações em que você usará o HMM e treine um estado OOV nas entradas mais comuns que deseja eliminar. Você pode até pensar em ter vários estados OOV.

gui11aume
fonte
2
Mas que tal um modelo de limite baseado em hmm para reconhecimento de gestos descrito aqui: herin.kaist.ac.kr/Publication/PS/hklee_PAMI_i09611.pdf . Eles criam um modelo de limiar que é um hmm ergódico que possui estados de cada hmm combinados. "O modelo de limite atua como uma linha de base. Um gesto candidato é encontrado quando um modelo de gesto específico ultrapassa o limite" Mas meu problema é que estou usando a biblioteca java e jahmm e não acho que tenha a opção ergódica Hmm.
Radek
Como diz o título, este é um algoritmo baseado no HMM, portanto não é um HMM. Parece-me que um HMM puro não atende às suas necessidades e que um classificador baseado em limites é realmente mais adequado.
gui11aume
5

Isso é algo comum no campo do reconhecimento de gestos. A resposta é criar um modelo de limiar, conforme descrito no artigo de Lee e Kim (1999)

Ele desempenha o mesmo papel que um modelo de enchimento ou lixo, mas não precisa ser treinado separadamente, como você diz. Você pode criar um modelo de limite conectando todos os estados de autotransição de seus outros modelos e inicializando a transição com probabilidades uniformes, conectando totalmente esses estados. Por favor, dê uma olhada no papel para ver como ele pode realmente ser feito.

Mesmo que sua biblioteca não suporte modelos ergódicos, não deve impedir que você crie manualmente um modelo do tamanho necessário e defina os estados de acordo. Se você realmente deseja uma biblioteca para isso, implementações para classificadores de modelo Markov ocultos, incluindo suporte para modelos de limite, estão disponíveis no Accord.NET Framework , por exemplo.

Disclaimer: Eu sou o autor desta biblioteca.

Cesar
fonte
Certo, posso criar manualmente um modelo de limite. Então, digamos, por exemplo, eu tenho dois modelos hmm chamados: sound1 e sound2. Ambos têm 2 estados. Então eu crio um modelo de limite com 4 estados. Cada estado tem o mesmo valor inicial que é 0,25. Em seguida, defino uma distribuição uniforme para todas as transições possíveis, para que todas as transições de estado possíveis (0,0), (0,1), (1,0), (1,1), (1,2), (2,1), (2,2), etc., obtém uma distribuição uniforme de 0,0625. Então, para os estados 1 e 2 do modelo de limite, defino o opdf do estado 1 e 2 do som1 e para os estados 3 e 4 do limiar, defino o opdf do estado 1 e 2 do som2.
Radek
A abordagem descrita acima está correta?
Radek
1
Não é bem assim ... talvez eu estivesse um pouco frouxa na minha descrição. Os elementos diagonais de sua matriz de transição para o modelo de limite recebem as probabilidades de autotransição originais de seus outros modelos. As transições de um estado para outros estados são inicializadas com probabilidades uniformes. Eu sei que pode parecer preguiçoso apontar para o código, mas às vezes o código é mais fácil de entender do que as fórmulas .
Cesar
A propósito, se você leu o artigo de Lee e Kim e o interpretou de maneira diferente ou acredita que minha implementação está incorreta, informe-me.
Cesar
3

Então, o que fiz foi: criei minha versão simplificada de um modelo de preenchimento. Cada hmm que representa som de golpe d'água, som de batida e som de fala é um hmm de 6 estados separado, treinado por sons do conjunto de treinamento de 30, 50, 90 sons, respectivamente, de vários comprimentos, de 0,3 a 10 segundos. Então eu criei um modelo de preenchimento que é um hmm de 1 estado, composto por todos os sons do conjunto de treinamento para batidas, batidas na água e fala. Portanto, se a pontuação do modelo hmm é maior para um determinado som do que a pontuação do preenchimento - o som é reconhecido, caso contrário, é um som desconhecido. Eu realmente não tenho dados grandes, mas realizei um teste a seguir para rejeição de falsos positivos e rejeição de verdadeiros positivos em sons invisíveis.

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

Portanto, a partir desse teste rápido, posso concluir que essa abordagem fornece resultados razoáveis, embora tenha uma sensação estranha de que pode não ser suficiente.

Radek
fonte
+1 Isso é muito interessante. Se você ainda não se esqueceu desse trabalho, essa abordagem funcionou no final? Foi o suficiente como modelo 'filler / other'? Caso contrário, você implementou outra coisa eventualmente?
Zhubarb 24/03