Set de instrumente RNNLM (HS/NCE) mai rapid

Pe scurt, scopul acestui proiect este de a crea o implementare rnnlm care poate fi instruită pe seturi de date uriașe (câteva miliarde de cuvinte) și vocabulare foarte mari (câteva sute de mii) și utilizate în problemele ASR și MT din lumea reală. În plus, pentru a obține rezultate mai bune, această implementare acceptă configurări apreciate precum ReLU + DiagonalInitialization [1], GRU [2], NCE [3] și RMSProp [4].

Cât de rapid este? Ei bine, pe One Billion Word Benchmark [8] și CPU de 3,3 GHz, programul cu parametri standard (strat ascuns sigmoid de dimensiunea 256 și softmax ierarhic) procesează mai mult de 250k cuvinte pe secundă în 8 fire, adică 15 milioane de cuvinte pe minut. Ca urmare, o epocă durează mai puțin de o oră. Consultați secțiunea Experimente pentru mai multe numere și cifre.

Distribuția include scriptul ./run_benchmark.sh pentru a compara viteza de antrenament pe mașina dvs. între mai multe implementări. Scripturile descarcă corpusul Penn Tree Bank și antrenează patru modele: rnnlm-ul lui Mikolov cu softmax bazat pe clase de aici, rnnlm-ul lui Edrenkin cu HS din proiectul Kaldi, rnnlm-ul mai rapid cu softmax ierarhic și-rnnlm-ul mai rapid cu estimare contrastivă a zgomotului. Rețineți că, deși modelele cu softmax bazate pe clase pot obține o entropie ușor mai mică decât modelele softmax ierarhice, instruirea lor este imposibilă pentru vocabulare mari. Pe de altă parte, viteza NCE nu depinde de mărimea vocabularului. Mai mult, modelele instruite cu NCE sunt comparabile cu modelele bazate pe clasă în ceea ce privește entropia rezultată.

Rulați ./build.sh pentru a descărca biblioteca Eigen și a construi mai rapid-rnnlm.

Pentru a antrena un model simplu cu unitatea ascunsă GRU și Estimarea contrastivă a zgomotului, utilizați următoarea comandă:

./ rnnlm -rnnlm model_name -train train.txt -valid valid.txt -hidden 128 -hidden-type gru -nce 20 -alpha 0.01

Fișierele train.txt și test.txt trebuie să conțină o propoziție pe linie. Toate cuvintele distincte care se găsesc în fișierul de instruire vor fi utilizate pentru vocabularul nnet, numărul lor va determina structura arborelui Huffman și va rămâne fixat pentru acest nnet. Dacă preferați să utilizați un vocabular limitat (să zicem, primul milion de cuvinte), ar trebui să asociați toate celelalte cuvinte la un alt simbol la alegere. Vocabularul limitat este de obicei o idee bună dacă vă ajută să aveți suficiente exemple de instruire pentru fiecare cuvânt.

Pentru a aplica modelul, utilizați următoarea comandă:

./ rnnlm -rnnlm model_name -test train.txt

Logprob-urile (log10) ale fiecărei propoziții sunt tipărite în stdout. Entropia corpului în biți este tipărită pe stderr.

Rețeaua neuronală are un strat de încorporare de intrare, câteva straturi ascunse, un strat de ieșire și conexiuni opționale de intrare-ieșire directe.

În acest moment sunt acceptate următoarele straturi ascunse: sigmoid, tanh, relu, gru, gru-bias, gru-insyn, gru-full. Primele trei tipuri sunt destul de standard. Ultimele patru tipuri reprezintă modificări diferite ale Gated Recurrent Unit. Și anume, gru-insyn urmează formule din [2]; gru-full adaugă termeni de părtinire pentru resetarea și actualizarea porților; gru folosește matrici de identitate pentru transformarea intrării fără părtinire; gru-bias este gru cu termeni de părtinire. Cel mai rapid strat este relu, cel mai lent este gru-full.

Stratul de ieșire standard pentru problemele de clasificare este softmax. Cu toate acestea, deoarece ieșirile softmax trebuie normalizate, adică suma pe toate clasele trebuie să fie una singură, calculul său este imposibil pentru un vocabular foarte mare. Pentru a depăși această problemă se poate folosi fie factorizarea softmax, fie normalizarea implicită. În mod implicit, aproximăm softmax prin Softmax ierarhic peste Huffman Tree [6]. Permite calcularea softmax în timp liniar logaritmic, dar reduce calitatea modelului. Normalizarea implicită înseamnă că se calculează probabilitatea cuvântului următor ca în cazul softmax complet, dar fără normalizare explicită asupra tuturor cuvintelor. Desigur, nu este garantat că astfel de probabilități se vor însuma. Dar, în practică, suma este destul de apropiată de una datorită funcției de pierdere personalizată. Verificați [3] pentru mai multe detalii.

