L.17Partea 3 / Învățarea
Cuprins

Propagarea înapoi

Coborârea pantei are nevoie disperată să știe în ce direcție trebuie rotit fiecare buton din rețea. Să le testăm pe rând este omenește și matematic imposibil. Totuși, putem afla panta tuturor miliardelor de butoane într-o singură trecere elegantă înapoi prin rețea, împărțind vina pentru greșeală, strat cu strat, celor care au contribuit la ea.

Termeni: trecere înainte trecere înapoi vina unui neuron regula lanțului verificarea pantelor

De ce încercarea pe bâjbâite este imposibilă

Cel mai la îndemână mod de a afla panta unui buton este să-l miști foarte puțin spre dreapta și să măsori cât se modifică greșeala totală. Metoda este perfect logică și intuitivă: este exact ceea ce facem când reglăm dușul până găsim temperatura plăcută.

Dar iată problema ascunsă: pentru fiecare buton în parte, trebuie să rulezi rețeaua de la cap la coadă pe toate datele tale de antrenament! La o rețea minusculă cu 37 de butoane, asta cere vreo 70 de treceri pentru un singur pas de învățare. La un model modern cu zeci sau sute de miliarde de parametri, încercarea butoanelor pe rând ar dura mii de ani doar pentru a face un singur pas mic pe muntele de eroare!

Avem nevoie de o metodă uluitor de rapidă, capabilă să calculeze panta tuturor butoanelor deodată. Această metodă există, se numește propagare înapoi (sau backpropagation) și reprezintă adevăratul motor invizibil care a făcut posibilă inteligența artificială modernă.

Împărțirea vinei: ancheta de la coadă la cap

La ieșirea rețelei totul este clar: știm ce răspuns a dat mașina, știm care era răspunsul corect și putem măsura cu precizie greșeala (costul). Întrebarea este: cine este de vină pentru această eroare și în ce măsură?

Pentru neuronul final de la ieșire, calculul e simplu: vina fiecărei conexiuni care intră în el depinde de cât de puternic a fost semnalul care a trecut prin acea sârmă. Dar ce facem cu neuronii ascunși din straturile anterioare, care nu văd deloc ieșirea finală?

Aici intervine analogia liniei de asamblare dintr-o fabrică. Când la capătul liniei iese o piesă defectă, inginerul merge înapoi: fiecare atelier primește o cotă de responsabilitate proporțională cu influența pe care a avut-o asupra produsului final. Un neuron din stratul ascuns care a contribuit masiv la decizia greșită va primi o „vină” mare; un neuron care aproape că a tăcut va primi o vină neglijabilă. Odată stabilită vina fiecărui neuron ascuns, o transmitem mai departe către straturile anterioare, până ajungem la datele brute de intrare.

O trecere înainte și una înapoi, cu cifrele adevărate

Regula lanțului: cauza cauzelor

Sub cupola matematică a acestei anchete stă o regulă de o simplitate dezarmantă, cunoscută încă din zorii calculului diferențial: regula lanțului. Ea spune că dacă evenimentul A influențează pe B, iar B la rândul său îl influențează pe C, atunci influența totală a lui A asupra lui C este pur și simplu produsul celor două influențe parțiale.

Gândește-te la o serie de roți dințate: dacă rotirea primei rotițe cu un milimetru o rotește pe a doua cu 3 milimetri, iar a doua o rotește pe a treia cu 2 milimetri, atunci rotirea primei rotițe o va deplasa pe a treia cu 6 milimetri ($3 \times 2$). Propagarea înapoi aplică această înmulțire sistematic pe toate firele rețelei.

Trei verigi, o singură influență totală
—
—
—

Frumusețea propagării înapoi nu constă într-o formulă matematică nemaivăzută, ci într-o contabilitate impecabilă: calculăm efectele de la sfârșit către început și memorăm rezultatele parțiale, astfel încât să nu recalculăm niciodată de două ori aceeași bucată de drum!

De ce este uluitor de ieftin

