Publicat în 27 august 2015
Rețele neuronale recurente
Oamenii nu își încep gândirea de la zero în fiecare secundă. Pe măsură ce citiți acest eseu, înțelegeți fiecare cuvânt pe baza înțelegerii cuvintelor anterioare. Nu aruncați totul la gunoi și nu începeți să gândiți din nou de la zero. Gândurile dumneavoastră au persistență.
Rețelele neuronale tradiționale nu pot face acest lucru și pare a fi un neajuns major. De exemplu, imaginați-vă că doriți să clasificați ce fel de eveniment se întâmplă în fiecare punct al unui film. Nu este clar cum o rețea neuronală tradițională ar putea folosi raționamentul său despre evenimentele anterioare din film pentru a le informa pe cele ulterioare.
Rețelele neuronale recurente abordează această problemă. Acestea sunt rețele cu bucle în ele, permițând ca informația să persiste.
În diagrama de mai sus, o bucată de rețea neuronală, \(A\), se uită la o anumită intrare \(x_t\) și emite o valoare \(h_t\). O buclă permite trecerea informațiilor de la o etapă a rețelei la următoarea.
Aceste bucle fac ca rețelele neuronale recurente să pară oarecum misterioase. Cu toate acestea, dacă vă gândiți puțin mai mult, se pare că ele nu sunt atât de diferite de o rețea neuronală normală. O rețea neuronală recurentă poate fi considerată ca fiind mai multe copii ale aceleiași rețele, fiecare dintre ele transmițând un mesaj către un succesor. Luați în considerare ce se întâmplă dacă derulăm bucla:
Această natură asemănătoare unui lanț dezvăluie faptul că rețelele neuronale recurente sunt strâns legate de secvențe și liste. Ele sunt arhitectura naturală de rețea neuronală care trebuie folosită pentru astfel de date.
Și cu siguranță sunt folosite! În ultimii câțiva ani, s-au înregistrat succese incredibile în aplicarea RNN la o varietate de probleme: recunoașterea vorbirii, modelarea limbajului, traducerea, subtitrarea imaginilor… Lista poate continua. Voi lăsa discuția despre faptele uimitoare pe care le poate realiza cineva cu RNN-urile pentru excelenta postare de pe blog a lui Andrej Karpathy, The Unreasonable Effectiveness of Recurrent Neural Networks (Eficacitatea neuronală nerezonabilă a rețelelor neuronale recurente). Dar ele sunt într-adevăr destul de uimitoare.
Esențială pentru aceste succese este utilizarea „LSTM-urilor”, un tip foarte special de rețea neuronală recurentă care funcționează, pentru multe sarcini, mult mai bine decât versiunea standard. Aproape toate rezultatele interesante bazate pe rețele neuronale recurente sunt obținute cu acestea. Aceste LSTM-uri sunt cele pe care le va explora acest eseu.
Problema dependențelor pe termen lung
Unul dintre atracțiile RNN-urilor este ideea că acestea ar putea fi capabile să conecteze informațiile anterioare la sarcina prezentă, cum ar fi utilizarea cadrelor video anterioare ar putea informa înțelegerea cadrului prezent. Dacă RNN-urile ar putea face acest lucru, ele ar fi extrem de utile. Dar pot ele? Depinde.
Câteodată, avem nevoie doar să ne uităm la informații recente pentru a îndeplini sarcina prezentă. De exemplu, să luăm în considerare un model de limbaj care încearcă să prezică următorul cuvânt pe baza celor anterioare. Dacă încercăm să prezicem ultimul cuvânt din „norii sunt pe cer”, nu avem nevoie de niciun context suplimentar – este destul de evident că următorul cuvânt va fi cer. În astfel de cazuri, în care decalajul dintre informația relevantă și locul în care este nevoie de ea este mic, RNN-urile pot învăța să folosească informația anterioară.
Dar există și cazuri în care avem nevoie de mai mult context. Luați în considerare încercarea de a prezice ultimul cuvânt din textul „Am crescut în Franța… Vorbesc fluent franceza”. Informațiile recente sugerează că următorul cuvânt este probabil numele unei limbi, dar dacă vrem să restrângem care limbă, avem nevoie de contextul Franței, de mai mult timp în urmă. Este foarte posibil ca decalajul dintre informațiile relevante și punctul în care este nevoie de ele să devină foarte mare.
Din păcate, pe măsură ce acest decalaj crește, RNN-urile devin incapabile să învețe să conecteze informațiile.
În teorie, RNN-urile sunt absolut capabile să gestioneze astfel de „dependențe pe termen lung”. Un om ar putea alege cu grijă parametrii pentru ca acestea să rezolve probleme de jucărie de această formă. Din păcate, în practică, RNN-urile nu par să fie capabile să le învețe. Problema a fost explorată în profunzime de Hochreiter (1991) și Bengio, et al. (1994), care au găsit câteva motive destul de fundamentale pentru care ar putea fi dificil.
Din fericire, LSTM-urile nu au această problemă!
Rețele LSTM
Rețelele cu memorie pe termen scurt de lungă durată – numite de obicei doar „LSTM-uri” – sunt un tip special de RNN, capabile să învețe dependențele pe termen lung. Ele au fost introduse de Hochreiter & Schmidhuber (1997) și au fost rafinate și popularizate de multe persoane în lucrările ulterioare.1 Ele funcționează extraordinar de bine într-o mare varietate de probleme și sunt acum utilizate pe scară largă.
LSTMs sunt proiectate în mod explicit pentru a evita problema dependenței pe termen lung. Memorarea informațiilor pentru perioade lungi de timp este practic comportamentul lor implicit, nu ceva ce se străduiesc să învețe!
Toate rețelele neuronale recurente au forma unui lanț de module repetate de rețea neuronală. În RNN-urile standard, acest modul repetitiv va avea o structură foarte simplă, cum ar fi un singur strat tanh.
LSTM-urile au, de asemenea, această structură asemănătoare unui lanț, dar modulul repetitiv are o structură diferită. În loc să aibă un singur strat de rețea neuronală, există patru, care interacționează într-un mod foarte special.
Nu vă faceți griji cu privire la detaliile a ceea ce se întâmplă. Vom parcurge diagrama LSTM pas cu pas mai târziu. Deocamdată, haideți doar să încercăm să ne obișnuim cu notația pe care o vom folosi.
În diagrama de mai sus, fiecare linie poartă un întreg vector, de la ieșirea unui nod la intrările altora. Cercurile roz reprezintă operații punctuale, cum ar fi adunarea vectorială, în timp ce cutiile galbene sunt straturile rețelei neuronale învățate. Liniile care fuzionează denotă concatenarea, în timp ce o linie care se bifurcă denotă faptul că conținutul său este copiat, iar copiile merg în locații diferite.
Ideea centrală din spatele LSTM-urilor
Ceea mai importantă pentru LSTM-uri este starea celulei, linia orizontală care trece prin partea de sus a diagramei.
Starea celulei este ca un fel de bandă rulantă. Merge direct de-a lungul întregului lanț, cu doar câteva interacțiuni liniare minore. Este foarte ușor ca informația să curgă pur și simplu de-a lungul ei neschimbată.
LSLSTM are capacitatea de a elimina sau de a adăuga informații la starea celulei, reglementată cu atenție de structuri numite porți.
Porțile sunt o modalitate de a lăsa opțional să treacă informația. Ele sunt compuse dintr-un strat de rețea neuronală sigmoidală și o operație de înmulțire punctuală.
Stratul sigmoidal emite numere între zero și unu, descriind cât de mult din fiecare componentă ar trebui să fie lăsată să treacă. O valoare de zero înseamnă „nu lăsați nimic să treacă”, în timp ce o valoare de unu înseamnă „lăsați totul să treacă!”
Un LSTM are trei dintre aceste porți, pentru a proteja și controla starea celulei.
Step-by-Step LSTM Walk Through
Primul pas în LSTM-ul nostru este să decidem ce informații vom arunca din starea celulei. Această decizie este luată de un strat sigmoid numit „stratul porții de uitare”. Acesta se uită la \(h_{t-1}\) și \(x__t\), și emite un număr între \(0\) și \(1\) pentru fiecare număr din starea celulei \(C_{t-1}\). Un \(1\\) reprezintă „păstrați complet acest lucru”, în timp ce un \(0\) reprezintă „scăpați complet de acest lucru.”
Să ne întoarcem la exemplul nostru de model lingvistic care încearcă să prezică următorul cuvânt pe baza tuturor celor anterioare. Într-o astfel de problemă, starea celulei ar putea include genul subiectului prezent, astfel încât să poată fi folosite pronumele corecte. Când vedem un subiect nou, dorim să uităm genul subiectului anterior.
Postul următor este să decidem ce informații noi vom stoca în starea celulei. Acest lucru are două părți. În primul rând, un strat sigmoid numit „stratul poartă de intrare” decide ce valori vom actualiza. Apoi, un strat tanh creează un vector de noi valori candidate, \(\tilde{C}_t\), care ar putea fi adăugate la stare. În pasul următor, vom combina cele două pentru a crea o actualizare a stării.
În exemplul modelului nostru lingvistic, am dori să adăugăm sexul noului subiect la starea celulei, pentru a-l înlocui pe cel vechi pe care îl uităm.
Acum este timpul să actualizăm vechea stare a celulei, \(C_{t-1}\), în noua stare a celulei \(C_t\). Etapele anterioare au decis deja ce trebuie făcut, trebuie doar să o facem efectiv.
Înmulțim vechea stare cu \(f_t\), uitând lucrurile pe care am decis să le uităm mai devreme. Apoi adăugăm \(i_t*\tilde{C}_t\). Acestea sunt noile valori candidate, scalate în funcție de cât de mult am decis să actualizăm fiecare valoare a stării.
În cazul modelului lingvistic, acesta este momentul în care vom renunța de fapt la informațiile despre sexul vechiului subiect și vom adăuga noile informații, așa cum am decis în etapele anterioare.
În cele din urmă, trebuie să decidem ce vom scoate la ieșire. Această ieșire se va baza pe starea celulei noastre, dar va fi o versiune filtrată. Mai întâi, rulăm un strat sigmoid care decide ce părți din starea celulei vom scoate la ieșire. Apoi, trecem starea celulei prin \(\tanh\) (pentru a împinge valorile să fie între \(-1\) și \(1\)) și o înmulțim cu ieșirea porții sigmoide, astfel încât să ieșim doar părțile pe care am decis să le scoatem.
Pentru exemplul modelului lingvistic, din moment ce tocmai a văzut un subiect, ar putea dori să scoată informații relevante pentru un verb, în cazul în care acesta este ceea ce urmează. De exemplu, ar putea emite dacă subiectul este la singular sau la plural, astfel încât să știm în ce formă ar trebui să fie conjugat un verb în cazul în care aceasta este ceea ce urmează.
Variante ale memoriei pe termen scurt
Ce am descris până acum este o LSTM destul de normală. Dar nu toate LSTM-urile sunt la fel ca cele de mai sus. De fapt, se pare că aproape fiecare lucrare care implică LSTM-uri folosește o versiune ușor diferită. Diferențele sunt minore, dar merită să menționăm câteva dintre ele.
O variantă populară a LSTM, introdusă de Gers & Schmidhuber (2000), este adăugarea de „conexiuni peephole”. Aceasta înseamnă că lăsăm straturile de porți să se uite la starea celulei.
Diagrama de mai sus adaugă „peepholes” la toate porțile, dar multe lucrări vor da unele „peepholes” și nu altele.
O altă variantă este de a folosi porți de uitare și intrare cuplate. În loc să decidem separat ce să uităm și la ce ar trebui să adăugăm informații noi, luăm aceste decizii împreună. Uităm doar atunci când urmează să introducem ceva în locul său. Intrăm noi valori noi în stare doar atunci când uităm ceva mai vechi.
O variație puțin mai dramatică a LSTM este unitatea recurentă Gated Recurrent Unit, sau GRU, introdusă de Cho, et al. (2014). Aceasta combină porțile de uitare și de intrare într-o singură „poartă de actualizare”. De asemenea, fuzionează starea celulei și starea ascunsă și face alte câteva modificări. Modelul rezultat este mai simplu decât modelele LSTM standard și a devenit din ce în ce mai popular.
Acestea sunt doar câteva dintre cele mai notabile variante LSTM. Există o mulțime de altele, cum ar fi Depth Gated RNNs de Yao, et al. (2015). Există, de asemenea, o abordare complet diferită a abordării dependențelor pe termen lung, cum ar fi Clockwork RNNs de Koutnik, et al. (2014).
Care dintre aceste variante este cea mai bună? Contează diferențele? Greff, et al. (2015) fac o comparație frumoasă a variantelor populare, constatând că toate sunt aproximativ la fel. Jozefowicz, et al. (2015) au testat mai mult de zece mii de arhitecturi RNN, găsind unele care au funcționat mai bine decât LSTM-urile în anumite sarcini.
Concluzie
Mai devreme, am menționat rezultatele remarcabile pe care oamenii le obțin cu RNN-urile. În esență, toate acestea sunt obținute cu ajutorul LSTM-urilor. Ele chiar funcționează mult mai bine pentru majoritatea sarcinilor!
Scrise sub forma unui set de ecuații, LSTM-urile par destul de intimidante. Să sperăm că parcurgerea lor pas cu pas în acest eseu le-a făcut puțin mai abordabile.
LSTM-urile au fost un pas mare în ceea ce putem realiza cu RNN-urile. Este firesc să ne întrebăm: există un alt pas mare? O opinie comună în rândul cercetătorilor este: „Da! Există un pas următor și este vorba de atenție!”. Ideea este de a permite ca fiecare etapă a unei RNN să aleagă informații pe care să le analizeze dintr-o colecție mai mare de informații. De exemplu, dacă utilizați o RNN pentru a crea o legendă care să descrie o imagine, aceasta ar putea alege o parte a imaginii pe care să o analizeze pentru fiecare cuvânt pe care îl produce. De fapt, Xu, et al. (2015) fac exact acest lucru – ar putea fi un punct de plecare distractiv dacă doriți să explorați atenția! Au existat o serie de rezultate cu adevărat interesante care utilizează atenția și se pare că multe altele sunt după colț…
Atenția nu este singurul fir interesant în cercetarea RNN. De exemplu, Grid LSTMs de Kalchbrenner, et al. (2015) par extrem de promițătoare. Lucrările care utilizează RNN-uri în modele generative – cum ar fi Gregor, et al. (2015), Chung, et al. (2015), sau Bayer & Osendorfer (2015) – par, de asemenea, foarte interesante. Ultimii câțiva ani au fost o perioadă interesantă pentru rețelele neuronale recurente, iar cei care vor urma promit să fie și mai interesanți!
Recunoștințe
Sunt recunoscător unui număr de persoane pentru că m-au ajutat să înțeleg mai bine LSTM-urile, pentru că au comentat vizualizările și pentru că au oferit feedback la această postare.
Sunt foarte recunoscător colegilor mei de la Google pentru feedback-ul lor util, în special lui Oriol Vinyals, Greg Corrado, Jon Shlens, Luke Vilnis și Ilya Sutskever. De asemenea, le sunt recunoscător multor alți prieteni și colegi pentru că și-au făcut timp să mă ajute, inclusiv lui Dario Amodei, și Jacob Steinhardt. Îi sunt recunoscător în special lui Kyunghyun Cho pentru corespondența extrem de grijulie cu privire la diagramele mele.
Înainte de această postare, am exersat explicarea LSTM-urilor în timpul a două serii de seminarii pe care le-am predat despre rețele neuronale. Mulțumesc tuturor celor care au participat la acestea pentru răbdarea pe care au avut-o cu mine și pentru feedback-ul lor.
-
În plus față de autorii originali, o mulțime de oameni au contribuit la LSTM-ul modern. O listă necompletă este: Felix Gers, Fred Cummins, Santiago Fernandez, Justin Bayer, Daan Wierstra, Julian Togelius, Faustino Gomez, Matteo Gagliolo și Alex Graves.