10 · Tokenització
Idea central: un LLM no veu lletres ni paraules: veu enters. La tokenització és la frontera entre el text humà i el model, i és responsable d'un nombre sorprenent de comportaments estranys, biaixos i costos.
1. El problema# sense fórmules
Necessites convertir text en una seqüència d'enters d'un vocabulari finit . Dues opcions extremes:
| Enfocament | Vocabulari | Longitud de seqüència | Problema |
|---|---|---|---|
| Caràcters/bytes | 256 | molt llarga | seqüències 4-5× més llargues → cost quadràtic d'atenció |
| Paraules | 10⁶+ | curta | OOV (paraules desconegudes), embedding matrix gegant, mala gestió de morfologia |
Solució: subparaules. Vocabularis de 32k–256k que combinen paraules freqüentes senceres amb fragments per a la resta. És un compromís de compressió: menys tokens per text = menys cost.
Caràcters, paraules o subparaules
La taula del text diu «molt llarga» i «vocabulari gegant». Quant són, exactament, i què costen?
| opció | longitud | barra | vocabulari | bytes/token | OOV |
|---|---|---|---|---|---|
| Bytes | 91 | 256 | 1,00 | 0,0 % | |
| Caràcters | 89 | 63 | 1,02 | 0,0 % | |
| Subparaules (1.200 fusions) | 24 | 1.456 | 3,79 | 0,0 % | |
| Paraules | 20 | 1.354 | 4,55 | 0,0 % |
A zero, les subparaules són bytes. Puja-les i la seqüència s'escurça.
- bytes del text
- 91
- com a bytes
- 91 tokens
- com a subparaules
- 24 tokens
- com a paraules
- 20 tokens
- OOV amb vocabulari de paraules
- 0,0 %
- compressió de les subparaules
- 3,79 B/token
La longitud de seqüència no és una molèstia: és el que multiplica el cost de l'atenció, i el terme que mana a context llarg és . Aquesta taula agafa el mateix text, el tokenitza de les tres maneres i calcula què costaria una capa d'atenció amb per a cadascuna.
| tokenització | L | vocabulari | FLOPs d'atenció | × respecte de subparaules | taula d'embeddings |
|---|---|---|---|---|---|
| Bytes | 91 | 256 | 67,84 M | 14,38× | 1,05 M |
| Caràcters | 89 | 63 | 64,89 M | 13,75× | 258,05 k |
| Subparaules (1.200 fusions) | 24 | 1.456 | 4,72 M | 1,00× | 5,96 M |
| Paraules | 20 | 1.354 | 3,28 M | 0,69× | 5,55 M |
Amb aquest text, processar-lo byte a byte costaria 14,4 vegades més d'atenció que amb subparaules, perquè la seqüència és 3,79 vegades més llarga i el cost va amb el quadrat. La columna de la dreta és l'altra meitat del compromís: amb paraules senceres, la taula d'embeddings passa a 5,5 M paràmetres, i això amb un vocabulari tret de deu mil paraules de corpus. Amb un corpus real seria de milions d'entrades.
I l'OOV. Amb vocabulari de paraules, el 0,0 % dels tokens d'aquest text cauen fora. No és que es tokenitzin malament: no hi ha cap manera de representar-los, i acaben en un <UNK> que perd la informació per sempre. Amb bytes i amb subparaules de nivell byte, aquella columna és zero passi el que passi, i prova el botó dels emojis per veure-ho.
2. Byte Pair Encoding (BPE)# sense fórmules
Algorisme (originalment de compressió, 1994; aplicat a NLP per Sennrich et al., 2016):
- Comença amb el vocabulari de caràcters (o bytes).
- Compta totes les parelles adjacents al corpus.
- Fusiona la parella més freqüent en un token nou.
- Repeteix fins a arribar a la mida de vocabulari desitjada.
"low low lower newest widest"
→ fusiona ("e","s") → "es"
→ fusiona ("es","t") → "est"
→ fusiona ("l","o") → "lo" ...
El resultat és una llista ordenada de fusions que s'apliquen deterministament en inferència.
Byte-level BPE (GPT-2 i successors) opera sobre bytes UTF-8 en lloc de caràcters Unicode: així mai hi ha <UNK>, qualsevol seqüència de bytes és codificable — emojis, caràcters xinesos, dades binàries.
BPE, fusió a fusió
Fusionar la parella més freqüent, una i una altra vegada. Quant comprimeix, i què hi perd?
| # | parella | token nou | ocurrències |
|---|---|---|---|
| 1 | ␣ + l | ␣l | 239 |
| 2 | e + s | es | 219 |
| 3 | ␣ + a | ␣a | 219 |
| 4 | e + l | el | 208 |
| 5 | ␣ + p | ␣p | 190 |
| 6 | ␣ + d | ␣d | 183 |
| 7 | ␣ + c | ␣c | 164 |
| 8 | ␣l + a | ␣la | 144 |
| 9 | t + a | ta | 138 |
| 10 | ␣ + i | ␣i | 136 |
| 11 | e + n | en | 134 |
| 12 | ␣ + el | ␣el | 120 |
| 13 | ␣ + m | ␣m | 119 |
| 14 | r + e | re | 110 |
| 15 | E + l | El | 109 |
| 16 | a + r | ar | 92 |
| 17 | o + r | or | 91 |
| 18 | ␣ + El | ␣El | 89 |
| 19 | l + a | la | 88 |
| 20 | n + a | na | 81 |
| 21 | ␣c + a | ␣ca | 80 |
| 22 | e + r | er | 72 |
| 23 | · + · | é | 71 |
| 24 | a + t | at | 70 |
| 25 | ␣ + v | ␣v | 68 |
| 26 | ␣ + t | ␣t | 67 |
| 27 | ␣a + l | ␣al | 62 |
| 28 | ␣d + e | ␣de | 61 |
| 29 | é + s | és | 60 |
| 30 | r + a | ra | 57 |
| 31 | ␣ + g | ␣g | 55 |
| 32 | ␣ + s | ␣s | 55 |
| 33 | ␣ + n | ␣n | 53 |
| 34 | ␣d + el | ␣del | 53 |
| 35 | l + e | le | 52 |
| 36 | ␣ + f | ␣f | 52 |
| 37 | i + u | iu | 48 |
| 38 | ␣ + és | ␣és | 48 |
| 39 | ␣ + L | ␣L | 47 |
| 40 | i + x | ix | 46 |
| 41 | ␣ + b | ␣b | 46 |
| 42 | q + u | qu | 43 |
| 43 | d + a | da | 42 |
| 44 | · + · | í | 40 |
| 45 | l + i | li | 38 |
| 46 | u + n | un | 37 |
| 47 | ␣p + o | ␣po | 37 |
| 48 | c + a | ca | 36 |
| 49 | e + ix | eix | 36 |
| 50 | ␣el + s | ␣els | 35 |
| 51 | ␣ + es | ␣es | 34 |
| 52 | a + n | an | 33 |
| 53 | en + t | ent | 33 |
| 54 | ␣ + h | ␣h | 31 |
| 55 | e + t | et | 30 |
| 56 | o + s | os | 30 |
| 57 | i + n | in | 29 |
| 58 | i + na | ina | 29 |
| 59 | ␣p + a | ␣pa | 29 |
| 60 | a + l | al | 28 |
| 61 | i + ta | ita | 28 |
| 62 | m + b | mb | 28 |
| 63 | ⏎ + ⏎ | ⏎⏎ | 28 |
| 64 | ␣L + a | ␣La | 28 |
| 65 | ␣l + es | ␣les | 28 |
| 66 | o + t | ot | 27 |
| 67 | ␣ + A | ␣A | 27 |
| 68 | ␣ + qu | ␣qu | 27 |
| 69 | b + le | ble | 26 |
| 70 | i + c | ic | 26 |
| 71 | o + m | om | 26 |
| 72 | ␣n + o | ␣no | 26 |
| 73 | i + a | ia | 25 |
| 74 | s + a | sa | 25 |
| 75 | ␣po + ble | ␣poble | 24 |
| 76 | · + · | è | 23 |
| 77 | ␣m + at | ␣mat | 23 |
| 78 | i + l | il | 22 |
| 79 | o + l | ol | 22 |
| 80 | r + es | res | 22 |
| 81 | r + iu | riu | 22 |
| 82 | ␣ + ta | ␣ta | 22 |
| 83 | u + na | una | 20 |
| 84 | ␣a + mb | ␣amb | 20 |
| 85 | e + u | eu | 19 |
| 86 | i + g | ig | 19 |
| 87 | ra + n | ran | 19 |
| 88 | · + · | à | 19 |
| 89 | i + t | it | 18 |
| 90 | ␣g + ent | ␣gent | 18 |
| 91 | i + s | is | 17 |
| 92 | u + r | ur | 17 |
| 93 | · + · | ó | 17 |
| 94 | ␣ + una | ␣una | 17 |
| 95 | ␣El + s | ␣Els | 17 |
| 96 | es + t | est | 16 |
| 97 | t + s | ts | 16 |
| 98 | ␣ + re | ␣re | 16 |
| 99 | ␣p + or | ␣por | 16 |
| 100 | r + en | ren | 15 |
| 101 | ta + t | tat | 15 |
| 102 | y + a | ya | 15 |
| 103 | ␣ca + m | ␣cam | 15 |
| 104 | ␣n + en | ␣nen | 15 |
| 105 | c + o | co | 14 |
| 106 | iu + tat | iutat | 14 |
| 107 | ␣ + j | ␣j | 14 |
| 108 | ␣ + riu | ␣riu | 14 |
| 109 | ␣mat + í | ␣matí | 14 |
| 110 | ␣p + eix | ␣peix | 14 |
| 111 | es + p | esp | 13 |
| 112 | i + m | im | 13 |
| 113 | · + · | ç | 13 |
| 114 | ␣ + en | ␣en | 13 |
| 115 | ␣ + o | ␣o | 13 |
| 116 | ␣a + n | ␣an | 13 |
| 117 | ␣ca + da | ␣cada | 13 |
| 118 | ␣ca + p | ␣cap | 13 |
| 119 | ␣p + ar | ␣par | 13 |
| 120 | ␣p + la | ␣pla | 13 |
Les 120 primeres de 300.
- bytes per token al corpus
Les fusions s'apliquen per rang, no d'esquerra a dreta: a cada pas es busca la parella de rang més baix que encara hi sigui. És el que fa que el mateix tros doni sempre la mateixa segmentació, surti on surti del text.
Cada fusió afegeix exactament un token al vocabulari.
És l'única diferència que decideix si hi pot haver <UNK>.
- fusions
- 300
- mida del vocabulari
- 556
- compressió al corpus
- 2,476 B/token
- el text de prova, en tokens
- 18
- torna byte a byte
- sí
- tokens perduts
- 0
La propietat que ha de complir un tokenitzador abans que cap altra: passar el text a enters i tornar-lo enrere ha de donar exactament el mateix text. Aquí es fa amb el text de prova, i es compara amb el que dona la variant de caràcters.
| text original | El gat 🐈 i la llama 🦙 |
| identificadors | [270, 447, 32, 240, 159, 144, 136, 265, 263, 256, 274, 109, 97, 32, …] |
| descodificat | El gat 🐈 i la llama 🦙 |
| idèntic? | sí, byte a byte |
Amb byte-level, prova tots els botons: emojis, japonès, àrab, símbols matemàtics. Cap no falla, i no és sort. L'alfabet de partida són els 256 bytes sencers, hi surtin o no al corpus d'entrenament, i qualsevol seqüència de bytes és per definició una seqüència de símbols de l'alfabet. No hi pot haver <UNK> perquè no hi ha res que quedi fora. Canvia a «Caràcters» i prova els emojis altra vegada.
La compressió es mesura al corpus sencer, no al text de prova: 2,476 bytes per token amb 300 fusions. Sense cap fusió és exactament 1,000, perquè cada token és un byte. La corba de sota ensenya què guanyes per cada fusió que hi afegeixes, i que els guanys s'esgoten.
3. Altres algorismes# sense fórmules
- WordPiece (BERT): com BPE, però fusiona la parella que maximitza la versemblança del corpus en lloc de la freqüència bruta.
- Unigram LM (Kudo, 2018): comença amb un vocabulari gran i elimina iterativament els tokens que menys perjudiquen la versemblança. Permet mostreig de segmentacions (subword regularization) — útil com a data augmentation.
- SentencePiece: no és un algorisme sinó una implementació (de BPE i Unigram) que tracta l'espai com un caràcter més (
▁), cosa que el fa independent de l'idioma i reversible sense ambigüitat. És l'estàndard pràctic.
BPE contra WordPiece contra Unigram
Tres algorismes, el mateix corpus i la mateixa mida de vocabulari. En què es diferencien de debò?
El punt mig marca un tros que parteix un caràcter multibyte pel mig. No és cap error: amb un alfabet de bytes, un token pot ser mitja «ó», i el text es reconstrueix igualment quan es tornen a ajuntar.
| algorisme | tokens al corpus | bytes/token | tokens apresos | exemples del vocabulari |
|---|---|---|---|---|
| BPE | 5.121 | 2,781 | 440 | ␣bicicleta · ␣treballa · ␣muntanya · ␣família · ␣travessa · iblioteca |
| WordPiece | 5.223 | 2,727 | 440 | ␣biblioteca · ␣bicicleta · ␣tomàquet · ␣treballa · ␣muntanya · ␣família |
| Unigram LM | 4.716 | 3,020 | 440 | ␣treball · treballa · ␣bicicle · muntanya · família · ␣finestr |
Els 60 símbols de l'alfabet hi són sempre als tres: sense ells hi hauria text irrepresentable.
- vocabulari
- 500 tokens
- log-versemblança, BPE
- -27,394 k
- WordPiece
- -26,970 k
- Unigram LM
- -24,680 k
- guanya
- Unigram LM
- distància al pitjor
- 2,71 k nats
La diferència entre els tres no és de mecànica sinó de criteri. BPE fusiona la parella més freqüent i no optimitza res. WordPiece fusiona la que més puja la versemblança del corpus sota un model unigrama. Unigram LM comença amb un vocabulari gran i elimina el que menys versemblança costa. Per comparar-los de manera justa cal, doncs, mesurar exactament allò: la versemblança del corpus sota cada vocabulari, amb cadascun segmentant com sap.
| algorisme | criteri de construcció | com segmenta | tokens | log-versemblança |
|---|---|---|---|---|
| BPE | la parella més freqüent | fusions per ordre de rang | 5.121 | -27.394 |
| WordPiece | la parella que més puja la versemblança | el prefix més llarg que hi ha (voraç) | 5.223 | -26.970 |
| Unigram LM | elimina el que menys versemblança costa | Viterbi: la segmentació de màxima versemblança | 4.716 | -24.680 |
Amb 500 tokens de vocabulari, guanya Unigram LM i perd BPE, amb 2,71 k nats de diferència sobre el mateix text. No és cosmètic: són milers de nats, i la comparació és justa perquè els tres vocabularis tenen exactament la mateixa mida i s'avaluen sobre el mateix corpus.
Que BPE perdi era previsible: és l'únic dels tres que no mira la versemblança en cap moment. La freqüència és una heurística raonable —les parelles freqüents solen ser les que més ajuden— però no és el mateix que el criteri. I que Unigram tendeixi a guanyar WordPiece té una segona raó a part del criteri: segmenta amb, que troba la millor partició de la paraula, mentre que WordPiece agafa el prefix més llarg disponible i no torna enrere. Un algorisme voraç pot triar un tros llarg i car que obliga a partir malament la resta.
4. Conseqüències pràctiques (la part divertida)# sense fórmules
4.1 Per què el model no sap comptar les erres de "strawberry"
Perquè no veu s-t-r-a-w-b-e-r-r-y, veu tres o quatre peces, per exemple ["str", "aw", "berry"] (la partició exacta depèn del tokenitzador). Preguntar-li quantes 'r' hi ha és com preguntar-te a tu quants píxels té la lletra que estàs llegint. Els models moderns ho encerten sovint perquè han memoritzat el fet o perquè escriuen la paraula lletra per lletra primer (chain-of-thought com a solució de tokenització!).
4.2 Aritmètica
Si "1234" es tokenitza com ["123","4"] i "1235" com ["12","35"], la regularitat numèrica es trenca. Per això els tokenitzadors moderns forcen dígits individuals o grups de 3 dígits amb regles explícites. És una millora d'arquitectura disfressada de detall de preprocessament.
El que el model no pot veure
Un LLM no veu lletres: veu enters. Quines coses li resulten impossibles per aquest sol fet?
El model no rep aquests caràcters: rep els seus identificadors. Els caràcters són el que nosaltres hi veiem en descodificar-los.
Tokenitzador: BPE de nivell byte amb 1.200 fusions entrenat sobre el corpus del curs, 1.456 tokens de vocabulari. Els talls concrets són els d'aquest vocabulari; amb el de GPT-4 o el de Llama serien uns altres, i el fenomen seria el mateix.
Amb pocs tokens, les paraules es parteixen més i el model «veu» més lletres.
- paraula
- strawberry
- tokens
- 6
- «r» de debò
- 3
- que el model pot veure
- 1
- diferència
- 2
- lletres per token
- 1,67
A «strawberry» hi ha 3 «r», comptades sobre el text. Però el model no rep el text: rep 6 enters, i entre ells només 1 són la lletra «r» tota sola. Les altres 2 estan amagades dins d'un token, i accedir-hi voldria dir saber com s'escriu aquell identificador — cosa que el model no té a l'entrada, sinó com a molt memoritzada als pesos.
«Preguntar-li quantes erres hi ha és com preguntar-te a tu quants píxels té la lletra que estàs llegint», diu el text. La comparació és exacta: tu tampoc no reps píxels, reps formes. Que els models moderns ho encertin sovint no vol dir que ho vegin: o bé han memoritzat el fet, o bé escriuen primer la paraula lletra per lletra —«s-t-r-a-w…», on cada lletra sí que és un token— i llavors compten. Aquesta segona estratègia és chain-of-thought com a solució de tokenització, i és una de les raons per les quals raonar en veu alta funciona.
Baixa les fusions a cent i torna a mirar: amb un tokenitzador més pobre, la paraula es parteix més i la diferència s'encongeix. El punt cec no és una propietat del model, és una propietat del vocabulari.
4.3 Multilingüisme i equitat de costos
Els vocabularis entrenats majoritàriament amb anglès fragmenten molt més altres llengües. El mateix contingut pot costar 1,5–3× més tokens en català, i molt més en llengües amb escriptures no llatines. Això és cost econòmic real, latència real i context útil menor per als parlants d'aquestes llengües. Els models recents han ampliat vocabularis (128k–256k) en part per corregir-ho.
El cost de parlar català
El mateix contingut, dit en dues llengües. Per què costa més diners en una que en l'altra?
És el control que ho explica tot. Mou-lo de 0 % a 100 % i mira la ràtio.
- anglès
- 43 tokens
- català
- 58 tokens
- ràtio català/anglès
- 1,35×
- japonès
- 195 tokens
- ràtio japonès/anglès
- 4,53×
- català al corpus
- 15 %
Els tres textos diuen el mateix. Si la tokenització fos neutra respecte de la llengua, el nombre de tokens seria semblant. No ho és, i el motiu no és cap propietat del català: és que les fusions s'aprenen del corpus, i el corpus és 85 % anglès.
| llengua | caràcters | tokens | bytes/token | × l'anglès | context útil de 128k |
|---|---|---|---|---|---|
| Anglès | 181 | 43 | 4,21 | 1,00× | 538.791 caràcters |
| Català | 167 | 58 | 2,91 | 1,35× | 368.552 caràcters |
| Japonès | 65 | 195 | 1,00 | 4,53× | 42.667 caràcters |
La columna de la dreta és la que fa mal: amb una finestra de 128.000 tokens, hi caben 538.791 caràcters d'anglès i només 368.552 de català. No és només que paguis 1,35 vegades més —a 3 dòlars el milió de tokens, cada milió de textos com aquest costa 45,00 dòlars més en català que en anglès— és que hi cap 26 % menys de document a la mateixa finestra, i que cada resposta triga 1,35 vegades més a generar-se.
I ara mou el control de dalt. Amb el corpus del tokenitzador al 100 % de català, la ràtio cau i s'inverteix: l'anglès passa a ser la llengua cara. No hi ha res d'intrínsec en cap de les dues, i això és exactament el que fa que sigui un problema de disseny i no de llengua. Els models recents han ampliat vocabularis a 128k–256k tokens en part per corregir-ho: amb més espai al vocabulari, hi caben fragments de més llengües.
El japonès queda a 4,53× i pateix un segon efecte a sobre: cada caràcter n'ocupa tres de bytes en UTF-8, de manera que fins i tot un tokenitzador de nivell byte perfectament equitatiu li cobraria tres vegades més per caràcter abans de cap fusió.
4.4 Tokens fantasma (glitch tokens)
Tokens presents al vocabulari però pràcticament absents de les dades d'entrenament (com els famosos SolidGoldMagikarp de GPT-2/3) tenen embeddings mai actualitzats i provoquen comportaments erràtics. Són un recordatori que vocabulari i corpus s'han d'entrenar sobre la mateixa distribució.
4.5 Espais i puntuació
" hola" i "hola" són tokens diferents. Aquest detall arruïna molts few-shot prompts i és una font clàssica de bugs en stop sequences i en constrained decoding.
5. Implicacions per al disseny# sense fórmules
- Mida del vocabulari: més gran = seqüències més curtes (menys cost d'atenció) però matriu d'embeddings i softmax més cares. A models grans, un vocabulari gran surt a compte; a models petits, no.
- Cost de la capa de sortida: la projecció final és . Amb i són 1.000M de paràmetres només en aquesta matriu → d'aquí el weight tying (compartir la matriu d'entrada i de sortida), habitual en models petits.
- La tokenització fixa el vocabulari per sempre: canviar-lo requereix reentrenar (o fer operacions delicades d'expansió de vocabulari amb embedding initialization).
El cost del vocabulari
Un vocabulari gran escurça les seqüències. Què costa, exactament, tenir-lo?
- atenció: 2L²d, baixa perquè L s’escurça
- capa de sortida: 2LdV, puja amb V
- on ets ara
| Cos del model (32 capes × 12d²) | 6,442 G | 86,0 % |
| Taula d'embeddings (V × d) | 524,288 M | 7,0 % |
| Projecció de sortida (d × V) | 524,288 M | 7,0 % |
| Total | 7,491 G | 100 % |
GPT-2: 50k. Llama 3: 128k. Gemma: 256k.
Comparteix la matriu d'entrada i la de sortida. Estalvia d×V paràmetres.
- paràmetres de la sortida (d×V)
- 524,29 M
- fracció del model sencer
- 14,0 %
- paràmetres totals
- 7,49 G
- compressió
- 7,16 B/token
- el document, en tokens
- 13.969
- atenció contra softmax
- 0,11×
El text diu: «amb i són 1.000M de paràmetres només en aquesta matriu». És exacte: , i aquí en tens el número 1,049 G. Però el número sol no diu si és molt o poc: el que ho diu és quina fracció del model representa.
| model | cos (capes) | embeddings + sortida | total | fracció del vocabulari |
|---|---|---|---|---|
| 0,3 B (d = 1.024) | 301,99 M | 262,14 M | 564,13 M | 46,5 % |
| 8 B (d = 4.096) | 6,44 G | 1,05 G | 7,49 G | 14,0 % |
| 70 B (d = 8.192) | 64,42 G | 2,10 G | 66,52 G | 3,2 % |
Aquí hi ha la resposta a «per què a models grans un vocabulari gran surt a compte i a models petits no». La taula del vocabulari creix com , linealment en l'amplada; el cos del model creix com , quadràticament. En un model petit, 128.000 tokens de vocabulari se'n mengen una part que ja no és negligible; en un de gran, la mateixa taula és una fracció petita i el que en treus — seqüències més curtes, i per tant menys cost quadràtic d'atenció— val molt més del que costa.
Weight tying és la resposta dels models petits: compartir la matriu d'entrada i la de sortida estalvia exactament paràmetres, que amb aquesta configuració són 524,29 M —7,0 % del model sense compartir. Activa el commutador i mira la fila «fracció del model sencer» caure a la meitat. En models grans es deixa de fer, perquè l'estalvi ja no compensa la restricció que imposa.
6. El futur: models sense tokenitzador# sense fórmules
Hi ha una línia de recerca activa per eliminar aquesta capa:
- Byte-level directe (ByT5, MegaByte): més robust, però seqüències llarguíssimes.
- Patching dinàmic (Byte Latent Transformer, 2024-2025): agrupa bytes en "patches" de mida variable segons l'entropia predita — més bytes per patch quan el text és previsible. Elimina el tokenitzador mantenint l'eficiència.
- Tokenització apresa conjuntament amb el model.
Cap ha desplaçat encara BPE en producció, però la direcció és clara: la tokenització és un hack heretat que a la llarga desapareixerà.
Patching per entropia: tokenitzar sense vocabulari
I si en comptes d'un vocabulari fix es decidissin les fronteres mentre es llegeix, segons què sorprèn?
Com més fosc, més alta l'entropia mitjana del patch. Els clars són trossos que el model podia endevinar.
- entropia predita (bits)
- llindar
- frontera de patch
Es trenca el patch quan el model deixa de saber què ve. Llindar alt, patches llargs.
Quant context mira per predir el byte següent. Al BLT això és una xarxa petita.
- bytes del text
- 122
- patches
- 33
- bytes per patch
- 3,70
- entropia mitjana
- 2,54 bits
- un BPE de 856 tokens
- 34 tokens
- reconstrueix el text
- sí
Aquesta és la promesa del text: «més bytes per patch quan el text és previsible». No és una descripció del mecanisme, és una predicció comprovable, i aquí es comprova posant els cinc textos al mateix llindar i mesurant les dues magnituds per separat: l'entropia mitjana per una banda i la mida mitjana dels patches per l'altra.
| text | entropia mitjana | patches | bytes per patch |
|---|---|---|---|
| Repetició | 2,10 bits | 24 | 2,96 |
| Del corpus | 2,54 bits | 33 | 3,70 |
| Barreja | 2,64 bits | 28 | 3,21 |
| Català nou | 2,82 bits | 31 | 3,35 |
| Xifres aleatòries | 3,92 bits | 44 | 1,34 |
La taula està ordenada per entropia creixent i la columna de la dreta baixa amb ella: com més sorprèn el text, més curts són els patches. És exactament el comportament que fa que la idea tingui sentit —el model gasta capacitat on passa alguna cosa i no on el text es pot endevinar— i és el contrari del que fa un vocabulari fix, que gasta el mateix passi el que passi.
La reconstrucció també s'hi comprova: concatenar els bytes dels patches torna el text exacte. Val la pena mirar-ho sobre els bytes i no sobre el text descodificat: una frontera de patch pot partir una «ó» pel mig, i llavors cap dels dos trossos és text vàlid tot sol encara que junts sumin el caràcter. És el mateix que passa amb els tokens de BPE de nivell byte.
El model d'entropia d'aquí són uns recomptes de bytes d'ordre 3 amb reculada; al Byte Latent Transformer és una xarxa petita que corre abans del model gran. La mecànica que decideix les fronteres és la mateixa: trencar quan la predicció es fa insegura.
7. Comprova que ho has entès#
0 de 6 resoltes
- Descriu l'algorisme BPE en cinc passos.
- Per què byte-level BPE no té mai tokens
<UNK>? - Explica tres comportaments "estranys" d'LLMs que s'expliquen per la tokenització.
- Per què el mateix text costa més diners en català que en anglès? Si el català gasta 1,6 vegades més tokens, quin percentatge del document hi cap a la mateixa finestra de context, comparat amb l'anglès?Marge acceptat: 3 %
- Quin compromís fas en triar un vocabulari de 256k en lloc de 32k?
- Reprodueix el cas de la pregunta 2: fes que el tokenitzador perdi informació.
Objectiu:Al widget de BPE, posa l'alfabet de partida a «Caràcters» i prova el text de prova dels emojis. Mira la comprovació: el text descodificat ha de deixar de coincidir amb l'original.
Vés al widget ↑nivell = per defecte
8. Recursos#
Karpathy, Let's build the GPT Tokenizer (vídeo) i
minbpe— la millor explicació pràctica que existeix.Sennrich et al. (2016), Neural Machine Translation of Rare Words with Subword Units.
Kudo (2018), Subword Regularization; Kudo & Richardson (2018), SentencePiece.
OpenAI
tiktokeni el Tokenizer interactiu per experimentar.Pagnoni et al. (2024), Byte Latent Transformer: Patches Scale Better Than Tokens.