Model de entropie maximă

După cum sa menționat în [0], antrenamentul simultan al rețelei neuronale împreună cu modelul de entropie maximă ar putea duce la îmbunătățiri semnificative. Pe scurt, modelul maxent încearcă să aproximeze probabilitatea țintei ca o combinație liniară a caracteristicilor sale istorice. De exemplu. pentru a estima probabilitatea dacă cuvântul "d" în propoziția "abcd", modelul va însuma următoarele caracteristici: f ("d") + f ("cd") + f ("bcd") + f ("abcd ")"). Puteți utiliza maxent atât cu straturi de ieșire HS, cât și cu NCE.

Oferim rezultatele evaluării modelului pe două seturi de date populare: PTB și One Billion Word Benchmark. Verificați documentul/RESULTS.md pentru parametrii rezonabili.

Penn Treebank Benchmark

Cel mai popular corpus pentru benchmark-urile LM este englezul Penn Treebank. Partea sa de tren conține puțin mai puțin de 1kk cuvinte, iar dimensiunea vocabularului este de 10k cuvinte. Cu alte cuvinte, este asemănător cu setul de date cu flori Iris. Dimensiunea vocabularului permite utilizarea unei aproximări softmax mai puțin eficiente. Comparăm mai rapid-rnnlm cu cea mai recentă versiune a rnnlm toolkit de aici. Așa cum era de așteptat, clasele funcționează puțin mai bine decât softmax ierarhic, dar este mult mai lent. Pe de altă parte, perplexitatea pentru NCE și softmax bazată pe clase este comparabilă, în timp ce timpul de antrenament diferă semnificativ. Mai mult, viteza de antrenament pentru softmax bazată pe clasă va scădea odată cu creșterea dimensiunii vocabularului, în timp ce NCE nu se deranjează. (Cel puțin, în teorie; în practică, un vocabular mai mare va crește probabil frecvența de pierdere a memoriei cache.) Pentru o comparație echitabilă a vitezei, folosim un singur fir pentru mai rapid-rnnlm.

Notă. Folosim următoarea setare: learning_rate = 0.1, noise_samples = 30 (pentru nce), bptt = 32 + 8, threads = 1 (pentru mai rapid-rnnlm).

github

S-a arătat că modelele RNN cu funcții de activare sigmoidă antrenate cu criteriul NCE îi depășesc pe cele antrenate cu criteriul CE peste softmax aproximativ (de exemplu [3]). Am încercat să reproducem aceste îmbunătățiri folosind alte arhitecturi populare, și anume, reLU trunchiată, rețea recurentă structurală constrânsă [9] cu 40 de unități contextuale și unitate recurentă închisă [2]. În mod surprinzător, nu toate tipurile de unități ascunse beneficiază de NCE. ReLU trunchiat obține cea mai mică perplexitate dintre toate celelalte unități în timpul antrenamentului CE și cea mai mare - în timpul antrenamentului NCE. Am folosit ReLU trunchiat, deoarece ReLU standard funcționează și mai rău. Unitățile „inteligente” (SCRN și GRU) demonstrează rezultate superioare.

Notă. Raportăm cea mai bună perplexitate după căutarea în grilă utilizând următorii parametri: learning_rate =, noise_samples = (doar pentru nce), bptt =, diagonal_initialization =, L2 = .

Următoarea figură arată dependența dintre numărul de probe de zgomot și perplexitatea finală pentru diferite tipuri de unități. Liniile punctate indică perplexitate pentru modelele cu Softmax ierarhic. Este ușor de văzut că probele utilizate, cu atât este mai mică perplexitatea finală. Cu toate acestea, chiar și 5 eșantioane sunt suficiente pentru ca NCE să funcționeze mai bine decât HS. Cu excepția relu-trunc, nu a putut fi instruit cu NCE pentru niciun număr de probe de zgomot.

Notă. Raportăm cea mai bună perplexitate după căutarea în grilă. Dimensiunea stratului ascuns este de 200.

Un miliard de cuvinte de referință

Pentru One Billion Word Benchmark folosim configurarea așa cum a fost descrisă în [8] folosind scripturi oficiale. Aproximativ 0,8 miliarde de cuvinte în corpusul de instruire; 793471 cuvinte din vocabular (inclusiv și cuvinte). Folosim holdout-00000 pentru validare și holdout-00001 pentru testare.

