1. Tokenizing
Tokenizing
Tokenizing é o processo de dividir dados, como texto, em pedaços menores e gerenciáveis chamados tokens. Cada token é então atribuído a um identificador numérico único (ID). Este é um passo fundamental na preparação do texto para processamento por modelos de aprendizado de máquina, especialmente em processamento de linguagem natural (NLP).
O objetivo desta fase inicial é muito simples: Dividir a entrada em tokens (ids) de uma maneira que faça sentido.
How Tokenizing Works
Dividindo o Texto:
Tokenizer Básico: Um tokenizer simples pode dividir o texto em palavras individuais e sinais de pontuação, removendo espaços.
Exemplo: Texto:
"Hello, world!"
Tokens:["Hello", ",", "world", "!"]
Criando um Vocabulário:
Para converter tokens em IDs numéricos, um vocabulário é criado. Este vocabulário lista todos os tokens únicos (palavras e símbolos) e atribui a cada um um ID específico.
Tokens Especiais: Estes são símbolos especiais adicionados ao vocabulário para lidar com vários cenários:
[BOS]
(Início da Sequência): Indica o início de um texto.[EOS]
(Fim da Sequência): Indica o fim de um texto.[PAD]
(Preenchimento): Usado para fazer com que todas as sequências em um lote tenham o mesmo comprimento.[UNK]
(Desconhecido): Representa tokens que não estão no vocabulário.Exemplo: Se
"Hello"
é atribuído ao ID64
,","
é455
,"world"
é78
, e"!"
é467
, então:"Hello, world!"
→[64, 455, 78, 467]
Tratando Palavras Desconhecidas: Se uma palavra como
"Bye"
não está no vocabulário, ela é substituída por[UNK]
."Bye, world!"
→["[UNK]", ",", "world", "!"]
→[987, 455, 78, 467]
&#xNAN;(Assumindo que[UNK]
tem ID987
)
Advanced Tokenizing Methods
Enquanto o tokenizer básico funciona bem para textos simples, ele tem limitações, especialmente com vocabulários grandes e ao lidar com palavras novas ou raras. Métodos avançados de tokenização abordam essas questões dividindo o texto em subunidades menores ou otimizando o processo de tokenização.
Byte Pair Encoding (BPE):
Propósito: Reduz o tamanho do vocabulário e lida com palavras raras ou desconhecidas, dividindo-as em pares de bytes que ocorrem com frequência.
Como Funciona:
Começa com caracteres individuais como tokens.
Mescla iterativamente os pares de tokens mais frequentes em um único token.
Continua até que não haja mais pares frequentes que possam ser mesclados.
Benefícios:
Elimina a necessidade de um token
[UNK]
, uma vez que todas as palavras podem ser representadas combinando tokens de subpalavras existentes.Vocabulário mais eficiente e flexível.
Exemplo:
"playing"
pode ser tokenizado como["play", "ing"]
se"play"
e"ing"
forem subpalavras frequentes.
WordPiece:
Usado Por: Modelos como BERT.
Propósito: Semelhante ao BPE, divide palavras em unidades de subpalavras para lidar com palavras desconhecidas e reduzir o tamanho do vocabulário.
Como Funciona:
Começa com um vocabulário base de caracteres individuais.
Adiciona iterativamente a subpalavra mais frequente que maximiza a probabilidade dos dados de treinamento.
Usa um modelo probabilístico para decidir quais subpalavras mesclar.
Benefícios:
Equilibra entre ter um tamanho de vocabulário gerenciável e representar palavras de forma eficaz.
Lida eficientemente com palavras raras e compostas.
Exemplo:
"unhappiness"
pode ser tokenizado como["un", "happiness"]
ou["un", "happy", "ness"]
dependendo do vocabulário.
Unigram Language Model:
Usado Por: Modelos como SentencePiece.
Propósito: Usa um modelo probabilístico para determinar o conjunto mais provável de tokens de subpalavras.
Como Funciona:
Começa com um grande conjunto de tokens potenciais.
Remove iterativamente tokens que menos melhoram a probabilidade do modelo em relação aos dados de treinamento.
Finaliza um vocabulário onde cada palavra é representada pelas unidades de subpalavras mais prováveis.
Benefícios:
Flexível e pode modelar a linguagem de forma mais natural.
Muitas vezes resulta em tokenizações mais eficientes e compactas.
Exemplo:
"internationalization"
pode ser tokenizado em subpalavras menores e significativas como["international", "ization"]
.
Code Example
Vamos entender isso melhor a partir de um exemplo de código de https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb:
Referências
Last updated