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 Didaticos

Exemplos completos e executaveis estao na pasta samples/projects/transformer/ com 7 exemplos cobrindo todos os aspectos do componente transformer.

Projetos de Exemplo

#ProjetoDescricao
1Attention VisVisualize os pesos de self-attention para uma frase de entrada.
2Text GeneratorCarregue um modelo pre-treinado e gere texto a partir de um prompt.
3Train from ScratchTreine um transformer pequeno em um conjunto de dados toy (tarefa de copia).
4Tokenizer ExplorerInspeccione tokenizacao, IDs de tokens e vocabulario.
5Sentiment AnalyzerFine-tune de um transformer para classificacao positivo/negativo.
6TranslatorTraducao sequencia-a-sequencia (ex: Ingles para Espanhol).
7Attention WalkthroughPasso a passo da arquitetura "Attention Is All You Need".

Arquitetura do Transformer

graph LR A["Texto de Entrada"] --> B["Tokenizer"] B --> C["Embedding +\nCodificacao Posicional"] C --> D["Self-Attention\nMulti-Head"] D --> E["Rede\nFeed-Forward"] E --> F["Add & Norm\n(Residual)"] F --> G["Repetir N vezes\n(nLayers)"] G --> H["Linear +\nSoftmax"] H --> I["Probabilidades\nde Saida"] style D fill:#58a6ff,stroke:#388bfd,color:#0d1117 style E fill:#58a6ff,stroke:#388bfd,color:#0d1117 style G fill:#d2a8ff,stroke:#bc8cff,color:#0d1117

Propriedades

PropriedadeTipoPadraoDescricao
nLayersNumerico6Numero de camadas encoder/decoder na pilha transformer.
nHeadsNumerico8Numero de cabecos de atencao por camada. Deve dividir nEmbedDim uniformemente.
nEmbedDimNumerico512Dimensao do embedding (d_model). Largura central do transformer.
nFFDimNumerico2048Dimensao interna da rede feed-forward (tipicamente 4x nEmbedDim).
nVocabSizeNumerico50257Tamanho do vocabulario. Deve corresponder ao vocabulario do tokenizer.
nMaxSeqLenNumerico512Tamanho maximo da sequencia de entrada/saida em tokens.
nDropoutNumerico0.1Taxa de dropout aplicada nas saidas de atencao e FFN (0 = desabilitado).
cWeightsFileString""Caminho para arquivo de pesos pre-treinados (formato GGUF). Defina antes de carregar.
lCausalLogico.T.Usar mascara causal (decoder). Defina como .F. para modo encoder-only ou bidirecional.

Eventos

EventoParametrosDescricao
OnAttentionaWeights, nLayer, nHeadAcionado durante o passe forward com matrizes de peso de atencao. Use para visualizacao e analise.
OnGeneratecToken, nStepAcionado para cada token gerado durante a inferencia. Permite saida em streaming.
OnTrainStepnStep, nLoss, nBatchAcionado apos cada etapa de treinamento com o valor de loss atual. Use para exibir progresso.
OnLossnLossAcionado 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).

Dicas de Desempenho

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.

Explore os Exemplos

Abra qualquer um dos 7 projetos de exemplo em samples/projects/transformer/ para ver implementacoes completas e executaveis de cada padrao descrito neste tutorial.

Nesta Página

Primeiros Passos Paleta de Componentes Recursos do IDE Tutoriais Referencia Plataformas Projetos de Exemplo Arquitetura do Transformer Propriedades Eventos Exemplo 1: Carregar um Modelo Pre-Treinado Exemplo 2: Geracao de Tokens em Streaming Exemplo 3: Visualizacao de Atencao Exemplo 4: Treinamento do Zero Detalhes da Arquitetura Mecanismo de Atencao Mascaramento Causal Rede Feed-Forward