Softmax ierarhic comparativ cu estimarea contrastivă a zgomotului. Pe scurt, pentru vocabularele mai mari, dezavantajele HS devin mai semnificative. Ca rezultat, instruirea NCE are ca rezultat valori de perplexitate mult mai mici. Este ușor să vedeți că performanța Truncated ReLU pe acest set de date este de acord cu experimentele pe PTB. Și anume, RNN cu unități ReLU trunchiate ar putea fi antrenat mai eficient cu CE, dacă dimensiunea stratului este mică. Cu toate acestea, performanța relativă a celorlalte tipuri de unități s-a schimbat. Spre deosebire de experimentele PTB, pe corpusul de un miliard de cuvinte, cea mai simplă unitate obține cea mai bună calitate.

Notă. Raportăm cea mai bună perplexitate la holdout-00001 după căutarea grilei peste learning_rate, bptt și diagonal_initialization. Folosim 50 de probe de zgomot pentru instruirea NCE.

Următorul grafic demonstrează dependența dintre numărul de probe de zgomot și perplexitatea finală. La fel ca în cazul PTB, 5 eșantioane sunt suficiente pentru ca NCE să depășească semnificativ NCE.

O proprietate importantă a modelelor RNNLM este că acestea sunt complementare standardului N-gram LM. O modalitate de a realiza acest lucru este de a antrena modelul maxent ca parte a modului de rețea neuronală. Acest lucru ar putea fi realizat prin opțiuni --direct și --direct-order. O altă modalitate de a obține același efect este utilizarea unui model de limbaj extern. Folosim modelul interpolat KN de 5 grame care este livrat împreună cu etalonul.

Modelul Maxent scade semnificativ perplexitatea pentru toate tipurile și dimensiunile de straturi ascunse. Mai mult, diminuează impactul dimensiunii stratului. Așa cum era de așteptat, combinația dintre RNNLM-ME și KN funcționează mai bine decât oricare dintre ele (perplexitatea modelului KN este de 73).

Notă. Am luat cele mai performante modele din stratul anterior și am adăugat un strat maxim de dimensiunea 1000 și am comandat 3.

Opțiuni pentru linia de comandă

Am ales să folosim opțiuni de linie de comandă care sunt compatibile cu rnnlm-ul lui Mikolov. Ca urmare, se poate înlocui doar binarul pentru a comuta între implementări.

Programul are trei moduri, adică instruire, evaluare și eșantionare.

Toate modurile necesită numele modelului:

Vor crea fișiere și .nnet (pentru stocarea vocabularului/numărărilor în formă de text și a rețelei în formă binară). Dacă și .nnet există deja, instrumentul va încerca să le încarce în loc să înceapă un nou antrenament. Dacă există și .nnet nu, instrumentul va folosi vocabularul existent și noi greutăți.

Pentru a rula programul în modul de testare, trebuie să furnizați un fișier de testare. Dacă utilizați NCE și doriți să calculați entropia, trebuie să utilizați --nce_accurate_test flag. Toate celelalte opțiuni sunt ignorate în modul de aplicare

Pentru a rula programul în modul de eșantionare, trebuie să selectați un număr pozitiv de propoziții de eșantionat.

Pentru a instrui programul, trebuie să furnizați fișiere pentru tren și validare

Opțiuni de structură a modelului

Învățarea modelului invers, adică un model care prezice cuvinte de la ultimul la primul, ar putea fi util pentru amestec.

Performanța nu se scalează liniar cu numărul de fire de execuție (este sub-liniară din cauza ratărilor cache, ipoteze false HogWild etc.). Testarea, validarea și eșantionarea sunt întotdeauna efectuate de un singur fir, indiferent de această setare. De asemenea, verificați secțiunea „Note de performanță”

În mod implicit, greutățile recurente sunt inițializate utilizând o distribuție uniformă. În [1] a fost sugerată o altă metodă de inițializare a greutăților, adică matricea identității înmulțită cu o constantă pozitivă. Opțiunea de mai jos corespunde acestei constante.

Programul acceptă propagarea înapoi trunchiată în timp. Gradienții de la ascuns la intrare sunt propagate înapoi la fiecare pas de timp. Cu toate acestea, gradienții de la ascuns la ascuns anterior sunt propagate pentru pași bptt în fiecare bloc de perioadă bppt. Acest truc ar putea accelera antrenamentul și arunca o explozie în gradient. A se vedea [7] pentru detalii. Pentru a dezactiva orice trunchiere setați bptt la zero.

Opțiuni de oprire timpurie (vezi [0]). Fie „raport” un raport între entropia de validare a epocii anterioare și una nouă.

Se utilizează Estimarea contrastivă a zgomotului dacă numărul de probe de zgomot (opțiunea --nce) este mai mare decât zero. Altfel se folosește HS. Valoarea rezonabilă pentru nce este 20.

