Tokenização, Padding e Batch no PyTorch | Text Generation | I.A
- Tokenização, Padding e Batch no PyTorch | Text Generation | I.A
Link para o código: 🔗 Clique aqui
Objetivo
Converter textos em números e prepará-los para processamento em lote (batch) por modelos de linguagem, garantindo formato e tamanho adequados.
Tokenização
O que é tokenização
Tokenização é o processo de converter texto em números que o modelo consegue entender.
O texto é dividido em tokens (palavras, partes de palavras ou símbolos), e cada token recebe um ID numérico de acordo com o vocabulário do modelo.
Exemplo:
"Olá, tudo bem?"
→ ["Olá", ",", "tudo", "bem", "?"]
→ [101, 345, 67, 890, 32]
Tokens especiais em LLMs
| Token | Significado |
|---|---|
| BOS | Beginning Of Sequence (início do texto) |
| EOS | End Of Sequence (fim do texto) |
| PAD | Padding (preenchimento) |
| UNK | Token desconhecido |
| CLS / SEP | Usados em modelos como BERT |
👉 GPT-2 não tem PAD por padrão.
Saídas da tokenização
Após tokenizar, cada texto gera principalmente:
-
input_idsSequência de números que representa o texto. -
attention_maskIndica quais posições devem ser consideradas pelo modelo (1) e quais são apenas preenchimento (0).
Exemplo:
input_ids: [101, 345, 67, 890, 32]
attention_mask: [ 1, 1, 1, 1, 1]
Problema dos tamanhos diferentes
Cada texto pode ter um número diferente de tokens:
Texto A → [101, 345, 67]
Texto B → [101, 89]
Modelos não conseguem processar sequências de tamanhos diferentes no mesmo batch.
Padding
O que é padding
Padding é o processo de preencher sequências menores com um valor especial para que todas tenham o mesmo comprimento.
Exemplo:
[101, 345, 67]
[101, 89, 0]
O valor 0 (ou eos_token_id) é ignorado pelo modelo usando a attention_mask.
Funções Importantes
pad_sequence
Usada quando as sequências têm tamanhos diferentes.
from torch.nn.utils.rnn import pad_sequence
input_ids = pad_sequence(
input_ids,
batch_first=True,
padding_value=tokenizer.eos_token_id
)
attention_masks = pad_sequence(
attention_masks,
batch_first=True,
padding_value=0
)
torch.stack
Usada somente quando todas as sequências já têm o mesmo tamanho.
input_ids = torch.stack(input_ids)
attention_masks = torch.stack(attention_masks)
Regra Fundamental
❌ Nunca use
torch.stackantes depad_sequence
Use apenas uma abordagem:
| Situação | Função correta |
|---|---|
| Sequências com tamanhos diferentes | pad_sequence |
| Sequências com mesmo tamanho | torch.stack |
Boas Práticas (Recomendado)
Sempre que possível, deixe o tokenizer cuidar de tudo:
tokenized = tokenizer(
texts,
padding=True,
truncation=True,
return_tensors="pt"
)
input_ids = tokenized["input_ids"]
attention_masks = tokenized["attention_mask"]
Resumo Final
- Texto → tokens → números (tokenização)
- Textos têm tamanhos diferentes
- Padding iguala os tamanhos
pad_sequenceajustatorch.stackapenas junta- Nunca use os dois juntos