Înțelegerea tokenizării în NLP: un ghid pentru începători pentru procesarea textului
Publicat: 2024-11-26Tokenizarea este o componentă critică, dar adesea trecută cu vederea, a procesării limbajului natural (NLP). În acest ghid, vom explica tokenizarea, cazurile sale de utilizare, argumentele pro și contra și de ce este implicată în aproape fiecare model de limbaj mare (LLM).
Cuprins
- Ce este tokenizarea în NLP?
- Tipuri de tokenizare
- Cum funcționează tokenizarea
- Aplicații de tokenizare
- Beneficiile tokenizării
- Provocări ale tokenizării
Ce este tokenizarea în NLP?
Tokenizarea este o metodă NLP care convertește textul în formate numerice pe care modelele de învățare automată (ML) le pot folosi. Când trimiteți solicitarea unui LLM, cum ar fi Claude de la Anthropic, Gemini de la Google sau un membru al seriei GPT a OpenAI, modelul nu vă citește direct textul. Aceste modele pot lua doar numere ca intrări, astfel încât textul trebuie mai întâi convertit într-o secvență de numere folosind un tokenizer.
Un mod în care un tokenizer poate tokeniza textul ar fi să-l împartă în cuvinte separate și să atribuie un număr fiecărui cuvânt unic:
„Grammarly iubește gramatica și ML și scrisul” ar putea deveni:
Fiecare cuvânt (și numărul asociat) este un simbol. Un model ML poate folosi secvența de jetoane—[7,102], [37], [564], [2], [9,763], [2], [231]—pentru a-și rula operațiunile și a-și produce rezultatul. Această ieșire este de obicei un număr, care este convertit înapoi în text utilizând inversul aceluiași proces de tokenizare. În practică, această tokenizare cuvânt cu cuvânt este grozavă ca exemplu, dar este rar folosită în industrie din motive pe care le vom vedea mai târziu.
Un ultim lucru de remarcat este că tokenizatoarele au vocabulare - setul complet de jetoane pe care le pot gestiona. Un tokenizer care cunoaște cuvintele de bază în limba engleză, dar nu numele companiei, poate să nu aibă „Grammarly” ca simbol în vocabular, ceea ce duce la eșecul tokenizării.
Tipuri de tokenizare
În general, tokenizarea transformă o bucată de text într-o secvență de numere. Deși este firesc să ne gândim la tokenizare la nivel de cuvânt, există multe alte metode de tokenizare, dintre care una - tokenizarea subcuvintelor - este standardul industriei.
Tokenizarea cuvintelor
Tokenizarea cuvintelor este exemplul pe care l-am văzut mai înainte, în care textul este împărțit după fiecare cuvânt și prin punctuație.
Principalul avantaj al tokenizării cuvintelor este că este ușor de înțeles și de vizualizat. Cu toate acestea, are câteva neajunsuri:
- Punctuația, dacă este prezentă, este atașată cuvintelor, la fel ca în cazul „scris”.
- Cuvintele noi sau neobișnuite (cum ar fi „Gramatică”) ocupă un întreg simbol.
Ca rezultat, tokenizarea cuvintelor poate crea vocabulare cu sute de mii de jetoane. Problema cu vocabularele mari este că fac antrenamentul și inferența mult mai puțin eficiente - matricea necesară pentru a converti între text și numere ar trebui să fie uriașă.
În plus, ar exista multe cuvinte utilizate rar, iar modelele NLP nu ar avea suficiente date relevante de antrenament pentru a returna răspunsuri precise pentru acele cuvinte rare. Dacă un cuvânt nou ar fi inventat mâine, un LLM care folosește tokenizarea cuvântului ar trebui să fie reeducat pentru a încorpora acest cuvânt.
Tokenizare subcuvânt
Tokenizarea subcuvintelor împarte textul în bucăți mai mici sau egale cu cuvintele. Nu există o dimensiune fixă pentru fiecare jeton; fiecare jeton (și lungimea acestuia) este determinat de procesul de antrenament. Tokenizarea subcuvintelor este standardul industrial pentru LLM. Mai jos este un exemplu, cu tokenizarea efectuată de tokenizerul GPT-4o:
Aici, cuvântul neobișnuit „Gramatical” este împărțit în trei simboluri: „Gr”, „amm” și „arly”. Între timp, celelalte cuvinte sunt suficient de comune în text încât își formează propriile simboluri.
Tokenizarea subcuvintelor permite vocabulare mai mici, ceea ce înseamnă instruire și inferență mai eficiente și mai ieftine. Tokenizatoarele de subcuvinte pot, de asemenea, descompune cuvintele rare sau noi în combinații de simboluri mai mici, existente. Din aceste motive, multe modele NLP folosesc tokenizarea subcuvintelor.
Tokenizarea caracterelor
Tokenizarea caracterelor împarte textul în caractere individuale. Iată cum ar arăta exemplul nostru:
Fiecare personajunicdevine propriul său simbol. Acest lucru necesită de fapt cel mai mic vocabular, deoarece există doar 52 de litere în alfabet (majuscule și mici sunt considerate diferite) și mai multe semne de punctuație. Deoarece orice cuvânt englezesc trebuie să fie format din aceste caractere, tokenizarea caracterelor poate funcționa cu orice cuvânt nou sau rar.
Cu toate acestea, conform standardelor de referință LLM, tokenizarea caracterelor nu funcționează la fel de bine ca tokenizarea subcuvintelor în practică. Indicatorul subcuvântului „mașină” conține mult mai multe informații decât simbolul caracterului „c”, astfel încât mecanismul de atenție din transformatoare are mai multe informații pe care să ruleze.
Tokenizarea propoziției
Tokenizarea propoziției transformă fiecare propoziție din text într-un simbol propriu. Exemplul nostru ar arăta astfel:
Avantajul este că fiecare token conține o mulțime de informații. Cu toate acestea, există mai multe dezavantaje. Există infinite moduri de a combina cuvinte pentru a scrie propoziții. Deci, vocabularul ar trebui să fie și infinit.
În plus, fiecare propoziție în sine ar fi destul de rară, deoarece chiar și diferențele minuscule (cum ar fi „precum” în loc de „și”) ar însemna un simbol diferit, în ciuda faptului că ar avea același sens. Antrenamentul și inferența ar fi un coșmar. Tokenizarea propoziției este folosită în cazuri de utilizare specializate, cum ar fi analiza sentimentului propoziției, dar în rest, este o vedere rară.
Compensație cu tokenizarea: eficiență vs performanță
Alegerea granularității corecte de tokenizare pentru un model este într-adevăr o relație complexă între eficiență și performanță. Cu jetoane foarte mari (de exemplu, la nivel de propoziție), vocabularul devine masiv. Eficiența antrenamentului modelului scade deoarece matricea care conține toate aceste jetoane este uriașă. Performanța scade, deoarece nu există suficiente date de antrenament pentru toate simbolurile unice pentru a învăța în mod semnificativ relațiile.
La celălalt capăt, cu jetoane mici, vocabularul devine mic. Antrenamentul devine eficient, dar performanța poate scădea, deoarece fiecare token nu conține suficiente informații pentru ca modelul să învețe relațiile jeton-token.
Tokenizarea subcuvântului este chiar în mijloc. Fiecare jeton are suficiente informații pentru ca modelele să învețe relații, dar vocabularul nu este atât de mare încât antrenamentul să devină ineficient.
Cum funcționează tokenizarea
Tokenizarea se învârte în jurul antrenării și utilizării tokenizatoarelor. Tokenizatoarele convertesc textul în jetoane și jetoanele înapoi în text. Vom discuta aici tokenizatoarele de subcuvinte, deoarece sunt cel mai popular tip.
Tokenizatoarele de subcuvinte trebuie antrenate pentru a împărți textul în mod eficient.
De ce „Grammarly” se împarte în „Gr”, „amm” și „arly”? Nu ar putea funcționa și „Gram”, „mar” și „ly”? Pentru un ochi uman, cu siguranță ar putea, dar tokenizerul, care probabil a învățat cea mai eficientă reprezentare, gândește diferit. Un algoritm de antrenament comun (deși nu este utilizat în GPT-4o) folosit pentru a învăța această reprezentare este codificarea perechilor de octeți (BPE). Vom explica BPE în secțiunea următoare.
Antrenament pentru tokenizer
Pentru a antrena un bun tokenizer, aveți nevoie de un corpus masiv de text pe care să vă antrenați. Rularea BPE pe acest corpus funcționează după cum urmează:
- Împărțiți tot textul din corpus în caractere individuale. Setați-le ca jetoane de început în vocabular.
- Îmbinați cele două jetoane adiacente cele mai frecvente din text într-un singur jetoane noi și adăugați-l la vocabular (fără a șterge jetoanele vechi - acest lucru este important).
- Repetați acest proces până când nu mai există perechi de jetoane adiacente care apar frecvent sau până când a fost atinsă dimensiunea maximă a vocabularului.
De exemplu, să presupunem că întregul nostru corpus de instruire constă din textul „abc abcd”:
- Textul ar fi împărțit în [„a”, „b”, „c”, „”, „a”, „b”, „c”, „d”]. Rețineți că a patra intrare din acea listă este un caracter spațiu. Vocabularul nostru ar fi atunci [“a”, “b”, “c”, “”, “d”].
- „a” și „b” apar cel mai frecvent unul lângă celălalt în text (la egalitate cu „b” și „c”, dar „a” și „b” câștigă alfabetic). Deci, le combinăm într-un singur simbol, „ab”. Vocabularul arată acum ca [„a”, „b”, „c”, „”, „d”, „ab”], iar textul actualizat (cu îmbinarea simbolului „ab” aplicată) arată ca [„ab” , „c”, „”, „ab”, „c”, „d”].
- Acum, „ab” și „c” apar cel mai frecvent împreună în text. Le îmbinăm în simbolul „abc”. Vocabularul arată apoi ca [„a”, „b”, „c”, „”, „d”, „ab”, „abc”], iar textul actualizat arată ca [„abc”, „”, „abc ”, „d”].
- Încheiem procesul aici, deoarece fiecare pereche de jetoane adiacentă are loc acum o singură dată. Fuzionarea în continuare a jetoanelor ar face ca modelul rezultat să funcționeze mai rău pe alte texte. În practică, limita de dimensiune a vocabularului este factorul limitativ.
Cu noul nostru set de vocabular, putem mapa între text și jetoane. Chiar și textul pe care nu l-am văzut până acum, cum ar fi „cab”, poate fi tokenizat deoarece nu am aruncat jetoanele cu un singur caracter. De asemenea, putem returna numerele jetonului prin simpla vizualizare a poziției jetonului în vocabular.
O pregătire bună pentru tokenizer necesită volume extrem de mari de date și o mulțime de calcule – mai mult decât își pot permite majoritatea companiilor. Companiile ocolesc acest lucru omitând antrenamentul propriului tokenizer. În schimb, folosesc doar un tokenizer pre-antrenat (cum ar fi tokenizerul GPT-4o legat mai sus) pentru a economisi timp și bani cu pierderi minime, dacă există, în performanța modelului.
Folosind tokenizatorul
Deci, avem acest tokenizer subcuvânt antrenat pe un corpus masiv folosind BPE. Acum, cum îl folosim pe o nouă bucată de text?
Aplicăm regulile de îmbinare pe care le-am determinat în procesul de instruire a tokenizerului. Mai întâi împărțim textul introdus în caractere. Apoi, facem îmbinări de jetoane în aceeași ordine ca la antrenament.
Pentru a ilustra, vom folosi un text de intrare ușor diferit de „dc abc”:
- Am împărțit-o în caractere [„d”, „c”, „”, „a”, „b”, „c”].
- Prima îmbinare pe care am făcut-o la antrenament a fost „ab”, așa că facem asta aici: [“d”, “c”, “”, “ab”, “c”].
- A doua îmbinare pe care am făcut-o a fost „abc”, așa că facem asta: [„d”, „c”, „”, „abc”].
- Acestea sunt singurele reguli de îmbinare pe care le avem, așa că am terminat tokenizarea și putem returna ID-urile token-ului.
Dacă avem o grămadă de ID-uri de simbol și dorim să le convertim în text, putem pur și simplu să căutăm fiecare ID-uri de simbol din listă și să returnăm textul asociat. LLM-urile fac acest lucru pentru a transforma încorporarile (vectori de numere care surprindsemnificațiajetoanelor uitându-se la jetoanele din jur) cu care lucrează înapoi în text care poate fi citit de om.
Aplicații de tokenizare
Tokenizarea este întotdeauna primul pas în toate NLP. Transformarea textului în formulare cu care modelele ML (și computerele) pot funcționa necesită tokenizare.
Tokenizarea în LLM-uri
Tokenizarea este de obicei prima și ultima parte a fiecărui apel LLM. Textul este transformat mai întâi în jetoane, apoi jetoanele sunt convertite în încorporare pentru a capta semnificația fiecărui jeton și trecute în părțile principale ale modelului (blocurile transformatoare). După ce blocurile transformatoare rulează, înglobările sunt convertite înapoi în jetoane. În cele din urmă, jetonul tocmai returnat este adăugat la intrare și trecut înapoi în model, repetând procesul din nou. LLM-urile folosesc tokenizarea subcuvintelor pentru a echilibra performanța și eficiența.
Tokenizarea în motoarele de căutare
Motoarele de căutare tokenizează interogările utilizatorilor pentru a le standardiza și pentru a înțelege mai bine intenția utilizatorului. Tokenizarea motorului de căutare poate implica împărțirea textului în cuvinte, eliminarea cuvintelor de completare (cum ar fi „the” sau „și”), transformarea majusculelor în litere mici și tratarea caracterelor precum cratimele. Tokenizarea subcuvintelor nu este de obicei necesară aici, deoarece performanța și eficiența depind mai puțin de dimensiunea vocabularului.
Tokenizarea în traducerea automată
Tokenizarea traducerii automate este interesantă, deoarece limbile de intrare și de ieșire sunt diferite. Ca rezultat, vor exista două tokenizatoare, câte unul pentru fiecare limbă. Tokenizarea subcuvintelor funcționează de obicei cel mai bine, deoarece echilibrează compromisul dintre eficiența modelului și performanța modelului. Dar unele limbi, cum ar fi chineza, nu au o componentă lingvistică mai mică decât un cuvânt. Acolo se cere tokenizarea cuvintelor.
Beneficiile tokenizării
Tokenizarea este o necesitate pentru orice model NLP. Tokenizarea bună permite modelelor ML să funcționeze eficient cu text și să gestioneze bine cuvintele noi.
Tokenizarea permite modelelor să lucreze cu text
Pe plan intern, modelele ML funcționează numai cu numere. Algoritmul din spatele modelelor ML se bazează în întregime pe calcul, care în sine necesită numere pentru a calcula. Deci, textul trebuie transformat în numere înainte ca modelele ML să poată funcționa cu ele. După tokenizare, tehnici precum atenția sau încorporarea pot fi executate pe numere.
Tokenizarea se generalizează la textul nou și rar
Sau mai exact, tokenizareabunăse generalizează la textul nou și rar. Cu tokenizarea subcuvintelor și a caracterelor, textele noi pot fi descompuse în secvențe de simboluri existente. Așadar, lipirea unui articol cu cuvinte idioate în ChatGPT nu va duce la rupere (deși poate să nu ofere nici un răspuns foarte coerent). O bună generalizare permite modelelor să învețe relații între cuvinte rare, pe baza relațiilor din subtoken-uri.
Provocări ale tokenizării
Tokenizarea depinde de corpus de antrenament și de algoritm, deci rezultatele pot varia. Acest lucru poate afecta abilitățile de raționament ale LLM și lungimea lor de intrare și ieșire.
Tokenizarea afectează abilitățile de raționament ale LLM-urilor
O problemă ușoară care deseori ciocănește LLM-urile este numărarea apariției literei „r” în cuvântul „căpșuni”. Modelul ar spune în mod incorect că au fost două, deși răspunsul este de fapt trei. Este posibil ca această eroare să fi fost parțial din cauza tokenizării. Subcuvântul tokenizer a împărțit „căpșuni” în „st”, „raw” și „berry”. Așadar, este posibil ca modelul să nu fi putut să-l conecteze pe cel „r” din tokenul din mijloc la cele două „r” din ultimul simbol. Algoritmul de tokenizare ales afectează în mod direct modul în care cuvintele sunt tokenizate și modul în care fiecare simbol se leagă de celelalte.
Tokenizarea afectează lungimea de intrare și de ieșire a LLM
LLM-urile sunt construite în mare parte pe arhitectura transformatorului, care se bazează pe mecanismul de atenție pentru a contextualiza fiecare token. Cu toate acestea, pe măsură ce numărul de jetoane crește, timpul necesar pentru atenție crește pătratic. Deci, un text cu patru jetoane va dura 16 unități de timp, dar un text cu opt jetoane va dura 64 de unități de timp. Acest lucru limitează LLM-urile la limitele de intrare și ieșire de câteva sute de mii de jetoane. Cu jetoane mai mici, acest lucru poate limita cu adevărat cantitatea de text pe care o puteți introduce în model, reducând numărul de sarcini pentru care îl puteți utiliza.