Tutorial de Transformer
O componente TTransformer implementa a arquitetura transformer completa descrita no artigo seminal "Attention Is All You Need" (Vaswani et al., 2017). Ele permite carregar pesos de modelos pre-treinados, executar inferencia, fazer fine-tune com dados customizados e ate treinar transformers pequenos do zero — tudo a partir de codigo xBase Harbour.
Exemplos completos e executaveis estao na pasta samples/projects/transformer/
com 7 exemplos cobrindo todos os aspectos do componente transformer.
Projetos de Exemplo
| # | Projeto | Descricao |
|---|---|---|
| 1 | Attention Vis | Visualize os pesos de self-attention para uma frase de entrada. |
| 2 | Text Generator | Carregue um modelo pre-treinado e gere texto a partir de um prompt. |
| 3 | Train from Scratch | Treine um transformer pequeno em um conjunto de dados toy (tarefa de copia). |
| 4 | Tokenizer Explorer | Inspeccione tokenizacao, IDs de tokens e vocabulario. |
| 5 | Sentiment Analyzer | Fine-tune de um transformer para classificacao positivo/negativo. |
| 6 | Translator | Traducao sequencia-a-sequencia (ex: Ingles para Espanhol). |
| 7 | Attention Walkthrough | Passo a passo da arquitetura "Attention Is All You Need". |
Arquitetura do Transformer
Propriedades
| Propriedade | Tipo | Padrao | Descricao |
|---|---|---|---|
nLayers | Numerico | 6 | Numero de camadas encoder/decoder na pilha transformer. |
nHeads | Numerico | 8 | Numero de cabecos de atencao por camada. Deve dividir nEmbedDim uniformemente. |
nEmbedDim | Numerico | 512 | Dimensao do embedding (d_model). Largura central do transformer. |
nFFDim | Numerico | 2048 | Dimensao interna da rede feed-forward (tipicamente 4x nEmbedDim). |
nVocabSize | Numerico | 50257 | Tamanho do vocabulario. Deve corresponder ao vocabulario do tokenizer. |
nMaxSeqLen | Numerico | 512 | Tamanho maximo da sequencia de entrada/saida em tokens. |
nDropout | Numerico | 0.1 | Taxa de dropout aplicada nas saidas de atencao e FFN (0 = desabilitado). |
cWeightsFile | String | "" | Caminho para arquivo de pesos pre-treinados (formato GGUF). Defina antes de carregar. |
lCausal | Logico | .T. | Usar mascara causal (decoder). Defina como .F. para modo encoder-only ou bidirecional. |
Eventos
| Evento | Parametros | Descricao |
|---|---|---|
OnAttention | aWeights, nLayer, nHead | Acionado durante o passe forward com matrizes de peso de atencao. Use para visualizacao e analise. |
OnGenerate | cToken, nStep | Acionado para cada token gerado durante a inferencia. Permite saida em streaming. |
OnTrainStep | nStep, nLoss, nBatch | Acionado apos cada etapa de treinamento com o valor de loss atual. Use para exibir progresso. |
OnLoss | nLoss | Acionado quando o valor de loss e calculado durante o passe forward. Use para monitoramento e parada antecipada. |
Exemplo 1: Carregar um Modelo Pre-Treinado
#include "hbbuilder.ch" function Main() local oTransformer, cOutput DEFINE TRANSFORMER oTransformer ; MODEL "models/tinyllama-1.1b-chat.Q4_K_M.gguf" ; CONTEXT 2048 ; GPU_LAYERS 0 if .not. oTransformer:lLoaded ? "Falha ao carregar modelo:", oTransformer:cError return nil endif // Gerar texto a partir de um prompt cOutput := oTransformer:Generate( ; "Era uma vez", ; // prompt 128 ) // max tokens ? cOutput return nil
Exemplo 2: Geracao de Tokens em Streaming
static function StreamExample() local oTransformer DEFINE TRANSFORMER oTransformer ; MODEL "models/phi3-mini.Q4_K_M.gguf" // Hook no evento OnGenerate para streaming oTransformer:OnGenerate := { |cToken, nStep| ; QOut( cToken ) } oTransformer:GenerateStream( ; "Explique a arquitetura transformer", ; 256 ) return nil
Exemplo 3: Visualizacao de Atencao
static function AttentionVis() local oTransformer, oForm, oChart local aAttentionMaps := {} DEFINE TRANSFORMER oTransformer ; MODEL "models/tinyllama-1.1b.Q4_K_M.gguf" // Capturar pesos de atencao via evento OnAttention oTransformer:OnAttention := ; { |aW, nL, nH| AAdd( aAttentionMaps, ; { nL, nH, aW } ) } // Executar um passe forward oTransformer:Forward( "The cat sat on the mat" ) // Agora aAttentionMaps contem matrizes de pesos // para cada camada e cabeco - renderizar como heatmap RenderAttentionHeatmap( aAttentionMaps ) return nil
Exemplo 4: Treinamento do Zero
static function TrainExample() local oTransformer local aInputs := { "hello", "world", "test" } local aTargets := { "hello", "world", "test" } // tarefa de copia DEFINE TRANSFORMER oTransformer ; LAYERS 2 ; HEADS 4 ; EMBED_DIM 128 ; FF_DIM 256 ; VOCAB_SIZE 1000 ; MAX_SEQ_LEN 32 ; DROPOUT 0.1 // Monitorar progresso do treinamento oTransformer:OnTrainStep := ; { |nStep, nLoss, nBatch| ; QOut( "Step:", nStep, "Loss:", nLoss ) } oTransformer:OnLoss := ; { |nLoss| ; if nLoss < 0.01 ; QOut( "Convergiu!" ) ; endif } // Treinar por 1000 steps oTransformer:Train( aInputs, aTargets, ; 1000, // steps 0.001 ) // taxa de aprendizado return nil
Detalhes da Arquitetura
Mecanismo de Atencao
Cada cabeco de atencao computa a atencao padrao de produto escalar escalonado:
Attention(Q, K, V) = softmax(Q * K^T / sqrt(d_k)) * V
O mecanismo multi-head executa nHeads computacoes de atencao paralelas e
concatena os resultados, depois aplica uma projecao linear.
Mascaramento Causal
Quando lCausal e .T. (o padrao), o transformer aplica uma
mascara causal (triangular) que impede cada posicao de atender a posicoes futuras.
Isso e essencial para geracao de texto autorregressiva. Defina lCausal := .F. para
tarefas bidirecionais como classificacao ou modelagem de linguagem mascarada.
Rede Feed-Forward
Cada camada contem uma rede feed-forward posicional:
FFN(x) = max(0, x * W1 + b1) * W2 + b2
onde a dimensao interna e nFFDim (tipicamente 4x a dimensao de embedding).
Para inferencia com modelos pre-treinados, defina GPU_LAYERS para um valor > 0 se
voce tiver uma GPU. Isso descarrega computacao para a GPU e acelera significativamente
a geracao. Para maquinas apenas com CPU, um modelo quantizado (Q4_K_M) com nLayers = 2–4
oferece um bom equilibrio entre qualidade e velocidade.
Abra qualquer um dos 7 projetos de exemplo em samples/projects/transformer/ para
ver implementacoes completas e executaveis de cada padrao descrito neste tutorial.