Tokenizarea
Un dicționar cu toate cuvintele posibile este o iluzie fără sfârșit, în timp ce lucrul literă cu literă este lent și lipsit de înțeles. Soluția ingenioasă a inteligenței artificiale se află la mijloc: tăierea textului în cărămizi flexibile de Lego. Fără reguli gramaticale rigide, un algoritm simplu numără literele și lipește bucățile cele mai frecvente.
Termeni: tokeni (piese de vocabular) lipirea perechilor frecvente (BPE) vocabular fix tokenizator piese oarbe
Dicționarul care nu se poate încheia niciodată
În lecția anterioară am văzut că fiecare noțiune are nevoie de un vector propriu de numere, ceea ce presupune alcătuirea unui catalog complet cu toate cuvintele posibile. Dar în limba vie, o astfel de listă definitivă este o imposibilitate. Mereu vor apărea nume proprii neașteptate, neologisme tehnologice, greșeli de tipar, numere sau cuvinte inventate în joacă. Orice termen absent din catalog se lovește de un zid: neavând un vector asociat, rețeaua nu are ce face cu el și este silită să-l înlocuiască cu un simbol sec de „cuvânt necunoscut” (celebrul [UNK]), pierzând orice informație.
În limbi bogate în forme gramaticale, cum este româna, coșmarul se multiplică. „Casă”, „casei”, „case”, „casele”, „căsuță” și „căsuței” ar trebui tratate ca intrări complet separate în catalog, fiecare cu vectorul ei învățat de la zero. Deși orice vorbitor recunoaște numaidecât rădăcina comună, modelul ar trebui să redescopere această legătură evidentă din sute de contexte paralele.
Cealaltă extremă: litere în loc de cuvinte
O reacție firească ar fi să mergem la nivelul minim: de ce nu lucrăm direct cu litere? Un alfabet are doar câteva zeci de caractere, lista este închisă pentru totdeauna și orice cuvânt imaginabil poate fi transcris fără excepție.
Prețul plătit pentru această simplitate este însă uriaș. O frază obișnuită de douăzeci de cuvinte se transformă într-un șir de peste o sută treizeci de litere individuale. Rețeaua ar fi obligată să proceseze secvențe de șase ori mai lungi pentru aceeași cantitate de informație. Mai grav, o literă izolată nu poartă aproape niciun înțeles: ce înseamnă litera „p” de una singură? Modelul ar trebui să consume enorm de multă energie computațională doar pentru a reconstitui sensul fiecărui cuvânt, literă cu literă, de fiecare dată.
Soluția optimă este o cale de mijloc: decuparea textului în fragmente de dimensiune intermediară, mai mari decât o literă, dar mai mici sau egale cu un cuvânt întreg. Aceste cărămizi se numesc tokeni. Principiul seamănă perfect cu logica codului Morse din prima lecție: cuvintele foarte des întâlnite primesc o piesă compactă proprie, în timp ce termenii rari sunt asamblați elegant din câteva bucăți mai mici.
Bucățile de Lego se nasc din numărare
Cine stabilește unde tăiem cuvintele? Nu un lingvist și nu o comisie de experți. Împărțirea se face pur statistic printr-un algoritm automat. Pornim de la textul descompus complet în litere. Numărăm care două simboluri apar cel mai des unul lângă altul și le unim într-o cărămidă nouă. Apoi reluăm numărarea pe noul text și unim următoarea pereche fruntașă. Repetăm acest procedeu simplu de câteva zeci de mii de ori.
Această rețetă poartă numele de lipirea perechilor frecvente (cunoscută internațional ca Byte-Pair Encoding sau BPE). A fost inventată în 1994 ca tehnică de compresie a fișierelor și readusă în prim-plan în 2015 pentru procesarea limbajului. Rezultatul este remarcabil: prefixele uzuale, sufixele gramaticale și cuvintele scurte devin piese unice de sine stătătoare, fără ca algoritmul să știe vreo regulă de morfologie. Pentru model, noțiunea de „cuvânt” nu provine dintr-un manual școlar, ci din statistica pură a lecturii.
În exemplul interactiv de mai sus folosim un text restrâns de câteva sute de cuvinte, astfel că îmbinările reflectă fidel acele fraze. În sistemele industriale din viața reală, tokenizatoarele citesc biblioteci întregi de zeci de miliarde de cuvinte și opresc consolidarea la un vocabular echilibrat de cincizeci sau o sută de mii de piese standard.
Cum se feliază un text nou
După ce lista de îmbinări a fost fixată în vocabular, orice text nou poate fi feliat instantaneu aplicând regulile exact în ordinea învățată. Cuvintele foarte populare rămân intacte ca o singură piesă. În schimb, cuvintele nemaivăzute, termenii rari sau numele de familie neobișnuite sunt descompuse automat în bucățele mai mici — dar nu se pierd niciodată!
Piesele evidențiate cu caractere îngroșate reprezintă cuvinte întregi capturate dintr-o singură mișcare. Celelalte sunt silabe sau așchii de cuvinte. Puteți observa clar contrastul: frazele obișnuite se compactează în câteva blocuri mari, pe când textele încărcate de cifre, coduri sau denumiri rare sunt mărunțite în numeroși tokeni mărunți.
Inegalitatea ascunsă dintre limbi
Piesele de Lego obținute depind în totalitate de limba textelor pe care s-a făcut numărarea inițială. Un tokenizator antrenat preponderent pe pagini în limba engleză nu va deține în vocabular terminațiile și particulele specifice limbii române, așa că va sparge fiecare cuvânt românesc într-o multitudine de așchii minuscule de două sau trei litere. Figura de mai jos demonstrează acest efect: două vocabulare de aceeași mărime, unul antrenat pe română și celălalt pe engleză, feliind aceeași frază românească.
antrenat pe română
antrenat pe engleză
Această diferență are consecințe practice majore. Memoria și viteza unui model de limbaj sunt limitate de numărul maxim de tokeni pe care îi poate cuprinde dintr-o dată (așa-numita fereastră de context), iar costul financiar al apelurilor API se taxează tot pe numărul de tokeni procesați. O limbă insuficient reprezentată în faza de tokenizare este fragmentată excesiv, consumă memoria de două-trei ori mai repede și devine mult mai scump de utilizat pentru exact același volum de idei. Este o inegalitate structurală discretă, fixată înainte ca rețeaua propriu-zisă să fi învățat primul ei concept.
Unghiurile moarte: ce nu poate zări modelul
Din clipa în care textul a fost feliat în tokeni, literele individuale dispar din câmpul vizual al rețelei. Modelul primește doar un șir de coduri numerice corespunzătoare pieselor din vocabular. Dacă termenul englezesc „strawberry” (căpșună) constituie o singură piesă compactă în vocabular, pentru rețea el este un simbol atomic, la fel de opac și indivizibil precum o hieroglifă egipteană.
Această realitate tehnică explică gafe care îi amuză și îi descumpănesc adesea pe utilizatori. De ce se împiedică modelele când sunt întrebate „câte litere «r» sunt în cuvântul strawberry”? Pur și simplu pentru că modelul nu vede literele componente! Același motiv face ca inversarea unui cuvânt, compunerea de acrostihuri fine sau jocurile de rime fonetice să fie surprinzător de dificile: ele operează la un nivel de detaliu pe care tokenizarea l-a ascuns în spatele unui cod unic.
Tot aici își are rădăcina și ezitarea în aritmetica elementară. Numerele mari nu sunt decupate după valoarea lor pozițională (unități, zeci, sute), ci după frecvența apariției lor în cărțile scanate. Numărul „1024” ar putea fi un token unic (fiind des întâlnit în informatică), în timp ce „1025” ar putea fi feliat bizar în două sau trei bucăți: „10” și „25”. Pentru a aduna aceste numere, rețeaua trebuie să compenseze o fragmentare arbitrară care nu respectă nicio logică matematică.
Modelele de ultimă generație atenuează aceste stângăcii forțând tokenizatorul să păstreze fiecare cifră ca o piesă separată și exersând extensiv pe exerciții ortografice detaliate. Cu toate acestea, bariera structurală rămâne: nivelul de bază la care gândește un model nu este litera, ci tokenul.
Datorită tokenizării, orice text uman devine un șir curat de identificatori numerici, iar fiecare identificator se sprijină pe un vector învățat pe harta semantică. Piesele de puzzle sunt pregătite. Rămâne însă marea întrebare: ce sarcină îi dăm rețelei să rezolve cu ele? În lecția următoare, vom vedea că o misiune aparent banală — ghicirea următorului cuvânt dintr-o frază — ascunde în subsidiar cheia întregii înțelegeri a lumii.