Tutorial de Transformer

El componente TTransformer implementa la arquitectura de transformer completa descrita en el articulo seminario "Attention Is All You Need" (Vaswani et al., 2017). Permite cargar pesos de modelos preentrenados, ejecutar inferencia, ajustar con datos personalizados e incluso entrenar transformers pequenos desde cero — todo desde codigo Harbour xBase.

Ejemplos Didacticos

Los ejemplos completos y ejecutables estan en la carpeta samples/projects/transformer/ con 7 ejemplos que cubren cada aspecto del componente transformer.

Proyectos de Ejemplo

#ProyectoDescripcion
1Attention VisVisualiza los pesos de auto-atencion para una oracion de entrada dada.
2Text GeneratorCarga un modelo preentrenado y genera texto desde una solicitud.
3Train from ScratchEntrena un transformer pequeno en un conjunto de datos de juguete (tarea de copia).
4Tokenizer ExplorerInspecciona tokenizacion, IDs de token y vocabulario.
5Sentiment AnalyzerAjusta un transformer para clasificacion positivo/negativo.
6TranslatorTraduccion secuencia-a-secuencia (p. ej., ingles a espanol).
7Attention WalkthroughRecorrido paso a paso de la arquitectura "Attention Is All You Need".

Arquitectura del Transformer

graph LR A["Texto de Entrada"] --> B["Tokenizador"] B --> C["Incrustacion +\nCodificacion Posicional"] C --> D["Auto-Atencion\nMulti-Cabeza"] D --> E["Red\nFeed-Forward"] E --> F["Sumar y Normalizar\n(Residual)"] F --> G["Repetir N veces\n(nLayers)"] G --> H["Lineal +\nSoftmax"] H --> I["Probabilidades\nde Salida"]

Propiedades

PropiedadTipoValor por defectoDescripcion
nLayersNumerico6Numero de capas de codificador/decodificador en la pila de transformer.
nHeadsNumerico8Numero de cabezas de atencion por capa. Debe dividir nEmbedDim uniformemente.
nEmbedDimNumerico512Dimension de incrustacion (d_model). Ancho central del transformer.
nFFDimNumerico2048Dimension interna de la red feed-forward (tipicamente 4x nEmbedDim).
nVocabSizeNumerico50257Tamano del vocabulario. Debe coincidir con el vocabulario del tokenizador.
nMaxSeqLenNumerico512Longitud maxima de secuencia de entrada/salida en tokens.
nDropoutNumerico0.1Tasa de dropout aplicada a salidas de atencion y FFN (0 = desactivado).
cWeightsFileCadena""Ruta al archivo de pesos preentrenados (formato GGUF). Establecer antes de cargar.
lCausalLogico.T.Usar mascara causal (decodificador). Establecer a .F. para modo solo codificador o bidireccional.

Eventos

EventoParametrosDescripcion
OnAttentionaWeights, nLayer, nHeadSe dispara durante el paso adelante con matrices de pesos de atencion. Usar para visualizacion y analisis.
OnGeneratecToken, nStepSe dispara por cada token generado durante la inferencia. Permite salida en streaming.
OnTrainStepnStep, nLoss, nBatchSe dispara despues de cada paso de entrenamiento con el valor de perdida actual. Usar para mostrar progreso.
OnLossnLossSe dispara cuando se calcula el valor de perdida durante el paso adelante. Usar para monitoreo y parada temprana.

Ejemplo 1: Cargar un Modelo Preentrenado

#include "hbbuilder.ch"

function Main()

   local oTransformer, cSalida

   DEFINE TRANSFORMER oTransformer ;
      MODEL "models/tinyllama-1.1b-chat.Q4_K_M.gguf" ;
      CONTEXT 2048 ;
      GPU_LAYERS 0

   if .not. oTransformer:lLoaded
      ? "Error al cargar modelo:", oTransformer:cError
      return nil
   endif

   // Generar texto desde una solicitud
   cSalida := oTransformer:Generate( ;
      "Habia una vez", ;  // solicitud
      128 )                  // max tokens

   ? cSalida

return nil

Ejemplo 2: Generacion de Tokens en Streaming

