Önálló laboratórium beszámoló BME-TMIT Készítette: Varga Ádám Csaba, KHLU9W Konzulens: Dr. Mihajlik Péter Tanév: 2013-14 tavaszi félév Téma címe: Mély neuronhálók alkalmazása a beszédfelismerésben Feladatkiírás: Mára bebizonyosodott, hogy az ún. deep belief networks, azaz a speciális, több szintből álló mesterséges neurális hálózatok a különféle biológiai mintaillesztési feladatokban kiválóan teljesítenek, a hagyományos technikákat lényegesen felülmúlóan. A feladat ezen technológia alkalmazása valós beszédfelismerési feladatokban. A mesterséges beszédfelismerés legnagyobb kihívása a komplex akusztikai jelekből azonosítani a beszédhangokat. Jelenleg az említett technológia jelenti a legkecsegtetőbb megoldást a beszéd akusztiai modellezésére, ennek megismerése, alkalmazása a feladat.
Önálló laboratórium beszámoló 1. A laboratóriumi munka környezetének ismertetése A félév során beszédfelismerő rendszerek mintaillesztési módszereinek hatékonyságát tanulmányoztam, valamint a felismerési pontosság javítási lehetőségeit vizsgáltam. A beszédfelismerők hibaarányát különböző technikákkal kíséreltem meg csökkenteni. Az önálló laboratórium keretében főként az ún. mély neuronhálókkal történő mintaillesztési feladatok eredményeire kocentráltam, hiszen ez a megközelítés a hagyományos megoldásoknál lényegesen jobb eredményeket produkál. A klasszikus statisztikai módszerek felismerési pontosságával való összehasonlítás után a neuronhálók különböző paramétereinek hangolásával próbáltam a hatékonyságot növelni, valamint a hibaarány további csökkentése érdekében a neuronhálók és hagyományos módszerek ötvözésével nyert hibrid módszerek teljesítményét is megvizsgáltam. 1.1. Elméleti összefoglaló 1.1.1. Lényegkiemelés és mintaillesztés Az alábbiakban röviden ismertetem a beszédfelismerő rendszerek működésének alapvető összetevőit, módszereit, különös tekintettel a neurális hálókkal történő mintaillesztési feladatra, mivel ez a félév során elvégzett munka gerincét jelenti, és a működés hátterének áttekintése szükséges az eredmények értelmezéséhez. Az összefoglaló főként Fegyó Tibor és Mihajlik Péter Gépi beszédfelismerés című oktatási segédanyagára[1] valamint Mihajlik Péter Spontán magyar nyelvű beszéd gépi felismerése nyelvspecifikus szabályok nélkül[7] című doktori disszertációjára épít. Egy beszédfelismerő rendszer két alapvető lépcsőből épül fel: a lényegkiemelő fokozatból és a statisztikai mintaillesztést végző egységből. A lényegkiemelés első lépése a spektrális analízis. Ennek során a bemenetre érkező digitális jelből előbb egymással átlapolódó rövid (10-30ms) ablakokat képzünk, és ezen ablakok tartalmát a diszkrét Fourier-transzformációt megvalósító FFT (Fast Fourier Transform) algoritmussal a frekvenciatartományba transzformáljuk. A Fourier-transzformációt további transzformációs lépések követhetik. Esetünkben az ún. mel-kepsztrum előállítása a következő lépés. Ennek során a spektrum négyzetét (a teljesítményspektrumot) az emberi halláshoz igazodó mel-skálára képezzük le, majd a melfrekvenciáknál a teljesítmények logaritmusát vesszük. Az így kapott értékeken az időtartományba való visszatérés és a dimenziószám csökkentése érdekében diszkrét koszinusz-transzformációt végzünk. A lényegkiemelés lépéseit az 1. ábra foglalja össze. A beszélők és a beszédmódok (lassabb, gyorsabb, halkabb, hangosabb, stb.) eltéréseinek 2
1.1 Elméleti összefoglaló Önálló laboratórium beszámoló 1. ábra. A lényegkiemelés lépései F F T () 2 mel() log() DCT kompenzálása érdekében a mintákon normálást végzünk. Ez esetünkben a kepsztrumátlagok és a varianca normalizásával történik.[8] Az így előállított, transzformált és normált értékeket tartalmazó vektorok lesznek az adott beszédszegmentum jellemzővektorai, amelyek tartalmazzák a beszédre jellemző és a felismerési feladathoz használandó értékeket. Ezeket kiegészíthetjük a felismerési pontosságot javító további paraméterekkel, amelyeket a vektorok végére fűzünk. Ilyen lehet például a paraméterek időbeli változásának ( ) és a változás változásának ( ) mértéke. A tulajdonságvektorok előállítása után következő feladat a mintaillesztés, azaz a feldolgozott akusztikus jelekből képzett jellemzővektorok leképezése nyelvi egységekre (fonémák, szavak). Ez jelenti tehát a beszéd tulajdonképpeni felismerését. Az alábbiakban az általam az önálló laboratóriumi munka során vizsgált mintaillesztési módszerek alapjait mutatom be röviden, kitérve először a hagyományos statisztikai eljárásokra, majd a neurális hálókkal történő felismerés módszereire. A mintaillesztés során a cél mindig a bejövő vektorsorozathoz legjobban illeszkedő fonémavagy szósorozat megkeresése. Ezt célszerűen valószínűségi modellek használatával végezzük, majd a lehetséges illesztések közül megkeressük a legjobban illeszkedőt ez a dekódolás folyamata.[7] Az illesztést végző probabilisztikus modellek két szintre bonthatók: a nyelvi és az akusztikus modellre. A nyelvi modell egy adott szósorozat előfordulási valószínűségének meghatározására szolgál. A legyegyszerűbb és legszélesebb körben használt megoldást az ún. N-gram modell ek jelentik, amelyek N db szó együttes előfordulási valószínűségét adják meg egy korpuszban mérhető közös és izolált előfordulások alapján. A tesztekhez én bigram modellt (azaz N = 2) használtam, amely két szóból álló párok előfordulási valószínűségeit használja: P (w 2 w 1 ) = c(w 2, w 1 ), c(w 1 ) ahol P (w 2 w 1 ) a w 2 szó előfordulási valószínűsége, feltéve hogy előtte w 1 állt, c(w 2, w 1 ) a két szó együttes, c(w 1 ) pedig az első szó izolált előfordulásainak száma. Az akusztikus modell célja, hogy egy adott, a fenti lényegkiemeléssel jellemzővektorsorozathoz a legmegfelelőbb szósorozatot rendelje. Ennek megvalósítása további lépcsőkre 3
1.1 Elméleti összefoglaló Önálló laboratórium beszámoló bontható: a teljes akusztikus modell a fonológiai és a fonéma szintű modellekből építhető fel. Az előbbi egy adott szósorozathoz tartozó fonémasorozat valószínűségét foglalja magában, míg az utóbbi egy adott fonémasorozathoz rendelhető akusztikai jellemzővektor-sorozat valószínűségét méri. A cél a legjobb illeszkedés keresése, ez végezhető a Viterbi-algoritmussal[1]. Az ilyen módon approximált szósorozat ezzel a módszerrel formálisan a következőképpen modellezhető: Ŵ = arg max P (W )P (Φ W )P (O Φ), W ahol Ŵ a felismert szósorozat, W a modellezett szósorozat, Φ az ehhez tartozó lehetséges fonémasorozat, valamint O a Φ-hez tartozó lehetséges jellemzővektor-sorozat. A fonológiai modell felépítése egy kiejtési szótár alapján történik, ahol az adott szavakhoz, szósorzatokhoz valószínűségi alapon hozzárendeljük a hozzájuk tartozó fonémasorozatokat. A fonéma-modell során az adott fonémasorozathoz legjobban illeszkedő jellemzővektrosorozat keresése a cél. Ennek a feladatnak a megoldása esetünkben (és általában a beszédfelismerő alkalmazásokban) ún. rejtett Markov-modellekkel[2] történik. Egy egy fonémát három állapottal modellező (kezdet, közép, vég) rejtett Markov-modellt látahatunk a 2. ábrán. Az egyes állapotok és a köztük lévő átmeneti valószínűségek (p ij ) alapján következtethetünk a vektorsorzat adott fonémasorozathot tartozó valószínűségére. Az egyes állapotokhoz tartozó valószínűségeket a gyakorlatban Gauss-függvények lineáris kombinációjából állíthatjuk elő ez azért hatékony megoldás, mert az átlagértékek és kovariancia-mátrixok tárolása elegendő ezek meghatározásához. Egy fonémasorozathoz tartozó modellt az egyes fonémákhoz tartozó modellek konkatenációjával kaphatunk meg. 2. ábra. Példa egy rejtett Markov-modellre p 01 p 12 start start eleje közepe vége stop p 23 p 34 p 11 p 22 p 33 A fonéma-modellben alkalmazhatunk környzetfüggetlen (monofón) beszédhangmodelleket: ebben az esetben egy-egy beszédhangot csak önálló, izolált formájában modellezünk. Az elvégzett kísérletek során azonban egyértelműen látható volt, hogy a jobb eredmények érdekében a modellezés során a környezetet is érdemes figyelembe venni, hiszen egy-egy beszédhangra jelentős hatása van az azt megelőző illetve követő hangnak (hangoknak). Így 4
1.1 Elméleti összefoglaló Önálló laboratórium beszámoló többnyire trifón modell alkalmazása az elterjedt, ahol hanghármasokkal dolgozunk az adott beszédhangot a saját maga és az őt megelőző illetve követő hangok által alkotott hármassal modellezzük. A beszédfelismerő-rendszerben az ismertetett modellek (a nyelvi és az akusztikus modell, illetve ennek részei) egybevonhatók egy olyan közös felismerési gráfba, ami magában foglalja az összes modellezési lépcsőt. Az általam használt rendszer is ezt a megoldást alkalmazza, ugyanis ilyenkor a legjobban illeszkedő minta megkeresése egy optimális útkeresési feladatra vezethető vissza a kezdőpont (bemeneti jellemzővektor-sorozat) és a lehetséges végpontok (lehetséges szósorozatok) között: a cél a legnagyobb valószínűségű út megtalálása, ez a Viterbi-algoritmussal hatékonyan megvalósítható dinamikus programozási módszerekkel. 1.1.2. Lehetőségek a mintaillesztés pontosítására A beszédfelismerési hatékonyság javítása érdekében számos technikát alkalmazhatunk. Ezek közül az alábbiakban röviden bemutatom azokat, amelyekkel a féléves munkám során foglalkoztam. Nem célom a különböző módszerek részletes elméleti és technikai hátterének ismertetése, így csak áttekintem a főbb megoldásokat. A már említett legalapvetőbb módszerek közé tartozik egyrészt a jellemzővektorok végére konkatenált és értékek használata, valamint monofón modell helyett trifón modell alkalmazása. A továbbiakban bemutatott megoldások mind felhasználják ezt a két bővítést. A lineáris diszkrimináns-analízis (Linear Discriminant Analysis, LDA) célja a dimenziócsökkentés úgy, hogy a beszédhangosztályok megkülönböztethetőségét maximalizáljuk. A módszer általában a Maximum Likelihood lineáris transzformációval (MLLT) van ötvözve, ami a kevert Gauss-függvények paraméterhangolását végzi.[3] A beszélőadaptív tréning (Speaker Adaptive Training, SAT) célja, hogy a beszédfelismeréshez használt modell bizonyos paraméterei egy adott beszélő egyéni tulajdonságaira beszédhangszínére, beszédmódjára, stb. legyenek hangolva. A gyakorlatban ritkán áll rendelkezésre elegendő adat ahhoz, hogy a modellt egyes személyekre lehessen hangolni, azonban a legalapvetőbb női-férfi megkülönböztetés eredményesen kivitelezhető.[5] Jelen esetben én a fenti LDA-módszer beszélőadaptív tréninggel kiegészített változatának teljesítményét is vizsgáltam. A Subspace Gaussian Mixture Model (SGMM) technika a rejtett Markov-modellek egyes állapotaihoz tartozó valószínűségek számítására használt Gauss-eloszlások lineáris kombinációját veszi alapul, azoban ebben az esetben az így előálló kombinált eloszlás paraméterei nem a teljes modell paramétereit jelentik. Ehelyett minden állapothoz tartozik egy állapotvektor, 5
1.1 Elméleti összefoglaló Önálló laboratórium beszámoló amelyből egy, a teljes modellre érvényes leképezés alapján állítható elő az adott állapothoz tartozó kombinált Gauss-eloszlás.[9] 1.1.3. Mintaillesztés neurális hálókkal Az önálló laboratórium során végzett munkám gerincét a mesterséges neurális hálózatokkal végzett beszédfelismerési feladatok teljesítményének vizsgálata jelentette. Mára bebizonyosodott, hogy a feljebb ismertetett hagyományos rejtett Markov-modell-alapú felismerésnél hatékonyabbak az így megvalósított megoldások célom egyrészt ennek igazolása volt, másrészt a felismerési pontosság minél nagyobb mértékű növelése különböző megközelítésekkel; ez jelentheti egyrészt a neurális hálók bizonyos paraméterbeállításainak optimalizálását, másrészt azoknak a klasszikus módszerekkel való kombinációját, ami adott esetben mégjobb eredményhez vezethet. Egy neurális háló alapvető tulajdonsága, hogy sok egyszerű, elemi egységből épül fel, amelyek párhuzamosan működnek egymással. Az elemi egységeket a biológiai analógia alapján neuronoknak nevezzük. Egy ilyen neuron működését szemlélteti a 3. ábra. A neuronok bemenetein lévő értékek az adott bementre előírt súlyozás figyelembevételével összeadódnak, majd az így kapott összegből a neuron meghatározott aktivációs függvénye alapján áll elő a kimeneti érték. Az aktivációs függvény megválasztása nagyban befolyásolhatja a neurális hálót alkalmazó beszédfelismerő rendszer hatékonyságát, kísérleteim során erre is láthatunk majd példát. 3. ábra. Egy neuron sematikus szerkezete x 0 w 0 x 1 w 1 Σx i w i f(σx i w i ) y...... x n w n Egy neuron használható a bemenő adat osztályokba sorolására, azaz a súlyok megfelelő megválasztásával elérhetjük, hogy ha a bemenő adat egy adott osztályhoz tartozik (pl. egy hang zöngés), akkor a kimenetén "1"-et kapjunk, ha pedig nem (pl. zöngétlen), akkor "0"-t. 6
1.1 Elméleti összefoglaló Önálló laboratórium beszámoló Mivel azonban a teljes beszédfelismerési feladatban több osztály felett szükséges szeparációt végezni, ezért egy neuron ennek megoldására nem lenne elegendő. Így hozhatjuk létre a neuronok összekapcsolásával a neurális hálót, amely már képes lesz ellátni ezt a feladatot. Egy neurális háló ún. rétegekből épül fel, a rétegek pedig neuronokból állnak. Az egymást követő rétegek neuronjai között összeköttetések futnak, azaz minden adott réteg-beli neuron kimenete az őt követő réteg minden neuronjának bemenetére csatlakozik egy adott súlyozáson keresztül. Egy adott réteg neuronjai között nincs összeköttetés. A rétegeket három csoportba sorolhatjuk: a bementi és a kimeneti réteg, valamint a közbülső rejtett réteg vagy rétegek. A bemeneti réteg tárolja a beérkező mintákat, ez számításokat tehát nem végez. A tényleges osztályozás a kimeneti rétegben történik meg: az adott osztályhoz tartozó kimeneti neuron kimenete fog tüzelni ("1"-es értéket vesz fel), míg a többi nem. A 4. ábrán egy egy rejtett rétegű neurális hálót láthatunk (a piros szín a tüzelő neuront jelzi). 4. ábra. Példa egy egyszerű neurális hálóra súlyozások súlyozások rejtett réteg bemeneti réteg kimeneti réteg A neurális hálók klasszikusan egy rejtett réteget tartalmaznak, azonban ezek számának növelésével növelhetjük a számítási komplexitást és ezáltal jobb felismerési eredményeket érhetünk el. Az általam végzett tesztek során is az egyik központi paraméter volt a rejtettrétegszám; ezen kívül még a rétegenkénti dimenziószám (azaz a rétegenkénti neuronok száma) is összefüggésben áll a neurális hálót alkalmazó beszédfelismerő-rendszer teljesítményével (és természetesen a számításigénnyel). 7
1.1 Elméleti összefoglaló Önálló laboratórium beszámoló A fő feladat természetesen az egyes súlyok optimális megválasztása a lehető legjobb teljesítmény elérése érdekében. Ez a neurális háló tanításával történik. A tanításhoz használt beszédminták esetünkben a tanításhoz és a tesztek futtatásához használt beszédadatbázis egy részhalmazát képzik. A tanítás során a cél a tanítóminták alapján a lehető legjobb eredményt produkáló módon beállítani a neuronok közötti összeköttetések súlyait; a pontos algoritmusok részletezésétől most eltekintek. 1.1.4. A felismerési pontosság számszerűsítése A betanított neurális háló (valamint minden egyéb feljebb ismertetett modell) teljesítményét két halmazon mérjük. Mivel alapvetően nem az a célunk, hogy a tanítóhalmazon való felismerési pontosságot vizsgáljuk, hanem az általános felismerési tejesítményre vagyunk kíváncsiak, ezért a tesztelést olyan adatokon érdemes végezni, amelyekkel a modell a tanulás során nem találkozott. Így először egy fejlesztőhalmazon (development set) vizsgáljuk a beszédfelismerés pontosságát, amely a teljesítménymérés melett arra is szolgál, hogy kiválassza a tanítások közül a legjobbat. Ezt követően az így kiválasztott legjobb modell teljesítményét le kell mérni egy olyan teszthalmazon, amely olyan mintákat tartalmaz, amelyek se a tanítóse a fejlesztőhalmazban nem fordultak elő. A beszédfelismerők teljesítményét úgy mérhetjük, hogy meghatározzuk, hogy milyen arányban ismerte fel helyesen a bejövő szavakat, szósorokat, azaz mennyi hibát vétett a felismerési feladat végrehajtása során. Erre a leggyakrabban és esetünkben is használt mérőszám a Word Error Rate (WER, szóhibaarány), amely figyelembe veszi a felismerés során elkövetett helyettesítéseket (azaz például egy adott bemenő fonémát egy másikkal helyettesít helytelenül), a beszúrások számát (olyan helyre is beilleszt egy elemet, ahol nem kéne semminek állnia), a törlések számát (hiányzó elem a felismert szóban vagy szósorozatban) és a helyesen felismert elemek számát. Ezek alapján a következőképpen definiálhatjuk a szófelismerési pontosságot és -hibaarányt:[7] Acc = N S D I N W ER = 1 Acc = S +D +I, N ahol Acc a szófelismerési pontosság, W ER a szóhibaarány, N az összes felismerési egység száma, S a helyettesítések, D a törlések és I pedig a beszúrások száma. 8
1.2 A munka állapota a félév elején Önálló laboratórium beszámoló 1.2. A munka állapota a félév elején Az önálló laboratórium során végzett munkámhoz készen kaptam kézhez a TIMIT beszédadatbázist 1, amely 630 amerikai beszélő által felolvasott 10-10 mondatot tartalmaz 16kHz-es mintavételezési frekvenciával és 16 biten kódolva, PCM formátumban. Az adatbázis tartalmazza a továbbá a mondatok átiratait, és a felolvasott mondatokat előre tanító- fejlesztő- és teszthalmazokba rendezett módon találhatjuk meg benne. A munkámhoz rendelkezésemre volt bocsájtva továbbá egy nagy sebességű processzorral és a tesztek futtatásához szükséges memóriával felszerelt, hálózatra kapcsolt számítógép Ubuntu 12.04 operációs rendszerrel, amelyen távoli eléréssel is tudtam dolgozni. A gép a félév folyamán videokártyával lett bővítve a számítási kapacitás növelése érdekében. 2. Az elvégzett munka eredményeinek ismertetése 2.1. A Kaldi keretrendszer telepítése A megfelelő irodalomrészletek tanulmányozása után a különböző módszerek gyakorlatban történő kipróbálása jelentette a következő lépést. Ehhez nyílt kutatási eszközök keresése volt a cél. A megoldást a Kaldi nyílt forráskódú keretrendszer 2 jelentette ez egy beszédfelismeréskutatásra kifejlesztett C++-alapú keretrendszer, amelyben lehetőség nyílik a fent ismertetett módszerek tetszőleges beszédadatbázison történő tesztelésére. A kódok szabadon módosíthatóak, bővíthetőek, így lehetséges azokat egy-egy konkrét adatbázisra optimalizálni, valamint különböző paraméterek állításával, esetlegesen új modulok implementációjával lehetőség nyílik új megoldások kipróbálására, vagy a már létezők eredményeinek javítására.[10] A Kaldi UNIX-környezetben telepíthető. A csomag letöltése után a telepítést az abban megtalálható automatikus telepítő- és konfigurálószkriptek végzik. Az installáció során ezeket a kódokat részben módosítani kellett, mivel az alapértelmezett telepítőfájlok több esetben hibához vezettek. Szükséges volt a g++-fordító visszaállítása egy kettővel korábbi verzióra, mivel a legfrissebb változat bizonyos pontokon új szintaxissal működik, a telepítőkódokkal így nem volt kompatibilis. A telepítés megkezdéséhez további segédalkalmazások installálására is szükség volt, úgy mint a subversion verziómenedzser, illetve az automake eszköz. A Kaldi telepítése során megtörtént a működéséhez szükséges kiegészítő eszközcsomagok telepítése is, ennek legfőbb 1 http://catalog.ldc.upenn.edu/ldc93s1 2 http://kaldi.sourceforge.net/ 9
2.2 A TIMIT adatbázis előkészítése Önálló laboratórium beszámoló eleme az OpenFST végesállapotú transzdúcereket menedzselő programcsomag 3. Szükséges volt továbbá a LibATLAS lineáris algebrai megoldásokat nyújtó szoftver 4 külön kézi telepítése is, mivel ez nem zajlott le automatikusan. A Kaldi-csomaghoz tartozó fájlok, kódok, mintaszkriptek a számítógép /home/vargaada/kaldi trunk/ mappájában találhatóak. A továbbiakban hivatkozott fájlok és elérési utak a ~/kaldi trunk/egs/timit/s5 mappa alkönyvtáraiként értendők. 2.2. A TIMIT adatbázis előkészítése A TIMIT adatbázis fejléc nélküli nyers PCM-formátumban tartalmazza a beszédmintákat, 16kHz-es 16 bites lineáris kódolással. A Kaldi rendszer ezzel szemben a bemenő és feldolgozandó adatokat SPHERE-formátumban várja, amelyeket egy átalakító szkript segítésgével WAV-formátumba konvertál, majd ezeken a fájlokon kezdi meg a lényegkiemelést. Látható, hogy a bemeneti és a fogadó oldal fájlformátumai nem kompatibilisek egymással, ezért először ezt a problémát kellett megoldani. A konvertálást a sox parancssorból futtatható alkalmazással végeztem. Első lépésben át kellett állítani a fájlok alapértelmezett jogosultságait, hogy a program módosítani tudja őket, ezt követően a.pcm kiterjesztést le kellett cserélni.raw-ra, hogy a konvertálóprogram felismerje a formátumot. Így már el lehetett végezni az átalakítást WAV-formátumba az eredeti 16kHz-es beszédminták mellett mindegyikről egy-egy 8kHz-es mintavételezésű konverziót is készítettem a további kísérletezési lehetőségek érdekében. A fájlok nagy száma miatt a konverzióhoz az alábbi egyszerű Bash-szkriptet írtam (megtalálható /home/vargaada/convert.sh fileban). Második lépésben a Kaldi adatfeldolgozó részében történő SPHERE-WAV konverziót kellett kiiktatni, hiszen a fenti kód már WAV-fájlokat generál, így nem szükséges további átalakítás. Ehhez módosítani kellett a local/timit_data_prep.sh fájl vonatkozó sorát (99. sor), eltávolítva belőle az sph2wav átalakítót meghívó részleteket. Ezt követően az adatbázis már készen állt a Kaldival történő kísérletek futtatására. 2.3. A hagyományos mintaillesztési eljárások vizsgálata A Kaldiban a beszédfelismerési kutatásokhoz, tesztekhez gyakran használt minden beszédadatbázishoz (pl. a TIMIT vagy a Wall Street Journal-korpusz, stb.) találhatók előre elkészített receptek, amelyek a beszédfelismerő technológiákban bevett módszereket hiva- 3 http://www.openfst.org/twiki/bin/view/fst/webhome 4 http://math atlas.sourceforge.net/ 10
2.3 A hagyományos mintaillesztési eljárások vizsgálata Önálló laboratórium beszámoló tottak demonstrálni. Így elsőként az elméleti bevezetőben is áttekintett módszerek működését vizsgáltam és az egyes megoldások eredményeit vetettem össze egymással. A kód elvégzi az adatbázis előkészítését: felépíti belőle a nyelvi modellt, majd lényegkiemelést végez rajta a fent már ismertetett módszerekkel. Az így kinyert jellemzővektorokon ezt követően lefuttatja a különböző mintaillesztési módszereket és azoknak eredményeit fájlokba menti. Az alapértelmezett kódban kisebb változtatásokat kellett eszközölni, mivel bizonyos paraméterek átállításra szorultak (pl. az elérési utak esetenként nemlétező helyekre mutattak, vagy olyan paraméterekkel hívtak meg kódokat, amelyeket azok nem tudtak értelmezni). Az ilyen apróbb hibák annak tudhatók be, hogy a Kaldi kódjai folyamatosan frissülnek, és bizonyos esetekben az egymásra hivatkozó kódrészletek nem követik egymás változtatásait. A frissebb verziókban ezek általában kijavításra kerülnek, de ilyen hibák esetében a kód módosítása magától értetődő. A jelenleg működő változat a run.sh szkriptben található meg. A nem neurális háló alapú mintaillesztési eljárások közül a monofón, az egyszerű trifón delta és delta-delta paramtéreket tartalmazó, a lineáris diszkriminánsanalízissel és MLLTvel, valamint ennek egy további beszélőadaptív tréninggel kiegészített változatát vizsgáltam, továbbá az SGMM-et alkalmazó tanítás eredményeit is vizsgáltam. A monofón módszert leszámítva minden eljárás trifón modellt használt. Az eredmények ebben a sorrendben javultak: míg az egyszerű monofón modell 34% feletti szóhibaarányt eredményezett a fejlesztőhalmazon (továbbiakban DEV), addig az SGMM-módszerrel 21,35%-ig sikerült levinni a hibát. Az egyes módszerekhez tartozó hibaértékek a DEV- és a TEST-halmazokon a 5. ábrán követhetők. 2.3.1. A mintavételezés hatása a hibaarányra Kísérleti célokkal a 16kHz-en mintavételezett hangfájlokból egy 8kHz-es konverziót is készítettem. Jól látható szinten a 5. ábrán, hogy ebben az esetben a hiba növekszik, hiszen a kevesebb mintavételi pont miatt a jellemzővektorok tartalma is pontatlanabb lesz. Fontos megjegyezni, hogy teljesítményjavulásnak ára van, azaz általánosan elmondható, hogy az egyre kisebb hibát produkáló feladatok növekvő számításigényűek, hiszen a tanítás során további paraméterfinomító statisztikai eljárásokat alkalmazunk. Különösen az SGMMmódszerre igaz, hogy a tanítás sok időt és memóriát vesz igénybe. 11
2.4 Mintaillesztés neurális hálókkal Önálló laboratórium beszámoló 5. ábra. A hibaarány javulása a különböző vizsgált módszerek mellett WER% 38 36 34 32 30 28 26 24 22 20 16kHz DEV 16kHz TEST 8kHz TEST 8kHz DEV mono D+DD LDA+MLLT LDA+MLLT+SAT SGMM 2.4. Mintaillesztés neurális hálókkal A továbbiakban a fő vizsgálódási területet a neurális hálókkal történő beszédfelismerési feladatok teljesítményének vizsgálata és kiértekélese jelentette. A célom a hibaarány minél nagyobb mértékű csökkentése volt, ennek érdekében a neurális hálók különböző paramétereinek hangolásaival kísérleteztem, úgy mint a rejtett rétegek és a rétegenkénti neuronok száma, az aktivációs függvény típusa, a kezdeti súlyok beállítása, stb. A félév második felében a hatékonyabb, videokártyára optimalizált tanítási algoritmusokkal is lehetőségem nyílt kísérletezni. 2.4.1. Az aktivációs függvény megválasztása A TIMIT-hez készített alapértelmezett Kaldi-recept a neurális hálókkal történő felismerésnél 24,28%-os hibát produkált a DEV halmazon. Mivel ennél már az előzőekben látott LDA+SAT kombinált megoldás is jobb teljesítményt hozott, mindenképpen javítani kellett valamilyen módon ezen az eredményen. Elsőként az alapértelmezett kódban megtalálható aktivációs függvény mellett futtattam a tanítást (steps/nnet2/train_tanh.sh), ami a fenti hibaarányt eredményezte. Ebben az esetben az egyes neuronok egy tangens hiberbolikusz függvény szerint transzformálják a bejövő súlyozott összegeket. Tóth László 2013-as cikkében[11] azonban rámutat, hogy rektifikációs függvények használatával jelentős javulás érhető el a teljesítményben (rektifikációs függvé- 12
2.4 Mintaillesztés neurális hálókkal Önálló laboratórium beszámoló nyen itt most az f(x) = max(0; x) függvényt kell érteni, tehát egy olyan függvényt, ami a negatív tartományban nulla, a pozitívban pedig x értékét veszi fel). A megoldáshoz létrehoztam a /steps/nnet2/train_rectifier.sh szkriptet, ami a train_ tanh.sh kód mintájára végzi el a neurális hálók tanítását azzal a különbséggel, hogy tangens hiberbolikusz helyett rektifikációs függvényt használ aktivációs függvénynek. Így a módosított kódban a TanhComponent osztály helyett a RectifiedLinearComponent osztály használatára kerül sor. Ez változtatás önmagában jól látható javulást eredményez: a DEV halmazon a korábbi 24,28%-os hibaarány 22,9%-ra csökken, míg a TEST-en a 26,31%-ról 24,64%-ra. A 6. ábrán a javulás grafikus formában is nyomonkövethető. 6. ábra. Az aktivációs függvény hatása a hibaarányra DEV TEST 26 25 WER% 24 23 22 21 20 tangens hiberbolikusz rektifikációs 2.4.2. A réteg- és dimenziószám hatása A teljesítmény további javulása érdekében a teszteket a neurális hálók mélyítésével folytattam. A mély neuronhálók abban különböznek az egyszerűektől, hogy míg azok csak 1-2 rejtett réteget tartalmaznak, a mély neurális hálók esetében három vagy annál több rejtett réteggel történik a beszédfelismerés. Alapértelmezett esetben két rejtett réteget tartalmazó neurális hálókon futott a teszt, 300 neuronnal rétegenként. A hibaarány nagymértékű csökkentése érdekében a teljes mélységet első lépésben több mint háromszorosára növeltem előbb a rétegdimenzió növelésével 1000-13
2.4 Mintaillesztés neurális hálókkal Önálló laboratórium beszámoló re, majd a rétegek számát is megkétszereztem a következő lépésben. Ezeknek a teszteknek a futtatása során továbbra is az előző pontban bemutatott módon rektifikációs aktivációs függvényű neuronokkal dolgoztam, hiszen ezek jobb teljesítményt mutattak, így ebben az irányban látszott érdemesnek továbbhaladni. A két paraméter hangolása a következő módon történik: a kívánt rejtettréteg-számot tanítást végző kód meghívásakor is beállíthatjuk, a rétegenkénti neuronok számát azonban csak közvetelnül a kódban (train_rectifier.sh) tudjuk elvégezni. A rejtett régetek számát a num hidden layersn kapcsoló használatával állíthatjuk, ahol N a kívánt rejtettrétegszám. A dimenzió állításához a kódban a hidden_layer_dim változó értékét kell módosítani. A további paramétereken ebben az esetben nem változtattam, hanem az alapértelmezetten beállított, TIMIT-hez javasolt értékekkel dolgoztam (pl. a kezdeti és végső tanulási rátáktól initial learningrate0.015, final learning rate0.002 nem volt érdemes eltérni). A neurális háló mélységének növelése jól érzékelhető javulást eredményezett a beszédfelismerési pontosságban: míg két rejtett réteggel és rétegenkénti 300 neuronnal a DEV halmazon 22,9%-os WER volt jellemző, addig a négy rejtett réteggel és rétegenként 2000 neuronnal ez a hibaarány 20,97%-ig csökkent. Természetesen a dimenziók növelése (a két szélső esetet összevetve 600-ról 8000-re) jelentős számításiigény-növekedéssel is jár, ezért a tesztek futási sebessége arányosan jóval lassabb lesz mig a 2 300-as neurális háló tanítása néhány óráig tartott, addig a 4 2000-es méretű már több napot vett igénybe. A legnagyobb mélységű vizsgált neuronhálón a réteg- és diemnziószám növelése mellett további optimalizálási kísérleteket is végeztem, szintén Tóth cikke[11] alapján. Alapvetően két további ponton változtattam a Kaldiban megtalálható alapértelmezett paramétereken: egyrészt növeltem a bemeneti vektorablak méretét, másrészt pontosítottam a neurális háló kezdeti súlyainak beállítását. A felismerési pontosságra a neurális háló bemenetére érkező jellemzővektor körüli környezet és azt meghatározó ablakméret is hatással van. Ez alatt azt kell érteni, hogy a gyakorlatban nem csak egy-egy bementi jellemzővektor alapján történik a felismerés, hanem a bemeneten az aktuális vektor mellett annak egy adott sugarú környezetét is felhasználjuk, azaz saját magán kívül a tőle jobbra és balra elhelyezkedő N darab vektorral tanítjuk a neurális hálót. Alapértelmezettben N értéke 4, azaz egyszerre összesen 9 vektor vizsgálata történik. Én ezt a méretet 8-ra emeltem, így összesen pedig 8+1+8=17 vektorral dolgozunk. A paraméter a train_rectifier.sh kód splice_width változójának állításával történik. A másik, a teljesítményt befolyásoló tényező lehet a tanítás megkezdése előtt a neurális 14
2.4 Mintaillesztés neurális hálókkal Önálló laboratórium beszámoló háló kezdeti súlyainak megfelelő inicializálása. Ez adott intervallumban egyenletes eloszlással történik, az egyes súlyokat ez alapján véletlenszerűen beállítva. A Kaldiban megtalálható alapértelmezett intervallum a [ c 6 ; c 6], én ezt [11] alapján a következőre módosítottam: n n 6 6 [ c n+m ; c n+m ], ahol n a rejtett rétegekenti neuronok, m pedig a rejtett rétegek száma, c pedig egy konstans, ami kísérletek alapján 0,4 érték esetén vezet optimális eredményhez. Ezt a paramétert a train_rectifier.sh szkript 209. sorában található stddev változó tartalmának módosításával állíthatjuk be. A 7. ábra összefoglalja a réteg- és dimenziószám növelésének eredményeit: jól látható a mélység növekedésével arányos pontosságjavulás. Az utolsó, 4 2000-es eset a fentebb ismertetett paramétermódosításokkal elért eredményt tükrözi, a korábbi esetekben ezeknek a változóknak az alapértelmezett értékük mellett futott a teszt. 7. ábra. A réteg- és dimenziószám növelésének hatása a felismerési hibaarányra 25 24.5 24 DEV TEST 23.5 WER% 23 22.5 22 21.5 21 2*300 2*2000 4*1000 4*2000 Érdemes észrevenni, hogy bár a második és a harmadik esetben a rejtett rétegek számának és a rétegenkénti neuronszámnak a szorzata állandó (4000), a beszédfelismerés mégis az utóbbi esetben működött nagyobb pontossággal. Ebből arra következtethetünk, hogy a rejtett rétegek számának nagyobb hatása van a hibaarányra, mint annak, hogy hány neuron található egy rejtett rétegben, így a teljesítmény javulása érdekében célszerű lehet ennek a növelését előtérben helyezni. 15
2.4 Mintaillesztés neurális hálókkal Önálló laboratórium beszámoló 2.4.3. GPU-optimalizált tanítás A neurális hálók tanítása rendkívül számításigényes folyamat, így célravezető a folyamatok minél nagyobb mértékű párhuzamosítása. Az eddig vizsgált, alapvetően Daniel Povey és munkatársai által létrehozott tanítóalgoritmusok 5 ezt főként a CPU-ra alapozva teszik meg, azonban a Kaldiban is megtalálható, Karel Veselý és kollégái által implementált megoldás ezt a párhuzamosítást videokártya segítségével végzi (anélkül az előbbinél kb. 10-szer lenne lassabb a futási idő). 6 A GPU-ra optimalizált tanítási módszer némiképp eltér az eddig vizsgálttól, azonban várhatóan jobb eredményeket is produkál a beszédfelismerési pontosságban. A kísérletek folytatása érdekében ezért a számítógépet egy nvidia GeForce GTX 650 típusú grafikus kártyával bővítettük. A beszerelés után a driver telepítése volt a következő feladat (amely Linux alatt nem teljesen triviális). A párhuzamos folyamatfuttatás támogatása érdekében a driver mellett szükséges volt a CUDA Toolkit 7 telepítése is, amely pont ilyen feladatok megvalósításához lett kifejlesztve. A nvidia honlapján található telepítési útmató követése sajnos nem vezetett eredményes működéshez. A telepítés során az a módszer bizonyult hatékonynak, amikor a Toolkit installálásakor kihagytam a driver telepítését végző lépést és ezt utólag, manuálisan telepítettem a rendszerre. A megfelelő verzió megtalálása hosszas kísérletezések eredménye volt, végül a 311-es verziószámú csomag bizonyult működőképesnek és megbízhatónak. A tesztek futtatásához a runbrno.sh szkriptet hoztam létre. Mivel a TIMIT-hez nem készült a videokártyára optimalizált tanításhoz recept, ezért azt én építettem fel, az egyéb adatbázisokhoz (pl. Wall Street Journal 8 ) készült megoldásokra alapozva. A teljes megoldás pontos lépései és paraméterei megtalálhatók a fent említett fájlban, így csak a tesztek során változtatott paraméterekre térek ki. A GPU-alapú tanítás alapvetően három lépésből épül fel, ennyiben összetettebb a korábban használt módszernél. Az első lépés egy előtanítás, amely tulajdonképpen a kezdeti súlyok optimális inicializálását végzi a tényleges tanítás megkezdése előtt. Ennek a lépésnek fontos szerepe van (különösen kis adatbázisok esetén, mint a TIMIT), így az eredmények javítása érdekében főleg ebben a lépésben látszott fontosnak a praméterek megfelelő hangolása. Az előtanítás a neurális hálókhoz igen hasonló ún. korlátolt Boltzmann-gépekkel[4] történik, ezek mechanizmusának részletezésétől most eltekintek. A második lépés a neurális háló klasszikus értelemben vett tanítása, majd ezt az a leg- 5 részletesen ld. http://kaldi.sourceforge.net/nnet2.html 6 bővebben: http://kaldi.sourceforge.net/nnet1.html 7 http://www.nvidia.com/object/cuda_home_new.html 8 http://catalog.ldc.upenn.edu/ldc2000t43 16
2.4 Mintaillesztés neurális hálókkal Önálló laboratórium beszámoló jobb eredmények függvényében egy a teljesítményt tovább javító utólagos hangolása követi, amely a teljes mondatok felismerésére optimalizálja a neurális hálót a keretszintű optimum helyett.[12] A tesztek során bebizonyosodott, hogy ez esetben az előtanítást végző Boltzmann-gépek paraméterei az abban található egységek és rétegek, valamint az előtanítási iterációk száma nagyobb hatással vannak a beszédfelismerési hibaarányra, mint a középső szakaszban lévő neurális háló mélysége (bár annak hatása is megfigyelhető). Kísérleteim során négy esetet vizsgáltam: az első és második tesztnél egy 4 1024 dimenziójú neurális hálós tanítást; ez esetben az előtanítás során először 4 1024 majd 4 2000 méretű egységekkel dolgoztam, amelyek 50 iterációt végeztek. A nagyobb dimenziójú előtanítás javított a hibaarányon. A harmadik kísérletben a neurális háló dimenzióját is 4 2000-re emeltem változatlan előtanítás mellett, ez azonban a DEV-halmazon romlást eredményezett (míg a TEST-en csekély javulás látszott). Végül az előtanítást 6 2000-es méretű egységgel végezve, a neurális háló mélységét 4 1024-re visszavéve a DEV-halmazon 19,56%-ig sikerült csökkentenem a szóhibaaarányt. Az előtanító Boltzmann-gép rétegdimenzió-száma és iterációinak száma rendre a pretrain_ dbn.sh szkript meghívásakor a hid dim és rbm iter kapcsolókkal állítható, míg a rétegszámot a szkript nn_depth változója tartalmazza, a neurális háló pedig a már ismertetett módon paraméterezhető. A GPU engedélyezéséhez a megfelelő helyeken a use_gpu változó értékét "yes"-re, a szkriptek meghívásakor a use gpu id kapcsoló értékét pedig "0"-ra kell állítani Az eredményeket a 8. ábrán követhetjük. 8. ábra. A GPU-alapú tanítás eredményei 21.5 DEV TEST 21 WER% 20.5 20 19.5 4*1024+4*1024 4*2000+4*1024 4*2000+4*2000 6*2048+4*1024 17
2.5 Az eredmények összefoglalása Önálló laboratórium beszámoló 2.4.4. Kombinált modell A fenti módszerrel megvalósított, legjobb eredményt produkáló neurális hálót végül az esetleges további javulások érdekében a korábban már ismertetett SGMM-alapú felismeréssel kombináltam. A rendszerkombináció esetünkben minimális Bayes-rizikó módszerével történik.[13] A hibrid modellekre gyakran igaz, hogy a közös teljesítményük jobb, mint különkülön a részmodelleiknek ez esetünkben is így történt: a kombinált megoldás 19,14%-ig csökkentette tovább a hibát a DEV-en. A 9-es ábrán összehasonlítható az egyes modellek önálló és közös teljesítménye. A kombinált modellre vonatkozó szkript a runsgmm.sh fájlban található. 9. ábra. A kombinált modell teljesítményjavulása DEV TEST 23 22 WER% 21 20 19 18 SGMM neurális háló hibrid 2.5. Az eredmények összefoglalása Az önálló laboratóriumi munka során először megvizsgáltam a klasszikus mintaillesztési eljárások teljesítményét, majd a neurális hálókkal történő beszédfelismeréso feladatok optimalizálására összpontosítottam. A kiinduló alapértelmezett állapot 24,28%-os hibát eredményezett, ami a klasszikus módszereknél is rosszabb eredményt jelent, így a különböző paraméterek (rétegszám, aktivációs függvény, stb.) hangolásával igyekeztem csökkenteni ezt. A végső, legjobb eredmény 19,56%-os szóhibaarány volt a DEV-halmazon, amit egy hibrid modellel 19,14%-ig tudtam levinni. Az aktuális szakirodalomban (pl. [11]) között a TIMIT-re 18
2.6 A munka állapota a félév végén Önálló laboratórium beszámoló 19,19%-os WER szerepel a DEV-en és 21,68% a TEST-en. Ez utóbbin az általam vizsgált megoldás 20,47%-ot produkált, így sikerült ezeken az értékeken javítanom. Áttekintésként a 10. ábrán látható táblázat bemutatja a TIMIT adatbázison az elmúlt huszonöt évben a különböző módszerekkel elért eredményeket a TEST-halmazon; összehasonlításként az általam elért eredményt is feltüntetem (piros színnel). Bővebben az egyes hibaarányokhoz tartozó módszerekről ld. Lopes és Perdigão összefoglaló cikkét.[6] 10. ábra. A TIMIT adatbázison elért eredmények az évek során 34 32 TEST WER% 30 28 26 24 22 20 1990 1992 1994 1996 1998 2000 2002 2004 2006 2008 2010 2012 2014 év 2.6. A munka állapota a félév végén A munkám végeztével az egyes általam létrehozott vagy módosított szkriptek mind megtalálhatók a kaldi trunk/egs/timit/s5 elérési útvonalon; a szükséges beállítások és magyarázatok megtalálhatók a dokumentáció megfelelő pontjain. A runtest.sh kód csak a tesztelés egyes részleteinek futtatására szolgál (hogy ne kelljen az egész kódot módosítani mindig). Az adatbázis és az aktuális eredményekhez tartozó fájlok és futtatási naplók a /host könyvtárban helyezkednek el (timit és exp mappák). 19
HIVATKOZÁSOK Önálló laboratórium beszámoló Hivatkozások [1] Fegyó T., Mihajlik P. Gépi beszédfelismerés. Oktatási segédanyag. http://alpha.tmit.bme. hu/~mihajlik/baf/beszfelokt.pdf [2] Gales M., Young S. 2008. The Application of Hidden Markov Models in Speech Recognition. Foundations and Trends in Signal Processing 1/3, pp. 195?304. [3] Haeb-Umbach, R., Ney, H. 1992. Linear discriminant analysis for improved large vocabulary continuous speech recognition. Acoustics, Speech, and Signal Processing, 1992. [4] Hinton, G. E. 2012. A Practical Guide to Training Restricted Boltzmann Machines. Neural Networks: Tricks of the Trade. Lecture Notes in Computer Science Volume 7700, 2012, pp. 599-619. [5] Jurafsky, D., Martin, J. H. 2009. Speech and Language Processing. An Introduction to Natural Language Processing, Computational Linguistics, and Speech Recognition. Második kiadás, Pearson, London, pp. 387-388. [6] Lopes, C., Perdigão, F. 2011. Phoneme Recognition on the TIMIT Database. In: Ipsic, Ivo (szerk.). Speech Technologies. InTech. [7] Mihajlik, Péter. 2010. Spontán magyar nyelvű beszéd gépi felismerése nyelvspecifikus szabályok nélkül. Doktori értekezés, Budapesti Műszaki és Gazdaságtudományi Egyetem, Budapest. [8] Ole Morten Str., Andreas E. 2004. Cepstral mean and variance normalization in the model domain. ISCA Tutorial and Research Workshop on Robustness Issues in Conversational Interaction, University of East Anglia, Norwich, Anglia, August 30-31, 2004. [9] Povey, D., Akyazi, P., Feng, K., Ghoshal, A., Glembek, O., Goel, N. K., Karafiát, M., Rastrow, A., Rose, R. C., Schwarz, P., Thomas, S. 2010. Subspace Gaussian Mixture Models for Speech Recognition. Proceedings of ICASSP 2010. [10] Povey, D., Ghoshal, A., Boulianne, G., Burget, L., Glembek, O., Goel, N., Hannemann, M., Motlíček, P., Qian, Y., Schwarz, P., Silovský, J., Stemmer, G., Veselý, K. 2011. The Kaldi Speech Recognition Toolkit. IEEE 2011 Workshop on Automatic Speech Recognition and Understanding. [11] Tóth, László. 2013. Phone Recognition with Deep Sparse Rectifier Neural Networks. Proceedings of ICASSP 2013, pp. 6985-6989. [12] Veselý, K., Ghoshal, A., Burget, L., Povey, D. 2013. Sequence-discriminative training of deep neural networks. ISCA 2013. [13] Xu, H., Povey, D., Mangu, L., Zhu, J. 2011. Minimum Bayes Risk decoding and system combination based on a recursion for edit distance. Computer Speech and Language, 2011. 20