Notă de început
În era digitală, inteligența artificială are o influență din ce în ce mai mare asupra vieții noastre și este profund conectată cu toate domeniile de activitate umane.
Este important să putem distinge tipurile de inteligență artificială și să reușim să înțelegem cum funcționează ele. În viitor, cu siguranță, oamenii vor reuși să stăpânească acești algoritmi inteligenți, învățând să-i folosească în interesul lor. În acest articol voi vorbi despre unul dintre cele mai puternice și complexe modele de machine learning și anume: Transformerul (din aceeași familie cu ChatGPT). Voi explica elementele principale (printre care și mecanismul fundamental: atenția) și voi prezenta ideile de bază care conturează modelul.
Introducere
Explorat pentru prima dată în 2017, în articolul “Attention is All You Need“, de către cercetători de la Google, Transformerul propune o arhitectură de tip deep learning, bazată pe un mecanism de atenție, care promite îmbunătățirea algoritmilor de procesare de text. Predecesorul modelului, Recurrent Neural Network (RNN), se baza pe o implementare recursivă care lungea timpul de execuție și pierdea elemente de context importante, din urma (memorie pe termen scurt). Astfel, Transformerul a revoluționat modelele de procesare de context, folosind miliarde de parametri antrenabili care să poată interacționa între ei pe baza unor corelații matematice.
Arhitectura modelului
Modelul are la bază două blocuri de gândire: Encoderul și Decoderul (le vom explica pe rand). În funcție de nevoile modelului, se poate opta doar pentru unul dintre cele două blocuri, însă, pentru scopul acestui articol, vom vorbi despre modelul care le combină.
Input
Inputul se referă la ceea ce îi oferim noi algoritmului, de exemplu un text: “Ana are mere roșii”. Modelul transformă textul în bucăți mai mici: litere, silabe, caractere etc. (acest lucru diferă de la model la model; noi vom folosi cuvintele întregi) și, după aceea, le repartizează câte un token (input index), adică un număr unic care să reprezinte cuvântul.
Mai departe, fiecărui token îi este atribuit un vector care conține embeddinguri. Ce sunt embeddingurile? Haideți să ne imaginăm un spațiu vectorial definit pe n dimensiuni, unde n este lungimea vectorului de embeddinguri. Putem să ne gândim la cuvintele care au coordonatele apropiate în acel spațiu ca fiind asemănătoare într-un fel.
Aceste embedding-uri încep prin a fi alese aleatoriu, iar apoi, prin procesul de training (învățare a modelului), devin relevante pentru sensul cuvintelor.
În plus, la fiecare vector de embeddinguri, vom adăuga încă unul, de lungime asemănătoare, care conține positional embeddinguri. Acestea au rolul de a reține informații despre poziția unui cuvânt într-o propoziție, iar, spre deosebire de embeddingurile normale, cele poziționale nu se vor modifica pe parcursul perioadei de training (sunt prestabilite). Aceste sunt calculate după formula:
PE(pos,2i) = sin(pos//)
PE(pos,2i+1) = cos(pos//)
Unde pos este poziția cuvântului în propoziție și i este dimensiunea. Aceste funcții au fost alese intuitiv, așa că nu voi intra în multe detalii.
Ce este atenția?
Cea mai importantă parte a modelului de transformer o reprezintă mecanismul de înțelegere a contextului, numit și atenție. Atenția poate fi de multe feluri. Self-attention este metoda care identifică importanța tuturor componentelor unei secvențe în relație cu toate celelalte componente din aceeași secvență. Cross-attention implică înțelegerea importanței unei componente dintr-o secvență în relație cu toate celelalte componente din altă secvență.(de exemplu intr-o traducere)(vezi fig)
Cum funcționează atenția?
Pentru a putea înțelege ideea din spatele atenției, va trebui să definim câteva noțiuni.
- (lungimea vectorilor de embedinguri)
- sunt dimensiuni alese aleatoriu, mai mici decât
- Matricea reală : Keys (K)-dimensiune:lungime secvența,
- Matricea reală : Queries (Q)-dimensiune:lungime secvența,
- Matricea reală : Values (V)-dimensiune:lungime secvența,
- (transpusa unei matrici)
Atenția funcționează conform formulei
Atenție(Q,K,V)=softmaxV
Pare puțin complicat, așa că haideți să o împărțim pe bucăți.
Ne întoarcem la „secvența” noastră: „Ana are mere roșii”. Fiecare cuvânt are atribuit un vector (după cum am discutat mai sus), de dimensiune . Dacă concatenăm toți vectorii, obținem o matrice de dimensiuni , 4, o vom nota cu X.
Acum putem să folosim înmulțirea de matrici între X și o matrice aleasă arbitrar, pe care o vom nota , având dimensiunile ,. Rezultatul va fi chiar matricea Q. Pentru matricea K vom proceda la fel, înmulțind matricea X cu (,). În final, pentru matricea V, aplicăm operația de înmulțire între matricea X și matricea , care de data aceasta este definită cu dimensiunile , .
Queries și Keys reprezintă mai degrabă un concept, iar pentru a înțelege mai ușor rolul acestora putem să ne gândim că ele rețin elemente legate de trăsăturile unui cuvânt. Dacă la început, cuvântul este definit într-un spațiu vectorial cu dimensiuni, în urma operației de înmulțire, cuvântul este adus într-un alt spațiu cu mai puține dimensiuni (), astfel ușurând vizualizarea asemănării între două cuvinte. De asemenea, operația de înmulțire creează legături între K și Q (unde avem valorile cele mai mari după înmulțire există și o atenție puternică). (vezi fig. 3)
Un aspect care merită menționat este acela că, pentru stabilitate numerică, s-a descoperit că este util ca valorile matricei obținute să fie împărțite la . De asemenea, este important să aplicăm o funcție de softmax. Aceasta transformă orice valoare într-un număr din intervalul [0,1], cu proprietatea că, daca adunam valorile de pe aceeași coloana, suma acestora să fie 1. Numerele negative devin 0.
Dacă din Q și K putem să descoperim legături între trăsăturile unui cuvânt, atunci ce facem cu matricea de Values? În urma înmulțirii cu matricea V, obținem un spațiu vectorial care va fi optimizat pentru găsirea următorului cuvânt într-o propoziție.
De exemplu, propun o analogie interesantă. Dacă am vorbi despre filme, putem spune că matricea Q are legătură cu tema filmului (“bătălia dintre bine și rău”), K are legătură cu genul filmului (“acțiune”), iar V este chiar filmul în sine (“Avengers”).
Trebuie să înțelegem că matricile , și sunt alese aleatoriu la începutul algoritmului, iar parametrii acestora se antrenează pe parcurs, oferind rezultate potrivite. Mai jos puteți vedea o schemă grafică a întregului proces de înmulțire. (vezi fig. 4)
Mai mult, acest proces reprezintă doar un head din întregul mecanism de atenție. Dacă ne întoarcem la poza cu arhitectura modelului, observăm că acolo avem de-a face cu un multi-head attention. Asta înseamnă că într-un model de transformer avem un număr mare de head-uri de atenție care lucrează simultan, fiecare cu matrici , , și dimensiuni , diferite (subspații vectoriale diferite), cu scopul de a găsi legături noi între cuvinte. Dacă avem h blocuri de atenție paralele, multi-head attention-ul funcționează după formula: Concat(head1,head2,…,headh), unde este o matrice reală de dimensiuni (h⋅,).
Masked multihead attention și diferențele encoder-decoder
Până acum ne-am uitat la cum funcționează blocurile de atenție din partea encoderului. Acum aș vrea să discutam puțin despre componenta geamănă din partea decoderului. În principiu, cele doua funcționează aproapae identic, însă sunt trei detalii diferite:
- În decoder exista doua blocuri de atenție :masked multihead attention și un multihead attention obișnuit. Rolul decoderului este acela să genereze output pe baza contextului oferit de encoder. Din acest motiv atunci când antrenam primul bloc de atenție (din decoder),dorim ca un ouput aflat pe o anumită pozitie să fie pus in legătură doar cu altul aflat pe o poziție anterioara.
- Masked multihead attentionul, presupune ca după înmulțirea intre matricile Q și K, unele valori să fie înlocuite cu -infinit, ca după aplicarea funcției de sdoftmax, acestea să devina 0.(vezi fig5)
- În cel de-al doilea bloc de atenție are loc un proces interesant. În loc ca valorile K și V să provină de la ultimul bloc de atenție al decoderului(masked multihead attentionul de le 2), acestea provin din rezultatul final al encoderului (acest procces se mai numește și cross-attention).