Esta é uma tradução automática; o artigo original está escrito em inglês. Ler o original

Porque é que um modelo de linguagem tem dificuldade em contar as letras de uma palavra

A white paneled robot counts on its fingers while blank glowing jigsaw pieces float in front of it, fusing into fewer and larger pieces.

A palavra "strawberry" chega ao modelo em três partes — str, aw, berry. As letras desapareceram antes de ele ter lido seja o que for.

WHAT YOU TYPEstrawberry3 × rWHAT THE MODEL RECEIVESstrawberry3 OPAQUE IDs
Envia letras. O modelo recebe três IDs opacos. Os «r» nunca estiveram no input que viu.

Pergunte a um modelo de linguagem quantas vezes a letra «r» aparece em «strawberry» e é bem provável que ele responda duas. Isto é tratado como prova de alguma deficiência profunda. Contudo, é mais semelhante a pedir a alguém que conte as pinceladas de uma palavra que apenas ouviu pronunciar.

O que o modelo realmente recebe

Antes de qualquer modelo ver texto, o texto é dividido em tokens. Não em letras, não em palavras — em blocos escolhidos por um algoritmo que analisou um grande corpus e fundiu os pares adjacentes que ocorriam com maior frequência, repetidamente, até obter um vocabulário de algumas dezenas de milhares de partes.

As palavras comuns acabam por formar um único token. As mais raras são divididas, e o local onde recaem as divisões é determinado por estatísticas do corpus, e não pelo significado ou pela ortografia. "strawberry" pode chegar em duas ou três partes, e a perspetiva do modelo sobre a palavra é a de símbolos atómicos — cada um sendo um índice arbitrário num vocabulário, sem mais estrutura interna disponível para o modelo do que a que tem um número de porta.

Portanto, as letras não estão genuinamente lá. Um modelo pode aprender factos sobre ortografia — que determinados tokens tendem a ocorrer conjuntamente com certas afirmações sobre letras —, mas está a raciocinar a partir de relatos indiretos sobre a sua própria entrada e não a partir da própria entrada. Pode ver a divisão a acontecer no Tokenizer.

O que mais isto explica

Aritmética com números grandes. Os números também são tokenizados, e nem sempre dígito a dígito. Um número pode ser dividido em partes que atravessam as posições decimais, de tal modo que um modelo a fazer aritmética em colunas trabalha com partes que não se alinham com as colunas. O desempenho que se degrada acentuadamente com o número de dígitos é uma pista de que o problema é de representação.

Rimas, anagramas, acrósticos. Todas as tarefas definidas sobre letras e não sobre o significado embatem na mesma barreira.

Custos e limites de contexto noutras línguas que não o inglês. Os tokenizadores são treinados em corpora maioritariamente em inglês, pelo que o inglês obtém tokens eficientes e outras línguas ficam fragmentadas em mais partes por palavra. A mesma frase numa língua menos representada pode consumir várias vezes mais tokens, o que significa que custa mais a processar e consome mais de uma janela de contexto fixa. Trata-se de uma questão de equidade escondida num passo de pré-processamento.

Os tokens não são o único lugar onde reside a surpresa

O significado é geométrico. As palavras tornam-se vetores, e a proximidade nesse espaço é aprendida através da coocorrência — o que aparece perto do quê. É por isso que os modelos captam tão bem as associações e herdam os desvios do texto em que foram treinados: se uma palavra ocorre perto de certas outras palavras no corpus, ficará perto delas no espaço, e nada no mecanismo distingue um facto de um estereótipo. A ferramenta Token Embeddings constrói uma versão reduzida desse espaço para que possa ver de que é feita a geometria.

O resultado é amostrado, não escolhido. Um modelo produz uma distribuição de probabilidade sobre o próximo token, e algo tem de escolher um. Se baixar a temperatura, ele escolhe sempre a opção mais provável, tornando-se repetitivo e previsível. Se a aumentar, escolhe opções de baixa probabilidade com mais frequência, tornando-se inventivo e não fiável. Grande parte do que é descrito como o modelo ser «criativo» ou estar a «alucinar» é apenas um parâmetro de amostragem. O Temperature Sampling torna a distribuição e a escolha visíveis lado a lado.

Por que razão vale a pena saber isto

Converte um mistério numa especificação. «O modelo não é fiável» não permite tomar medidas práticas. «O modelo não consegue ver letras, por isso encaminhe as tarefas de ortografia e contagem de carateres para código» já permite. O mesmo se aplica a «esta língua custa três vezes mais tokens, por isso planeie o orçamento em conformidade» e a «este resultado foi amostrado a uma temperatura que não produzirá resultados reprodutíveis».

Quase todas as decisões práticas sobre o bom uso destes sistemas decorrem de saber de que camada provém um determinado comportamento — o tokenizador, a geometria dos embeddings ou o amostrador. Nenhum dos três é inteligência, e todos os três são inspecionáveis.

Como é construído o vocabulário

O método habitual é a codificação por pares de bytes (byte pair encoding), e é mais simples do que a sua reputação sugere. Começa-se com cada caráter como o seu próprio token. Contam-se todos os pares adjacentes ao longo do corpus, encontra-se o par mais frequente e funde-se num único novo token. Repete-se o processo algumas dezenas de milhares de vezes.

O que surge não é uma análise linguística. É uma classificação por frequência. As palavras comuns em inglês sobrevivem inteiras porque eram frequentes no corpus; a morfologia só é captada onde por acaso coincide com a frequência. O tokenizador não tem qualquer noção de que "running" contém "run" — só o representará dessa forma se essa divisão tiver vencido a contagem.

Isto tem uma consequência que vale a pena expor de forma clara: o vocabulário é um fóssil de um corpus específico num momento específico. Se alterar o texto de treino, as divisões mudam. Dois modelos com tokenizadores diferentes não discordam apenas quanto ao resultado; discordam quanto ao que a entrada é.

Por que razão não é simples de resolver

A resposta óbvia é fornecer carateres ao modelo em vez disso. Alguns modelos fazem-no, mas essa troca tem um custo.

Os tokens existem para encurtar a sequência. Uma página em inglês tem talvez 250 tokens ou 1 200 carateres, e o custo do mecanismo de atenção cresce com o quadrado do comprimento da sequência — por isso, trabalhar em carateres custa aproximadamente vinte vezes mais capacidade computacional para a mesma passagem. A tokenização é um passo de compressão e está sujeita exatamente ao mesmo compromisso abordado no artigo sobre compressão: obtêm-se sequências mais curtas descartando o acesso à estrutura abaixo do token.

Assim, trata-se de uma troca deliberada da visibilidade ao nível dos carateres pelo comprimento da sequência, feita antes de o modelo ver seja o que for, e os seus custos incidem precisely onde o pormenor ao nível dos carateres era o objetivo principal.

Um truque de compressão de 1994

O esquema de divisão tem uma história invulgar. A codificação por pares de bytes (byte pair encoding) foi publicada por Philip Gage em 1994 como um algoritmo de compressão de dados, numa revista de programação, para reduzir o tamanho de ficheiros. A sua regra consistia em encontrar o par adjacente de bytes mais comum e substituí-lo por um byte que não estivesse em uso, repetindo o processo a seguir.

Em 2016, Sennrich, Haddow e Birch adaptaram-no para a tradução automática, não para comprimir nada, mas para construir um vocabulário capaz de representar palavras raras como partes em vez de desistir delas.

Deste modo, um truque de compressão com trinta anos, concebido quando a preocupação era o espaço em disco, decide aquilo que os maiores modelos atuais conseguem percetar.