static function EjemploStream()

   local oTransformer

   DEFINE TRANSFORMER oTransformer ;
      MODEL "models/phi3-mini.Q4_K_M.gguf"

   // Conectar al evento OnGenerate para streaming
   oTransformer:OnGenerate := { |cToken, nStep| ;
      QOut( cToken ) }

   oTransformer:GenerateStream( ;
      "Explica la arquitectura del transformer", ;
      256 )

return nil

Ejemplo 3: Visualizacion de Atencion

static function AtencionVis()

   local oTransformer
   local aMapasAtencion := {}

   DEFINE TRANSFORMER oTransformer ;
      MODEL "models/tinyllama-1.1b.Q4_K_M.gguf"

   // Capturar pesos de atencion via evento OnAttention
   oTransformer:OnAttention := ;
      { |aW, nL, nH| AAdd( aMapasAtencion, ;
         { nL, nH, aW } ) }

   // Ejecutar un paso adelante
   oTransformer:Forward( "El gato se sento en la alfombra" )

   // Ahora aMapasAtencion contiene matrices de pesos
   // para cada capa y cabeza - renderizar como mapa de calor
   RenderizarMapaCalorAtencion( aMapasAtencion )

return nil

Ejemplo 4: Entrenar desde Cero

static function EjemploEntrenar()

   local oTransformer
   local aEntradas  := { "hola", "mundo", "prueba" }
   local aObjetivos := { "hola", "mundo", "prueba" }  // tarea 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

   // Monitorear progreso del entrenamiento
   oTransformer:OnTrainStep := ;
      { |nStep, nLoss, nBatch| ;
         QOut( "Paso:", nStep, "Perdida:", nLoss ) }

   oTransformer:OnLoss := ;
      { |nLoss| ;
         if nLoss < 0.01 ;
            QOut( "¡Convergido!" ) ;
         endif }

   // Entrenar por 1000 pasos
   oTransformer:Train( aEntradas, aObjetivos, ;
      1000,  // pasos
      0.001 ) // tasa de aprendizaje

return nil

Detalles de Arquitectura

Mecanismo de Atencion

Cada cabeza de atencion calcula la atencion estandar de producto escalar escalada:

Attention(Q, K, V) = softmax(Q * K^T / sqrt(d_k)) * V

El mecanismo multi-cabeza ejecuta nHeads calculos de atencion en paralelo y concatena los resultados, luego aplica una proyeccion lineal.

Mascaramiento Causal

Cuando lCausal es .T. (por defecto), el transformer aplica una mascara causal (triangular) que impide que cada posicion atienda a posiciones futuras. Esto es esencial para la generacion de texto autorregresiva. Establece lCausal := .F. para tareas bidireccionales como clasificacion o modelado de lenguaje enmascarado.

Red Feed-Forward

Cada capa contiene una red feed-forward posicional:

FFN(x) = max(0, x * W1 + b1) * W2 + b2

donde la dimension interna es nFFDim (tipicamente 4x la dimension de incrustacion).

Consejos de Rendimiento

Para inferencia con modelos preentrenados, establece GPU_LAYERS a un valor > 0 si tienes una GPU. Esto descarga computacion a la GPU y acelera significativamente la generacion. Para maquinas solo CPU, un modelo cuantizado (Q4_K_M) con nLayers = 2-4 proporciona un buen equilibrio de calidad y velocidad.

Explora los Ejemplos

Abre cualquiera de los 7 proyectos de ejemplo en samples/projects/transformer/ para ver implementaciones completas y ejecutables de cada patron descrito en este tutorial.

En Esta Página

Primeros pasos Paleta de componentes Funciones del IDE Tutoriales Referencia Plataformas Proyectos de Ejemplo Arquitectura del Transformer Propiedades Eventos Ejemplo 1: Cargar un Modelo Preentrenado Ejemplo 2: Generacion de Tokens en Streaming Ejemplo 3: Visualizacion de Atencion Ejemplo 4: Entrenar desde Cero Detalles de Arquitectura Mecanismo de Atencion Mascaramiento Causal Red Feed-Forward