Pentru a accelera operațiunile matriciale folosim Eigen (biblioteca de șabloane C ++ pentru algebră liniară). În plus, folosim paralelismul de date cu HogWild [5]. Cea mai bună performanță ar putea fi obținută dacă toate thread-urile sunt legate de același CPU (un thread pe nucleu). Acest lucru se poate face prin intermediul instrumentului de seturi de sarcini (disponibil în mod implicit în majoritatea distribuțiilor Linux). De exemplu. dacă aveți 2 procesoare și fiecare procesor are 8 nuclee reale + 8 nuclee hiper threading, ar trebui să utilizați următoarea comandă:

În modul NCE, CUDA este utilizat pentru a accelera calculul entropiei de validare. Desigur, dacă nu aveți GPU, puteți utiliza CPU pentru a calcula entropia, dar va dura mult timp.

  • Nu trebuie să repetați parametrii structurali (ascuns, ascuns, invers, direct, direct) atunci când utilizați un model existent. Ele vor fi ignorate. Vocabularul salvat în model va fi reutilizat.
  • Vocabularul este construit pe baza fișierului de instruire din prima rundă a instrumentului pentru un anumit model. Programul va ignora propozițiile cu OOV în timpul trenului (sau le va raporta în timpul testului).
  • Dimensiunea vocabularului joacă un rol foarte mic în spectacol (este logaritmică în dimensiunea vocabularului datorită descompunerii copacului Huffman). Dimensiunea stratului ascuns și cantitatea de date de antrenament sunt principalii factori.
  • De obicei, NCE funcționează mai bine decât HS atât în ​​termeni de PPL, cât și de WER.
  • Conexiunile directe ar putea îmbunătăți dramatic calitatea modelului. Mai ales în cazul HS. Valorile rezonabile de la care începeți sunt -direct 1000 -direct-order 4 .
  • Modelul va fi scris în fișier după o epocă de antrenament dacă și numai dacă entropia de validare sa îmbunătățit în comparație cu epoca anterioară.
  • Este o idee bună să amestecați propoziții în set înainte de a le împărți în seturi de instruire și validare (GNU shuf & split sunt una dintre opțiunile posibile pentru ao face). Pentru seturi de date imense folosiți opțiunea --epoch-per-file.

[0] Mikolov, T. (2012). Modele statistice de limbaj bazate pe rețele neuronale. Prezentare la Google, Mountain View, 2 aprilie.

[1] Le, Q. V., Jaitly, N. și Hinton, G. E. (2015). O modalitate simplă de a inițializa rețele recurente de unități liniare rectificate. arXiv preprint arXiv: 1504.00941.

[2] Chung, J., Gulcehre, C., Cho, K. și Bengio, Y. (2014). Evaluarea empirică a rețelelor neuronale recurente închise pe modelarea secvenței. arXiv preprint arXiv: 1412.3555.

[3] Chen, X., Liu, X., Gales, M. J. F. și Woodland, P. C. (2015). Pregătirea modelului de limbaj de rețea neuronală recurentă cu estimare contrastivă a zgomotului pentru recunoașterea vorbirii.

[4] T. Tieleman și G. Hinton, „Lecture 6.5-rmsprop: Divide the gradient by a running media of its recent magnitude”, COURSERA: Neural Networks for Machine Learning, vol. 4, 2012

[5] Recht, B., Re, C., Wright, S. și Niu, F. (2011). Hogwild: O abordare fără blocare a paralelismului descendent stochastic gradient. În Advances in Neural Information Processing Systems (pp. 693-701). Chicago

[6] Mikolov, T., Chen, K., Corrado, G. și Dean, J. (2013). Estimarea eficientă a reprezentărilor cuvintelor în spațiul vectorial. arXiv preprint arXiv: 1301.3781.

[7] Sutskever, I. (2013). Instruirea rețelelor neuronale recurente (disertație de doctorat, Universitatea din Toronto).

[8] Chelba, C., Mikolov, T., Schuster, M., Ge, Q., Brants, T., Koehn, P. și Robinson, T. (2013). Un miliard de cuvinte de referință pentru măsurarea progresului în modelarea statistică a limbajului. arXiv preprint arXiv: 1312.3005. GitHub

[9] Mikolov, T., Joulin, A., Chopra, S., Mathieu, M. și Ranzato, M. A. (2014). Învățarea memoriei mai lungi în rețelele neuronale recurente. arXiv preprint arXiv: 1412.7753.

Despre

Set de instrumente de modelare a limbajului rețelelor neuronale recurente mai rapid cu estimare contrastivă a zgomotului și softmax ierarhic