GitHub - yandexfaster-rnnlm Trusă mai rapidă de modelare a limbajului rețelei neuronale recurente cu zgomot
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).

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.