Próg ukrytego modelu Markowa

14

Opracowałem system sprawdzania koncepcji rozpoznawania dźwięku za pomocą modeli mfcc i ukrytych marek. Daje obiecujące wyniki, gdy testuję system na znanych dźwiękach. Chociaż system, gdy wprowadzany jest nieznany dźwięk, zwraca wynik z najbliższym dopasowaniem, a wynik nie jest tak wyraźny, aby go wymyślić, jest to dźwięk nieznany, np .:

Wytrenowałem 3 ukryte modele Markowa: jeden do mowy, jeden do wody wydobywającej się z kranu i jeden do pukania na biurko. Następnie testuję je na niewidzialnych danych i otrzymuję następujące wyniki:

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.

Wiem, że w wykrywaniu słów kluczowych dźwięk OOV (poza słownictwem) można odfiltrować za pomocą modelu śmieci lub wypełniacza, ale mówi on, że jest trenowany przy użyciu skończonego zestawu nieznanych słów, których nie można zastosować do mojego systemu, gdy don nie znam wszystkich dźwięków, które system może nagrać.

Jak podobny problem rozwiązuje się w systemie rozpoznawania mowy? Jak mogę rozwiązać problem, aby uniknąć fałszywych trafień?

Radek
źródło

Odpowiedzi:

5

Bardzo dobre pytanie!

Jak wspomniałeś, jedynym sposobem, aby HMM dał ci odpowiedź „nie wiem” (nazwijmy to OOV), jest nadanie mu specjalnego stanu, ponieważ zawsze generuje stany o najwyższym prawdopodobieństwie w twoim modelu. Musisz więc upewnić się, że OOV ma większe prawdopodobieństwo przy każdym wkładzie, który nie jest speech, watertaplub knocking.

Krótka odpowiedź brzmi: nie jest to możliwe. Ponieważ HMM nie jest absolutnym rozpoznawaczem wzorców. Porównuje jedynie prawdopodobieństwo wyników w twoim modelu iw kontekście został przeszkolony .

Pomyśl o wejście, które byłyby speechi knockingw tym samym czasie. Najprawdopodobniej HMM „zawaha się” między tymi dwoma stanami, ponieważ dane wejściowe mają cechy każdego z nich. W końcu wyprowadziłby jeden z nich, ale jest mało prawdopodobne, aby wyprowadził OOV. W przypadku rozpoznawania słów kluczowych sądzę, że można znaleźć sprytne dane wejściowe, które konsekwentnie oszukiwałyby ich HMM. Jednak autorzy prawdopodobnie wiedzą, czego się spodziewać, i wybrali skończoną listę nieznanych słów, aby te trujące dane były rzadkie.

Radzę, abyś zrobił to samo. Pomyśl o sytuacjach, w których będziesz używać HMM i wytrenuj stan OOV na najczęstszych wejściach, które chcesz wyeliminować. Możesz nawet pomyśleć o kilku stanach OOV.

gui11aume
źródło
2
Ale co powiesz na opisany tutaj model progowy do rozpoznawania gestów oparty na hmm: herin.kaist.ac.kr/Publication/PS/hklee_PAMI_i09611.pdf . Tworzą model progowy, który jest ergodycznym hmm, który łączy stany każdego hmm. „Model progowy działa jak linia bazowa. Gest kandydujący zostaje znaleziony, gdy konkretny model gestu podnosi się powyżej progu”. Mój problem polega na tym, że korzystam z biblioteki Java i Jahmm i nie sądzę, że ma opcję ergodic hmm
Radek
Jak napisano w tytule, jest to algorytm oparty na HMM, więc nie jest to HMM. Wydaje mi się, że czysty HMM nie pasuje do twoich potrzeb i że klasyfikator oparty na progach jest rzeczywiście bardziej odpowiedni.
gui11aume
5

Jest to dość powszechne w dziedzinie rozpoznawania gestów. Odpowiedzią jest stworzenie modelu progowego, jak opisano w artykule Lee i Kima (1999)

