Implementação do pipeline de alinhamento HHH (Helpful, Honest, Harmless) utilizando Direct Preference Optimization (DPO) sobre o modelo base TinyLlama-1.1B-Chat.
lab08-dpo/
├── hhh_dataset.jsonl # Dataset de preferências (32 pares)
├── train_dpo.py # Pipeline de treinamento DPO
├── inference_test.py # Validação pós-treinamento
├── requirements.txt # Dependências
└── README.md
O dataset hhh_dataset.jsonl contém 32 pares de preferência no formato exigido pelo DPOTrainer:
| Coluna | Descrição |
|---|---|
prompt |
Instrução ou pergunta ao modelo |
chosen |
Resposta segura, alinhada com as políticas HHH |
rejected |
Resposta prejudicial ou inadequada |
Os exemplos cobrem restrições de segurança (ataques a banco de dados, phishing, malware, acesso não autorizado) e adequação de tom corporativo (comunicados agressivos, relatórios falsificados, manipulação de métricas).
O treinamento usa dois modelos em memória, ambos carregados em quantização 4-bit NF4 para economizar VRAM:
- Modelo Ator (
model): recebe os gradientes e tem seus pesos atualizados via LoRA (rank=16). - Modelo de Referência (
ref_model): permanece congelado e serve como âncora para calcular a divergência KL entre a política treinada e a política original.
O objetivo de treinamento do DPO é maximizar a diferença de log-probabilidade entre a resposta preferida (chosen) e a resposta rejeitada (rejected), mas com uma penalidade que impede que o modelo se afaste demais do modelo de referência. A função de perda é dada por:
O parâmetro β atua como um "imposto" sobre o desvio da política de referência: ele multiplica a divergência KL implícita entre o modelo treinado (π_θ) e o modelo base congelado (π_ref). Um β muito baixo (próximo de 0) remove esse imposto — o modelo aprende a preferir respostas seguras, mas pode colapsar a fluência, esquecendo padrões linguísticos aprendidos no pré-treinamento e tornando-se repetitivo ou incoerente. Um β muito alto, por outro lado, torna o imposto tão caro que o modelo quase não se move da distribuição original, não aprendendo as preferências de alinhamento. O valor β = 0.1 representa um equilíbrio calibrado: permite que o modelo suprima respostas prejudiciais com eficácia, ao mesmo tempo em que preserva a fluência e a coerência do modelo de linguagem base — funcionando como um regularizador que mantém a identidade linguística do modelo durante o alinhamento.
pip install -r requirements.txtpython train_dpo.pyO script usa paged_adamw_32bit (otimizador com paginação para reduzir pico de VRAM) e fp16=True.
python inference_test.pyO script de validação calcula a log-probabilidade média do modelo alinhado para a resposta chosen e rejected dado cada prompt malicioso. O alinhamento é considerado bem-sucedido quando log_prob(chosen) > log_prob(rejected), comprovando que a distribuição foi deslocada a favor das respostas seguras.
| Ambiente | VRAM mínima | Tempo estimado |
|---|---|---|
| Google Colab T4 | 15 GB | ~45 min |
| Google Colab A100 | 40 GB | ~15 min |
| Kaggle P100 | 16 GB | ~50 min |
- Este Readme foi feito utilizando IA, mas foi revisado e corrigido por mim.
- inference_test.py foi feito por mim.
- train_dpo.py foi feito por IA, e eu apenas corrigi os problemas de compatibilidade com a versão atual do pytorch, além de alterar o modelo para o TinyLlama-W1.1B-Chat-v1.0, que é mais leve e compatível com o DPO.