Compreendendo a tokenização em PNL: um guia para iniciantes em processamento de texto
Publicados: 2024-11-26A tokenização é um componente crítico, mas muitas vezes esquecido, do processamento de linguagem natural (PNL). Neste guia, explicaremos a tokenização, seus casos de uso, prós e contras e por que ela está envolvida em quase todos os grandes modelos de linguagem (LLM).
Índice
- O que é tokenização em PNL?
- Tipos de tokenização
- Como funciona a tokenização
- Aplicativos de tokenização
- Benefícios da tokenização
- Desafios da tokenização
O que é tokenização em PNL?
A tokenização é um método de PNL que converte texto em formatos numéricos que os modelos de aprendizado de máquina (ML) podem usar. Quando você envia sua solicitação para um LLM como Claude da Anthropic, Gemini do Google ou um membro da série GPT da OpenAI, o modelo não lê diretamente o seu texto. Esses modelos só podem aceitar números como entradas, portanto o texto deve primeiro ser convertido em uma sequência de números usando um tokenizer.
Uma maneira de um tokenizer tokenizar o texto seria dividi-lo em palavras separadas e atribuir um número a cada palavra única:
“Grammarly adora gramática, ML e escrita” pode se tornar:
Cada palavra (e seu número associado) é um token. Um modelo de ML pode usar a sequência de tokens — [7.102], [37], [564], [2], [9.763], [2], [231] — para executar suas operações e produzir sua saída. Essa saída geralmente é um número, que é convertido novamente em texto usando o inverso do mesmo processo de tokenização. Na prática, essa tokenização palavra por palavra é um ótimo exemplo, mas raramente é usada na indústria por motivos que veremos mais tarde.
Uma última coisa a observar é que os tokenizadores possuem vocabulários – o conjunto completo de tokens que eles podem manipular. Um tokenizer que conhece palavras básicas em inglês, mas não nomes de empresas, pode não ter “Grammarly” como token em seu vocabulário, levando à falha na tokenização.
Tipos de tokenização
Em geral, a tokenização transforma um pedaço de texto em uma sequência de números. Embora seja natural pensar na tokenização no nível da palavra, existem muitos outros métodos de tokenização, um dos quais – tokenização de subpalavras – é o padrão do setor.
Tokenização de palavras
A tokenização de palavras é o exemplo que vimos antes, onde o texto é dividido por cada palavra e por pontuação.
O principal benefício da tokenização de palavras é que ela é fácil de entender e visualizar. No entanto, tem algumas deficiências:
- A pontuação, se presente, é anexada às palavras, como acontece com “escrita”.
- Palavras novas ou incomuns (como “Grammarly”) ocupam um token inteiro.
Como resultado, a tokenização de palavras pode criar vocabulários com centenas de milhares de tokens. O problema com vocabulários grandes é que eles tornam o treinamento e a inferência muito menos eficientes – a matriz necessária para converter entre texto e números precisaria ser enorme.
Além disso, haveria muitas palavras usadas com pouca frequência e os modelos de PNL não teriam dados de treinamento relevantes suficientes para retornar respostas precisas para essas palavras pouco frequentes. Se uma nova palavra fosse inventada amanhã, um LLM que usasse tokenização de palavras precisaria ser retreinado para incorporar essa palavra.
Tokenização de subpalavra
A tokenização de subpalavras divide o texto em pedaços menores ou iguais às palavras. Não existe um tamanho fixo para cada token; cada token (e seu comprimento) é determinado pelo processo de treinamento. A tokenização de subpalavras é o padrão da indústria para LLMs. Abaixo está um exemplo, com tokenização feita pelo tokenizer GPT-4o:
Aqui, a palavra incomum “Grammarly” é dividida em três tokens: “Gr”, “amm” e “arly”. Enquanto isso, as outras palavras são comuns o suficiente no texto para formar seus próprios tokens.
A tokenização de subpalavras permite vocabulários menores, o que significa treinamento e inferência mais eficientes e baratos. Os tokenizadores de subpalavras também podem dividir palavras raras ou novas em combinações de tokens menores existentes. Por essas razões, muitos modelos de PNL usam tokenização de subpalavras.
Tokenização de personagem
A tokenização de caracteres divide o texto em caracteres individuais. Veja como ficaria nosso exemplo:
Cada personagemúnicose torna seu próprio token. Na verdade, isso requer o menor vocabulário, pois há apenas 52 letras no alfabeto (maiúsculas e minúsculas são consideradas diferentes) e vários sinais de pontuação. Como qualquer palavra em inglês deve ser formada a partir desses caracteres, a tokenização de caracteres pode funcionar com qualquer palavra nova ou rara.
No entanto, pelos benchmarks padrão do LLM, a tokenização de caracteres não funciona tão bem quanto a tokenização de subpalavras na prática. O token da subpalavra “car” contém muito mais informações do que o token do caractere “c”, portanto, o mecanismo de atenção nos transformadores tem mais informações para funcionar.
Tokenização de frase
A tokenização de frase transforma cada frase do texto em seu próprio token. Nosso exemplo ficaria assim:
A vantagem é que cada token contém uma tonelada de informações. No entanto, existem várias desvantagens. Existem infinitas maneiras de combinar palavras para escrever frases. Portanto, o vocabulário também precisaria ser infinito.
Além disso, cada frase em si seria muito rara, já que mesmo pequenas diferenças (como “também” em vez de “e”) significariam um token diferente, apesar de terem o mesmo significado. Treinamento e inferência seriam um pesadelo. A tokenização de frases é usada em casos de uso especializados, como análise de sentimento de frases, mas, por outro lado, é rara.
Troca de tokenização: eficiência versus desempenho
Escolher a granularidade certa de tokenização para um modelo é realmente uma relação complexa entre eficiência e desempenho. Com tokens muito grandes (por exemplo, no nível da frase), o vocabulário torna-se massivo. A eficiência de treinamento do modelo cai porque a matriz para armazenar todos esses tokens é enorme. O desempenho cai porque não há dados de treinamento suficientes para que todos os tokens exclusivos aprendam relacionamentos de forma significativa.
Por outro lado, com pequenas fichas, o vocabulário torna-se pequeno. O treinamento se torna eficiente, mas o desempenho pode cair, pois cada token não contém informações suficientes para que o modelo aprenda as relações token-token.
A tokenização de subpalavras está bem no meio. Cada token possui informações suficientes para que os modelos aprendam relacionamentos, mas o vocabulário não é tão grande que o treinamento se torne ineficiente.
Como funciona a tokenização
A tokenização gira em torno do treinamento e uso de tokenizadores. Os tokenizadores convertem texto em tokens e tokens novamente em texto. Discutiremos tokenizadores de subpalavras aqui, pois eles são o tipo mais popular.
Os tokenizadores de subpalavras devem ser treinados para dividir o texto de maneira eficaz.
Por que “Grammarly” é dividido em “Gr”, “amm” e “arly”? “Gram”, “mar” e “ly” não poderiam também funcionar? Ao olho humano, definitivamente poderia, mas o tokenizador, que presumivelmente aprendeu a representação mais eficiente, pensa de forma diferente. Um algoritmo de treinamento comum (embora não usado no GPT-4o) empregado para aprender esta representação é a codificação de pares de bytes (BPE). Explicaremos o BPE na próxima seção.
Treinamento de tokenizador
Para treinar um bom tokenizador, você precisa de um grande corpus de texto para treinar. A execução do BPE neste corpus funciona da seguinte maneira:
- Divida todo o texto do corpus em caracteres individuais. Defina-os como os tokens iniciais no vocabulário.
- Mesclar os dois tokens adjacentes mais frequentemente do texto em um novo token e adicioná-lo ao vocabulário (sem excluir os tokens antigos – isso é importante).
- Repita esse processo até que não haja mais pares de tokens adjacentes de ocorrência frequente ou que o tamanho máximo do vocabulário tenha sido atingido.
Como exemplo, suponha que todo o nosso corpus de treinamento consista no texto “abc abcd”:
- O texto seria dividido em [“a”, “b”, “c”, “ ”, “a”, “b”, “c”, “d”]. Observe que a quarta entrada nessa lista é um caractere de espaço. Nosso vocabulário seria então [“a”, “b”, “c”, “ ”, “d”].
- “a” e “b” ocorrem com mais frequência um ao lado do outro no texto (empatados com “b” e “c”, mas “a” e “b” vencem em ordem alfabética). Então, nós os combinamos em um token, “ab”. O vocabulário agora se parece com [“a”, “b”, “c”, “ ”, “d”, “ab”], e o texto atualizado (com a mesclagem de token “ab” aplicada) se parece com [“ab” , “c”, “ ”, “ab”, “c”, “d”].
- Agora, “ab” e “c” ocorrem com mais frequência juntos no texto. Nós os fundimos no token “abc”. O vocabulário então se parece com [“a”, “b”, “c”, “ ”, “d”, “ab”, “abc”], e o texto atualizado se parece com [“abc”, “ ”, “abc ”, “d”].
- Terminamos o processo aqui, pois cada par de tokens adjacentes agora ocorre apenas uma vez. A fusão adicional de tokens faria com que o modelo resultante tivesse um desempenho pior em outros textos. Na prática, o limite do tamanho do vocabulário é o fator limitante.
Com nosso novo conjunto de vocabulário, podemos mapear entre texto e tokens. Mesmo textos que não vimos antes, como “táxi”, podem ser tokenizados porque não descartamos os tokens de um único caractere. Também podemos retornar números de tokens simplesmente vendo a posição do token no vocabulário.
Um bom treinamento em tokenizer requer volumes extremamente altos de dados e muita computação – mais do que a maioria das empresas pode pagar. As empresas contornam isso ignorando o treinamento de seu próprio tokenizer. Em vez disso, eles apenas usam um tokenizer pré-treinado (como o tokenizer GPT-4o vinculado acima) para economizar tempo e dinheiro com perda mínima, se houver, no desempenho do modelo.
Usando o tokenizador
Portanto, temos esse tokenizador de subpalavra treinado em um corpus massivo usando BPE. Agora, como podemos usá-lo em um novo trecho de texto?
Aplicamos as regras de mesclagem que determinamos no processo de treinamento do tokenizer. Primeiro dividimos o texto de entrada em caracteres. Em seguida, fazemos mesclagens de tokens na mesma ordem do treinamento.
Para ilustrar, usaremos um texto de entrada ligeiramente diferente de “dc abc”:
- Dividimos em caracteres [“d”, “c”, “ ”, “a”, “b”, “c”].
- A primeira mesclagem que fizemos no treinamento foi “ab”, então fazemos isso aqui: [“d”, “c”, “ ”, “ab”, “c”].
- A segunda mesclagem que fizemos foi “abc”, então fazemos isso: [“d”, “c”, “ ”, “abc”].
- Essas são as únicas regras de mesclagem que temos, então concluímos a tokenização e podemos retornar os IDs dos tokens.
Se tivermos vários IDs de token e quisermos convertê-los em texto, podemos simplesmente procurar cada ID de token na lista e retornar seu texto associado. Os LLMs fazem isso para transformar os embeddings (vetores de números que capturam osignificadodos tokens observando os tokens circundantes) com os quais trabalham de volta em texto legível por humanos.
Aplicativos de tokenização
A tokenização é sempre o primeiro passo em toda PNL. Transformar texto em formulários com os quais os modelos de ML (e computadores) possam trabalhar requer tokenização.
Tokenização em LLMs
A tokenização geralmente é a primeira e a última parte de cada chamada LLM. O texto é primeiro transformado em tokens, depois os tokens são convertidos em embeddings para capturar o significado de cada token e passados para as partes principais do modelo (os blocos transformadores). Após a execução dos blocos transformadores, os embeddings são convertidos novamente em tokens. Finalmente, o token recém-retornado é adicionado à entrada e passado de volta ao modelo, repetindo o processo novamente. LLMs usam tokenização de subpalavras para equilibrar desempenho e eficiência.
Tokenização em motores de busca
Os mecanismos de pesquisa tokenizam as consultas do usuário para padronizá-las e entender melhor a intenção do usuário. A tokenização do mecanismo de pesquisa pode envolver a divisão do texto em palavras, a remoção de palavras de preenchimento (como “o” ou “e”), a transformação de letras maiúsculas em minúsculas e o tratamento de caracteres como hífens. A tokenização de subpalavras geralmente não é necessária aqui, pois o desempenho e a eficiência dependem menos do tamanho do vocabulário.
Tokenização na tradução automática
A tokenização da tradução automática é interessante porque os idiomas de entrada e saída são diferentes. Como resultado, haverá dois tokenizadores, um para cada idioma. A tokenização de subpalavras geralmente funciona melhor, pois equilibra a compensação entre a eficiência e o desempenho do modelo. Mas algumas línguas, como o chinês, não possuem um componente linguístico menor que uma palavra. Lá, a tokenização de palavras é necessária.
Benefícios da tokenização
A tokenização é essencial para qualquer modelo de PNL. Uma boa tokenização permite que os modelos de ML funcionem de forma eficiente com texto e lidem bem com novas palavras.
A tokenização permite que os modelos trabalhem com texto
Internamente, os modelos de ML funcionam apenas com números. O algoritmo por trás dos modelos de ML depende inteiramente da computação, que por sua vez requer números para ser computada. Portanto, o texto deve ser transformado em números antes que os modelos de ML possam trabalhar com eles. Após a tokenização, técnicas como atenção ou incorporação podem ser executadas nos números.
A tokenização generaliza para texto novo e raro
Ou, mais precisamente,uma boatokenização generaliza-se para textos novos e raros. Com a tokenização de subpalavras e caracteres, novos textos podem ser decompostos em sequências de tokens existentes. Portanto, colar um artigo com palavras sem sentido no ChatGPT não fará com que ele seja quebrado (embora também possa não fornecer uma resposta muito coerente). Uma boa generalização também permite que os modelos aprendam relações entre palavras raras, com base nas relações nos subtokens.
Desafios da tokenização
A tokenização depende do corpus de treinamento e do algoritmo, portanto os resultados podem variar. Isto pode afetar as capacidades de raciocínio dos LLMs e o seu comprimento de entrada e saída.
A tokenização afeta as habilidades de raciocínio dos LLMs
Um problema fácil que muitas vezes confunde os LLMs é contar as ocorrências da letra “r” na palavra “morango”. O modelo diria incorretamente que havia dois, embora a resposta seja, na verdade, três. Este erro pode ter ocorrido parcialmente devido à tokenização. O tokenizador de subpalavra dividiu “morango” em “st”, “cru” e “berry”. Portanto, o modelo pode não ter sido capaz de conectar o “r” do token do meio aos dois “r”s do último token. O algoritmo de tokenização escolhido afeta diretamente como as palavras são tokenizadas e como cada token se relaciona com os outros.
A tokenização afeta o comprimento de entrada e saída do LLM
Os LLMs são construídos principalmente na arquitetura do transformador, que depende do mecanismo de atenção para contextualizar cada token. Entretanto, à medida que o número de tokens aumenta, o tempo necessário para atenção aumenta quadraticamente. Portanto, um texto com quatro fichas levará 16 unidades de tempo, mas um texto com oito fichas levará 64 unidades de tempo. Isso limita os LLMs a limites de entrada e saída de algumas centenas de milhares de tokens. Com tokens menores, isso pode realmente limitar a quantidade de texto que você pode alimentar no modelo, reduzindo o número de tarefas para as quais você pode usá-lo.