Odgrywa tę samą rolę, co model wypełniacza lub śmieci, ale nie trzeba go szkolić osobno, jak mówisz. Możesz stworzyć model progowy, łącząc wszystkie stany samostanowienia z innych modeli i inicjując przejście z jednakowymi prawdopodobieństwami, w pełni łącząc te stany. Proszę spojrzeć na papier, aby zobaczyć, jak można to faktycznie zrobić.

Nawet jeśli twoja biblioteka nie obsługuje modeli ergodycznych, nie powinno to uniemożliwiać ci ręcznego tworzenia modelu o wymaganym rozmiarze i odpowiedniego ustawiania stanów. Jeśli naprawdę potrzebujesz biblioteki do tego celu, implementacje ukrytych klasyfikatorów modeli Markowa, w tym obsługa modeli progowych, są dostępne na przykład w Accord.NET Framework .

Oświadczenie: Jestem autorem tej biblioteki.

Cesar
źródło
Po prawej mogę ręcznie utworzyć model progowy. Powiedzmy na przykład, że mam dwa modele hmm o nazwie: sound1 i sound2. Oba mają 2 stany. Następnie tworzę model progowy z 4 stanami. Każdy stan ma tę samą wartość początkową, która wynosi 0,25. Następnie ustawiam rozkład równomierny dla wszystkich możliwych przejść, więc wszystkie możliwe przejścia stanu (0,0), (0,1), (1,0), (1,1), (1,2), (2,1), (2,2) itd. Uzyskają równomierny rozkład 0,0625. Następnie dla stanu 1 i 2 modelu progowego ustawiam opdf stanu 1 i 2 z dźwięku 1, a dla stanu 3 i 4 progu ustawiam opdf stanu 1 i 2 z dźwięku 2.
Radek
Czy powyższe podejście jest prawidłowe?
Radek
1
Niezupełnie ... być może byłem trochę luźny w swoim opisie. Elementy diagonalne macierzy przejścia dla modelu progowego otrzymują oryginalne prawdopodobieństwa przejścia z innych modeli. Przejścia ze stanu do innych stanów są inicjowane z jednakowymi prawdopodobieństwami. Wiem, że zwrócenie uwagi na kod może wydawać się leniwe, ale czasami kod jest łatwiejszy do zrozumienia niż formuły .
Cesar
Nawiasem mówiąc, jeśli przeczytałeś artykuł Lee i Kima i zinterpretowałeś go inaczej lub uważasz, że moja implementacja jest nieprawidłowa, daj mi znać.
Cesar
3

Tak więc zrobiłem: stworzyłem moją uproszczoną wersję modelu wypełniacza. Każdy hmm reprezentujący dźwięk uderzenia, dźwięk stukania i dźwięk mowy to osobny 6-stanowy hmm trenowany przez dźwięki z zestawu treningowego odpowiednio 30, 50, 90 dźwięków o różnych długościach od 0,3 sekundy do 10 sekund. Następnie stworzyłem model wypełniacza, który jest stanem 1mm hmm, składającym się ze wszystkich dźwięków zestawu treningowego do pukania, uderzenia wody i mowy. Jeśli więc wynik modelu hmm jest większy dla danego dźwięku niż wynik wypełniacza - dźwięk jest rozpoznawany, w przeciwnym razie jest to dźwięk nieznany. Tak naprawdę nie mam dużych danych, ale przeprowadziłem następujący test pod kątem fałszywego odrzucenia pozytywnego i prawdziwego odrzucenia niewidocznych dźwięków.

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

Na podstawie tego szybkiego testu mogę stwierdzić, że takie podejście daje rozsądne wyniki, chociaż mam dziwne wrażenie, że może nie wystarczyć.

Radek
źródło
+1 To jest bardzo interesujące. Jeśli jeszcze nie zapomniałeś o tej pracy, czy to podejście w końcu zadziałało? Czy to wystarczyło jako model „wypełniacz / inny”? Jeśli nie, czy w końcu wdrożyłeś coś jeszcze?
Zhubarb