Magia eficienței vine dintr-o proprietate geometrică a rețelei: mii de conexiuni diferite trec prin aceiași neuroni intermediari. În loc să calculăm influența fiecărei conexiuni pornind de la zero, calculăm vina neuronului intermediar o singură dată și o împărțim instantaneu tuturor conexiunilor care intră în el.

Rezultatul este o victorie tehnologică colosală: trecerea înapoi prin întreaga rețea durează aproximativ cât o singură trecere înainte! Oricât de mare ar fi numărul de butoane — zeci, milioane sau miliarde —, costul rămâne neschimbat: doar două treceri per pas (una înainte pentru calculul răspunsului și una înapoi pentru calculul pantelor).

Treceri prin rețea pentru un singur pas de coborâre
Numărul de treceri prin pipăit crește odată cu numărul de ponderi. Prin propagare înapoi rămâne doi, oricât ar crește rețeaua.

Dacă o trecere prin rețea ar dura o miime de secundă, calculul pe bâjbâite la un model cu un miliard de butoane ar necesita aproape 32 de ani pentru un singur pas de învățare! Prin propagare înapoi, același pas durează doar două miimi de secundă. Aceasta este diferența dintre imposibil și realizabil.

Prețul ascuns: memoria necesară la antrenare

Există totuși un preț pe care trebuie să-l plătim pentru această viteză uimitoare: consumul uriaș de memorie. Pentru a calcula vina unei conexiuni la drumul de întoarcere, algoritmul are nevoie neapărat să știe ce semnal a trecut prin ea în timpul trecerii înainte. Asta înseamnă că toate valorile intermediare ale fiecărui neuron trebuie păstrate în memoria plăcii grafice până când valul de întoarcere ajunge la ele.

Iată o deosebire practică pe care publicul larg rareori o cunoaște: a utiliza un model antrenat (de pildă, a pune o întrebare unui asistent AI) este de câteva ori mai ieftin în memorie decât a antrena acel model! La utilizare, poți arunca valorile straturilor precedente pe măsură ce avansezi; la antrenare însă, ești forțat să reții întregul istoric al trecerii înainte, alături de copii complete ale tuturor pantelor.

Testul de siguranță: verificarea pantelor

Cum putem fi siguri că formulele matematice ale propagării înapoi sunt implementate corect în cod și că nu există o eroare ascunsă? Aici metoda lentă a bâjbâitului revine ca o unealtă de control de neînlocuit!

Deși este mult prea înceată pentru a antrena o rețea mare, mișcarea ușoară a fiecărui buton oferă panta matematică adevărată, lipsită de orice ambiguitate. Inginerii compară pantele calculate prin propagare înapoi cu cele obținute prin această metodă pe o rețea mică de test. Dacă cifrele coincid până la a cincea zecimală (așa cum poți vedea în tabelul de mai jos), avem dovada că algoritmul funcționează impecabil.

Fără această verificare, o greșeală strecurată într-un semn minus sau o înmulțire ar putea lăsa rețeaua să se antreneze în continuare, dar lamentabil și fără să afișeze vreun mesaj de eroare pe ecran.

O scânteie renăscută: istoria propagării înapoi

Ideea de a trimite erorile înapoi printr-un lanț de ecuații a fost descoperită independent de mai mulți cercetători încă din anii 1960. Însă gloria și forma ei actuală au explodat în 1986, grație unui articol de răsunet semnat de David Rumelhart, Geoffrey Hinton și Ronald Williams.

Marea contribuție a acelui moment nu a fost doar matematica pură, ci o convingere fermă care a spulberat scepticismul general: rețelele neuronale cu multe straturi chiar pot fi antrenate în practică! Cei aproape douăzeci de ani de apatie de după cartea despre sau-exclusiv s-au spulberat, deschizând drumul spre viitor.

Odată ce avem propagarea înapoi, știm cum să antrenăm orice rețea, oricât de mare. Dar când încercăm să aplicăm această structură generală la imagini cu milioane de pixeli, ne lovim de o explozie a numărului de conexiuni. Pentru a vedea lumea cu adevărat, avem nevoie de o arhitectură special concepută pentru spațiu: în lecția următoare descoperim convoluția.