Fundamentos

Tokenization II: BPE, passo a passo

O byte-pair encoding junta o par adjacente mais frequente, reconta e repete; acompanhe quatro merges na mão e veja por que é a lista ordenada de merges, e não o vocabulário, que torna a codificação reprodutível.

Atualizada em

01 · Conceito

Conceito

A lição 1.2 afirmou que pedaços de subpalavra são aprendidos de um corpus e deixou o aprendizado sem explicação. Esta lição faz isso na mão, com um corpus pequeno o bastante para contar no papel, porque o algoritmo é genuinamente simples e a parte interessante é o que acontece entre os merges.

Tome um corpus com três palavras nestas frequências: low cinco vezes, lower duas e lowest três. Divida cada palavra em caracteres e acrescente um marcador de fim de palavra, escrito aqui como um sublinhado para que um pedaço que encerra a palavra seja distinguível do mesmo pedaço no meio dela. O corpus agora é l o w _ com contagem 5, l o w e r _ com 2 e l o w e s t _ com 3.

Conte todo par adjacente, ponderando pela frequência da palavra. O par l o aparece nas três palavras, dando 5+2+3=105 + 2 + 3 = 10. O par o w dá 10 do mesmo jeito. O par w _ aparece só em low, dando 5. O par w e aparece em lower e lowest, dando 5. Depois e r dá 2, r _ dá 2, e s dá 3, s t dá 3 e t _ dá 3. Dois pares empatam no topo, então a regra de desempate da implementação decide; fique com l o.

  1. l o w _×5
  2. l o w e r _×2
  3. l o w e s t _×3
  4. par vencedor: l + o5 + 2 + 3 = 10

Cada palavra é dividida em caracteres com um marcador de fim de palavra. Contando pares adjacentes, l+o e o+w empatam em 10; o desempate escolhe l+o.

  1. lo w _×5
  2. lo w e r _×2
  3. lo w e s t _×3
  4. par vencedor: lo + w10

l+o vira lo em todo lugar. Recount: o par l+o não existe mais em lugar nenhum, e lo+w agora vence sozinho com 10.

  1. low _×5
  2. low e r _×2
  3. low e s t _×3
  4. empate: low + _ e low + e5 e 5

O vocabulário ganha a peça low. Recount de novo: low+_ ocorre 5 vezes e low+e ocorre 2 + 3 = 5, um empate.

  1. low_a palavra isolada
  2. loweradical de lower, lowest
  3. lista de merges, em ordemisto, e não o vocabulário, é o que a codificação repete

Após quatro merges, o algoritmo encontrou algo que parece um morfema — por uma razão puramente estatística. Ele não tem conceito de morfema; aquela sequência apenas continuou adjacente a si mesma.

Quatro merges, contados à mãoUm corpus de três palavras: low ×5, lower ×2, lowest ×3. Depois de cada merge as contagens são refeitas, porque unir destrói vizinhos antigos e cria novos — esse recount é a etapa que as pessoas pulam.

Funda esse par em toda parte. O corpus vira lo w _ em 5, lo w e r _ em 2 e lo w e s t _ em 3. Aqui está o passo que as pessoas pulam: as contagens precisam ser recalculadas. O par l o não existe mais em lugar nenhum, e uma unidade nova lo apareceu com vizinhos novos. Recontando, lo w dá 10, que agora vence sozinho. Funda esse par e o corpus vira low _ em 5, low e r _ em 2, low e s t _ em 3, com o vocabulário tendo ganhado o pedaço low.

Reconte de novo. Agora low _ ocorre 5 vezes e low e ocorre 2+3=52 + 3 = 5 vezes, empatados, com e s, s t e t _ em 3 cada e e r, r _ em 2. Suponha que o desempate escolha low _, produzindo uma unidade única para a palavra isolada low. O quarto merge então pega low e, dando o radical compartilhado de lower e lowest. Quatro merges depois, o algoritmo descobriu por conta própria algo que se parece com um morfema, e descobriu por uma razão puramente estatística: aquela string vivia sendo adjacente a si mesma.

Toda decisão acima é gulosa. O algoritmo seleciona o melhor par sob a segmentação atual, nunca reconsidera e nunca planeja rumo a um vocabulário globalmente ótimo. O desempate, a representação das fronteiras de palavra, a normalização aplicada antes e a escolha das unidades base são todas decisões de implementação, e é por isso que duas ferramentas que dizem fazer BPE não precisam produzir tokenizers idênticos.

Agora a distinção que importa em produção. O treino aprende um vocabulário e uma lista ordenada de regras de merge. A codificação aplica essa lista fixa. Uma leitura errada comum é achar que a codificação funciona varrendo o vocabulário atrás da entrada mais longa que casa, como faria uma consulta a dicionário. Não funciona, e a diferença é observável. A codificação aplica merges na ordem de rank aprendida: divide em unidades base e depois aplica repetidamente o merge de rank mais alto que esteja aplicável no momento. Um pedaço longo pode estar no vocabulário e ainda assim nunca ser produzido para uma dada entrada, porque a sequência de merges que o construiria não é alcançável a partir do estado intermediário daquela entrada. Publique um modelo só com o vocabulário e sem os ranks de merge e o tokenizer dele se torna irreprodutível, ainda que todos os pedaços estejam presentes.

