Aprendizagem pessoal com IA
e orientação prática

Tokenização

Olá a todos, hoje vamos explorar a técnica de particípios no Large Language Modelling (LLM). Infelizmente, a desambiguação é uma parte mais complexa e complicada dos principais LLMs atuais, mas compreender alguns de seus detalhes é muito necessário, pois muitas pessoas culpam as redes neurais ou outros motivos aparentemente misteriosos por algumas das deficiências dos LLMs, quando, na verdade, a fonte desses problemas costuma ser as técnicas de desambiguação.
Texto original:https://github.com/karpathy/minbpe

Anteriormente: segmentação baseada em caracteres

Então, o que é um subtexto? Na verdade, em nosso vídeo anterior [Criação de um GPT do zeroEm [ ], falamos sobre a palavra fracionária, mas essa é apenas uma forma muito simples e primitiva do nível de caractere. Se você assistir ao vídeo de [Colaboração com o Google], você verá que estamos usando nossos dados de treinamento ([obras de Shakespeare], que é apenas uma string muito longa em Python:
Primeiro cidadão: Antes de continuarmos, por favor, ouça-me.
Todos: Vá em frente, diga.
First Citizen: Vocês estão determinados a morrer em vez de passar fome?
Todos: Determinados. Determinado.
Primeiro cidadão: Antes de tudo, você sabe que Gaius Marcius é o inimigo número um do povo.
Todos: Nós sabemos, nós sabemos.
Mas como inserimos as sequências de caracteres no modelo de linguagem? A primeira etapa para fazer isso é construir uma tabela de vocabulário que inclua todos os caracteres diferentes que encontramos no conjunto de dados de treinamento:
``python
# Esse é o único caractere que aparece no texto
chars = sorted(list(set(text)))
vocab_size = len(chars)
print(''.join(chars))
print(vocab_size)
# !$&',-.3:;?ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
# 65
```
Imediatamente após isso, criaremos uma tabela de pesquisa para conversão entre caracteres individuais e palavras inteiras, com base no vocabulário listado acima. Essa tabela de pesquisa é, na verdade, um dicionário Python:
``python
stoi = { ch:i for i,ch in enumerate(chars) }
itos = { i:ch for i,ch in enumerate(chars) }
Codificador #: recebe uma cadeia de caracteres e gera uma lista de inteiros correspondentes.
codificar = lambda s: [stoi[c] for c in s]
Decodificador #: recebe uma lista de números inteiros e a reduz para uma string
decode = lambda l: ''.join([itos[i] for i in l])
print(encode("hii there"))
print(decode(encode("hii there")))
# [46, 47, 47, 1, 58, 46, 43, 56, 43]
# hii there
```
Depois de convertermos as sequências em números inteiros, veremos que cada número inteiro é usado como um índice em uma matriz de incorporação treinável bidimensional. Como o tamanho do vocabulário é `vocab_size=65`, essa matriz de incorporação também tem 65 linhas:
``python
class BigramLanguageModel(nn.Module).
def __init__(self, vocab_size).
super(). __init__()
self.token_embedding_table = nn.Embedding(vocab_size, n_embd)
def forward(self, idx, targets=None).
tok_emb = self.token_embedding_table(idx) # (B,T,C)
```
Aqui, o "inteiro" extrai uma linha da tabela de incorporação, que é o vetor que representa o token. Esse vetor é então alimentado no transformador como uma entrada para a etapa de tempo correspondente.

Tokenização de "blocos de caracteres" usando o algoritmo de codificação de pares de bytes (BPE)

Isso é bom o suficiente para um modelo de linguagem rudimentar em nível de caractere. Na prática, porém, os modelos de linguagem de última geração usam esquemas mais complexos para construir vocabulários de marcação. Esses esquemas não funcionam no nível do caractere, mas no nível do bloco de caracteres. Esses vocabulários de blocos de caracteres são construídos por meio de algoritmos como Byte Pair Encoding (BPE), uma abordagem que explicaremos em mais detalhes a seguir.
Voltando ao desenvolvimento histórico dessa abordagem, o artigo GPT-2 da OpenAI publicado em 2019, intitulado "Language Models as Unsupervised Multitasking Learners" (Modelos de linguagem como aprendizes multitarefas não supervisionados), levou à popularidade dos algoritmos BPE em nível de byte para a rotulagem de modelos de linguagem. Leia a Seção 2.2 desse documento sobre "Representação de entrada" para ver a descrição e a motivação para esse algoritmo. Você os verá mencionados no final desta seção:
O vocabulário foi ampliado para 50.257. Também aumentamos o tamanho do contexto de 512 para 1024 tokens e usamos um tamanho de lote maior de 512.
Lembre-se de que, na camada de atenção do Transformer, cada token é uma atenção a um número finito de tokens na sequência anterior. O documento menciona que o comprimento do contexto do modelo GPT-2 é de 1.024 tokens, o que representa uma melhoria em relação aos 512 do GPT-1. Em outras palavras, os tokens são as unidades básicas que servem de entrada para o modelo de memória linguística de longo prazo (LLM). A tokenização é o processo de conversão de strings brutas em Python em listas de tokens e vice-versa. Para dar um outro exemplo popular da onipresença dessa abstração, se você visualizar [Lhama 2O] documento, mais uma vez, pesquise por "markers" e você terá 63 menções. Por exemplo, o documento afirma que eles treinaram com dois trilhões de tokens e assim por diante.
Antes de nos aprofundarmos nos detalhes da implementação, vamos explorar brevemente por que precisamos nos aprofundar no processo de tokenização. A tokenização é o cerne de muitas das esquisitices dos LLMs, e eu recomendaria que não a considerássemos levianamente. Muitos problemas que parecem estar relacionados à estrutura das redes neurais são, na verdade, originários da tokenização. Aqui estão alguns exemplos:
  • Por que o LLM não consegue escrever as palavras corretamente?
  • Por que o LLM não consegue realizar tarefas simples de processamento de strings, como a inversão de strings?
  • Por que o LLM tem um desempenho ruim ao lidar com idiomas que não sejam o inglês (por exemplo, japonês)?
  • Por que o LLM tem um desempenho ruim ao realizar operações aritméticas simples?
  • Por que o GPT-2 tem mais dificuldade para programar em Python?
  • Por que meu LLM para de funcionar repentinamente quando encontra a string ""?
  • O que é esse aviso estranho que estou recebendo sobre "espaços à direita"?
  • Quando pergunto sobre "SolidGoldMagikarp", por que o LLM trava?
  • Por que devo preferir usar YAML em vez de JSON para interagir com LLMs?
  • Por que o LLM não é de fato um verdadeiro modelo de linguagem de ponta a ponta?
  • Qual é exatamente a causa principal do sofrimento?
Voltaremos a esses tópicos no final do vídeo.
Em seguida, vamos carregar este [Ferramentas on-line de tokenização] A vantagem dessa ferramenta on-line é que o processo de tokenização ocorre em tempo real no seu navegador da Web. Você pode inserir facilmente uma cadeia de texto na caixa de entrada e ver imediatamente o resultado da tokenização no lado direito. A parte superior da página mostra que estamos usando atualmentegpt2podemos ver que a cadeia de caracteres do exemplo está sendo dividida em 300 tokens. Esses tokens são claramente exibidos em cores diferentes:
Tokenização - 1
Por exemplo, a cadeia de caracteres "Tokenisation" é codificada como token 30642, seguido pelo token 1634. o índice do token "is" (observe que há três caracteres aqui, incluindo o espaço anterior, que é importante!) O índice do token é 318. Observe o espaço, pois ele está de fato presente na cadeia de caracteres e deve ser tokenizado junto com todos os outros caracteres, mas geralmente é omitido para fins de clareza visual. Você pode alternar a visualização de espaços na parte inferior da ferramenta. Da mesma forma, o token "at" é 379, "the" é 262 e assim por diante.
A seguir, vamos dar uma olhada em um exemplo simples de aritmética. Aqui descobrimos que os números podem ser divididos pelo tokenizador de maneiras inconsistentes. Por exemplo, o número 127 é dividido em um único token composto de três caracteres, enquanto o número 677 é dividido em dois tokens: o token " 6" (novamente, observe o espaço inicial!) e o token "77". Contamos com grandes modelos de linguagem para entender essa arbitrariedade. O modelo deve aprender, tanto em seus parâmetros quanto durante o treinamento, que os dois tokens ("6" e "77") realmente se combinam para representar o número 677. Da mesma forma, se o LLM quiser prever que o resultado dessa adição será o número 804, ele deverá emitir o número em duas etapas: primeiro, ele emite o token "8" e, em seguida, o token "04". Observe que todas essas decomposições parecem ser completamente arbitrárias. No exemplo abaixo, vemos que 1275 é decomposto em "12" e "75", 6773 é, na verdade, dois tokens "6" e "773", e 8041 é decomposto em "8" e "041".
(A ser continuado...) (TODO: a menos que encontremos uma maneira de gerar automaticamente esse conteúdo a partir de vídeos, provavelmente continuaremos com isso).
Não pode ser reproduzido sem permissão:Chefe do Círculo de Compartilhamento de IA " Tokenização

Chefe do Círculo de Compartilhamento de IA

O Chief AI Sharing Circle se concentra no aprendizado de IA, fornecendo conteúdo abrangente de aprendizado de IA, ferramentas de IA e orientação prática. Nosso objetivo é ajudar os usuários a dominar a tecnologia de IA e explorar juntos o potencial ilimitado da IA por meio de conteúdo de alta qualidade e compartilhamento de experiências práticas. Seja você um iniciante em IA ou um especialista sênior, este é o lugar ideal para adquirir conhecimento, aprimorar suas habilidades e realizar inovações.

Entre em contato conosco
pt_BRPortuguês do Brasil