Skip to main content

Tokenização, Padding e Batch no PyTorch | Text Generation | I.A

  • Tokenização, Padding e Batch no PyTorch | Text Generation | I.A

info

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

TokenSignificado
BOSBeginning Of Sequence (início do texto)
EOSEnd Of Sequence (fim do texto)
PADPadding (preenchimento)
UNKToken desconhecido
CLS / SEPUsados 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_ids Sequência de números que representa o texto.

  • attention_mask Indica 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.stack antes de pad_sequence

Use apenas uma abordagem:

SituaçãoFunção correta
Sequências com tamanhos diferentespad_sequence
Sequências com mesmo tamanhotorch.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_sequence ajusta
  • torch.stack apenas junta
  • Nunca use os dois juntos