A codificação também nunca reconta nada a partir do seu prompt. Se recontasse, a mesma palavra poderia tokenizar diferente na terça-feira, e cada id endereça uma linha de embedding que aprendeu seu valor sob um mapeamento específico. A lista de merges faz parte do contrato do modelo, exatamente como a lição 1.2 argumentou para o vocabulário.

A frequência cria eficiência e viés no mesmo movimento. Strings comuns no corpus de treino viram tokens únicos e consomem uma posição; strings raras ali continuam sendo cadeias longas, por mais ordinárias que sejam para quem as fala. Maiúsculas, espaços em branco e normalização mudam todos quais pares estavam disponíveis para fundir. O algoritmo não tem conceito de morfema. Às vezes ele os encontra, puramente porque uma unidade significativa tende a ser uma unidade reutilizável.

O tamanho do vocabulário é a troca que governa tudo. Mais merges encurtam as sequências comuns mas aumentam a tabela de embeddings e a projeção de saída, o que para o Qwen3.8-27B significa 5120 números por linha, duas vezes, já que suas matrizes de entrada e de saída são separadas. Menos merges encolhem essas matrizes e alongam toda sequência, elevando o trabalho de attention e de decodificação. A lição 5.3 revisita a escolha pelo lado do treino; não há razão universal de tokens por palavra a que apelar.

A imagem que fica é uma escada de pedaços reutilizáveis. Comece com unidades capazes de soletrar qualquer string Unicode normalizada válida, promova a combinação adjacente mais frequente um degrau por vez e mantenha um registro numerado das promoções para que a subida possa ser repetida exatamente. A escada comprime padrões de superfície. O que esses pedaços significam continua sendo, inteiramente, problema da rede neural.

02 · Analogia

Analogia

Uma gráfica começa com um carimbo por letra. Os funcionários vivem pondo t ao lado de h, então alguém talha um carimbo th. Depois th passa a cair sempre antes de e, e a gráfica talha um carimbo the. Cada carimbo novo encurta os trabalhos comuns enquanto toda letra original continua na gaveta para palavras incomuns. E o crucial: a gráfica mantém um registro numerado de qual carimbo foi talhado quando, porque um trabalho precisa ser composto amanhã do mesmo jeito que hoje, e o conteúdo da gaveta sozinho não determinaria isso.

03 · Explique de volta

Explique de volta

Acompanhe um merge de BPE com contagens reais e depois explique por que codificar uma string nova exige a lista ordenada de merges, e não apenas o vocabulário final.

Mínimo: 80 caracteres e 15 palavras. Seu texto fica somente neste navegador.

Aguardando sua explicação.

Comparar com uma resposta-modelo

O treino parte de unidades base e de um marcador de fim de palavra, conta todo par adjacente sobre o corpus, funde o par vencedor em toda parte e reconta, porque o merge destrói vizinhanças antigas e cria novas. Com low aparecendo cinco vezes, lower duas e lowest três, o par l mais o ocorre dez vezes e vence; toda ocorrência vira lo, e a contagem seguinte encontra lo mais w em dez. Codificar uma string nova não reconta nada. Aplica os merges aprendidos na ordem de rank em que foram aprendidos, o que não é o mesmo que casar gulosamente a entrada mais longa do vocabulário final: pode existir uma entrada longa que a sequência de merges nunca construiria para uma dada entrada. É por isso que um tokenizer publica uma lista de merges e não só uma lista de pedaços.

04 · Teste seu entendimento

Teste seu entendimento

01No corpus em que low aparece 5 vezes, lower 2 e lowest 3, o primeiro merge junta l e o. Qual é a contagem do par vencedor na segunda rodada?
Resposta e explicação

10, para o par lo seguido de w — Depois do merge, as três palavras começam com lo w, então lo mais w ocorre 5 + 2 + 3 = 10 vezes. O par l mais o não existe mais em lugar nenhum, e é por isso que as contagens precisam ser refeitas após cada merge.

02Tokenizar o prompt de um usuário aprende merges novos?
Resposta e explicação

Não, aplica os merges fixos aprendidos na ordem em que foram aprendidos — Mudar a segmentação na inferência mudaria quais ids aparecem, e cada id endereça uma linha de embedding que aprendeu seu valor sob o mapeamento original.

03A lição 1.2 disse que o tokenizer do Qwen3.8-27B é byte-level. O que isso garante sobre o alfabeto base do BPE aqui?
Resposta e explicação

A base derivada de bytes representa todo byte UTF-8 de texto Unicode normalizado válido — O caminho ByteLevel+BPE publicado não precisa de token desconhecido para texto Unicode válido após normalização; strings incomuns ainda podem se expandir em muitos pedaços derivados de bytes.

Conclua o teach-back e acerte o quiz para finalizar a aula.

◎ · Marcador de evidência

Fontes

  1. Rico Sennrich, Barry Haddow e Alexandra Birch (2016). Neural Machine Translation of Rare Words with Subword Units.
  2. Qwen Team (2026). Qwen3.8-27B Model Card.