|
|
||
|---|---|---|
| .. | ||
| README.md | ||
| RNNPyTorch.ipynb | ||
| RNNTF.ipynb | ||
| assignment.md | ||
README.md
Rețele Neuronale Recurente
Chestionar înainte de curs
În secțiunile anterioare, am utilizat reprezentări semantice bogate ale textului și un clasificator liniar simplu deasupra acestor embedding-uri. Această arhitectură captează sensul agregat al cuvintelor dintr-o propoziție, dar nu ia în considerare ordinea cuvintelor, deoarece operația de agregare deasupra embedding-urilor elimină această informație din textul original. Deoarece aceste modele nu pot modela ordonarea cuvintelor, ele nu pot rezolva sarcini mai complexe sau ambigue, cum ar fi generarea de text sau răspunsul la întrebări.
Pentru a capta sensul unei secvențe de text, trebuie să utilizăm o altă arhitectură de rețea neuronală, numită rețea neuronală recurentă, sau RNN. În RNN, trecem propoziția prin rețea un simbol la un moment dat, iar rețeaua produce un statut, pe care îl trecem din nou prin rețea împreună cu următorul simbol.
Imagine realizată de autor
Având secvența de intrare de tokeni X0,...,Xn, RNN creează o secvență de blocuri de rețea neuronală și antrenează această secvență cap-coadă folosind backpropagation. Fiecare bloc de rețea primește o pereche (Xi,Si) ca intrare și produce Si+1 ca rezultat. Statutul final Sn sau (ieșirea Yn) este transmis unui clasificator liniar pentru a produce rezultatul. Toate blocurile de rețea împărtășesc aceleași greutăți și sunt antrenate cap-coadă folosind o singură trecere de backpropagation.
Deoarece vectorii de statut S0,...,Sn sunt trecuți prin rețea, aceasta poate învăța dependențele secvențiale dintre cuvinte. De exemplu, atunci când cuvântul nu apare undeva în secvență, rețeaua poate învăța să nege anumite elemente din vectorul de statut, rezultând o negare.
✅ Deoarece greutățile tuturor blocurilor RNN din imaginea de mai sus sunt împărtășite, aceeași imagine poate fi reprezentată ca un singur bloc (în dreapta) cu un circuit de feedback recurent, care transmite statutul de ieșire al rețelei înapoi la intrare.
Anatomia unei Celule RNN
Să vedem cum este organizată o celulă RNN simplă. Aceasta acceptă statutul anterior Si-1 și simbolul curent Xi ca intrări și trebuie să producă statutul de ieșire Si (și, uneori, ne interesează și o altă ieșire Yi, ca în cazul rețelelor generative).
O celulă RNN simplă are două matrici de greutăți interne: una transformă un simbol de intrare (să o numim W), iar cealaltă transformă un statut de intrare (H). În acest caz, ieșirea rețelei este calculată ca σ(W×Xi+H×Si-1+b), unde σ este funcția de activare și b este un bias suplimentar.
Imagine realizată de autor
În multe cazuri, tokenii de intrare sunt trecuți prin stratul de embedding înainte de a intra în RNN pentru a reduce dimensionalitatea. În acest caz, dacă dimensiunea vectorilor de intrare este emb_size, iar vectorul de statut este hid_size - dimensiunea lui W este emb_size×hid_size, iar dimensiunea lui H este hid_size×hid_size.
Memorie pe Termen Lung și Scurt (LSTM)
Una dintre principalele probleme ale RNN-urilor clasice este așa-numita problemă a gradientelor care dispar. Deoarece RNN-urile sunt antrenate cap-coadă într-o singură trecere de backpropagation, este dificil să se propage eroarea către primele straturi ale rețelei, iar astfel rețeaua nu poate învăța relații între tokeni distanți. Una dintre modalitățile de a evita această problemă este introducerea gestionării explicite a statutului prin utilizarea așa-numitelor porți. Există două arhitecturi bine cunoscute de acest tip: Memorie pe Termen Lung și Scurt (LSTM) și Unitatea de Releu Gated (GRU).
Sursa imaginii TBD
Rețeaua LSTM este organizată într-un mod similar cu RNN, dar există două stări care sunt transmise de la un strat la altul: statutul actual C și vectorul ascuns H. La fiecare unitate, vectorul ascuns Hi este concatenat cu intrarea Xi, iar acestea controlează ceea ce se întâmplă cu statutul C prin intermediul porților. Fiecare poartă este o rețea neuronală cu activare sigmoid (ieșire în intervalul [0,1]), care poate fi considerată ca o mască bitwise atunci când este înmulțită cu vectorul de statut. Există următoarele porți (de la stânga la dreapta în imaginea de mai sus):
- Poarta de uitare ia un vector ascuns și determină ce componente ale vectorului C trebuie uitate și care trebuie transmise mai departe.
- Poarta de intrare ia informații din vectorii de intrare și ascunși și le inserează în statut.
- Poarta de ieșire transformă statutul printr-un strat liniar cu activare tanh, apoi selectează unele dintre componentele sale folosind vectorul ascuns Hi pentru a produce un nou statut Ci+1.
Componentele statutului C pot fi considerate ca niște semnale care pot fi activate sau dezactivate. De exemplu, atunci când întâlnim un nume Alice în secvență, putem presupune că se referă la un personaj feminin și activăm semnalul în statut că avem un substantiv feminin în propoziție. Când întâlnim ulterior expresia și Tom, vom activa semnalul că avem un substantiv plural. Astfel, prin manipularea statutului, putem presupune că urmărim proprietățile gramaticale ale părților propoziției.
✅ O resursă excelentă pentru înțelegerea detaliilor interne ale LSTM este acest articol minunat Understanding LSTM Networks de Christopher Olah.
RNN-uri Bidirecționale și Multistrat
Am discutat despre rețelele recurente care operează într-o singură direcție, de la începutul unei secvențe până la sfârșit. Pare natural, deoarece seamănă cu modul în care citim și ascultăm vorbirea. Totuși, deoarece în multe cazuri practice avem acces aleatoriu la secvența de intrare, ar putea avea sens să rulăm calculul recurent în ambele direcții. Astfel de rețele se numesc RNN-uri bidirecționale. Când lucrăm cu o rețea bidirecțională, vom avea nevoie de doi vectori de statut ascuns, câte unul pentru fiecare direcție.
O rețea recurentă, fie unidirecțională, fie bidirecțională, captează anumite modele dintr-o secvență și le poate stoca într-un vector de statut sau le poate transmite ca ieșire. La fel ca în cazul rețelelor convoluționale, putem construi un alt strat recurent deasupra primului pentru a capta modele de nivel superior și a construi din modelele de nivel inferior extrase de primul strat. Acest lucru ne conduce la noțiunea de RNN multistrat, care constă din două sau mai multe rețele recurente, unde ieșirea stratului anterior este transmisă stratului următor ca intrare.
Imagine din acest articol minunat de Fernando López
✍️ Exerciții: Embedding-uri
Continuă învățarea în următoarele notebook-uri:
Concluzie
În această unitate, am văzut că RNN-urile pot fi utilizate pentru clasificarea secvențelor, dar de fapt, ele pot gestiona multe alte sarcini, cum ar fi generarea de text, traducerea automată și altele. Vom analiza aceste sarcini în unitatea următoare.
🚀 Provocare
Citește literatură despre LSTM-uri și ia în considerare aplicațiile lor:
- Grid Long Short-Term Memory
- Show, Attend and Tell: Neural Image Caption Generation with Visual Attention
Chestionar după curs
Recapitulare și Studiu Individual
- Understanding LSTM Networks de Christopher Olah.
Temă: Notebook-uri
Declinare de responsabilitate:
Acest document a fost tradus folosind serviciul de traducere AI Co-op Translator. Deși ne străduim să asigurăm acuratețea, vă rugăm să fiți conștienți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa natală ar trebui considerat sursa autoritară. Pentru informații critice, se recomandă traducerea profesională realizată de un specialist uman. Nu ne asumăm responsabilitatea pentru eventualele neînțelegeri sau interpretări greșite care pot apărea din utilizarea acestei traduceri.

