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.
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
| # | Proyecto | Descripcion |
|---|---|---|
| 1 | Attention Vis | Visualiza los pesos de auto-atencion para una oracion de entrada dada. |
| 2 | Text Generator | Carga un modelo preentrenado y genera texto desde una solicitud. |
| 3 | Train from Scratch | Entrena un transformer pequeno en un conjunto de datos de juguete (tarea de copia). |
| 4 | Tokenizer Explorer | Inspecciona tokenizacion, IDs de token y vocabulario. |
| 5 | Sentiment Analyzer | Ajusta un transformer para clasificacion positivo/negativo. |
| 6 | Translator | Traduccion secuencia-a-secuencia (p. ej., ingles a espanol). |
| 7 | Attention Walkthrough | Recorrido paso a paso de la arquitectura "Attention Is All You Need". |
Arquitectura del Transformer
Propiedades
| Propiedad | Tipo | Valor por defecto | Descripcion |
|---|---|---|---|
nLayers | Numerico | 6 | Numero de capas de codificador/decodificador en la pila de transformer. |
nHeads | Numerico | 8 | Numero de cabezas de atencion por capa. Debe dividir nEmbedDim uniformemente. |
nEmbedDim | Numerico | 512 | Dimension de incrustacion (d_model). Ancho central del transformer. |
nFFDim | Numerico | 2048 | Dimension interna de la red feed-forward (tipicamente 4x nEmbedDim). |
nVocabSize | Numerico | 50257 | Tamano del vocabulario. Debe coincidir con el vocabulario del tokenizador. |
nMaxSeqLen | Numerico | 512 | Longitud maxima de secuencia de entrada/salida en tokens. |
nDropout | Numerico | 0.1 | Tasa de dropout aplicada a salidas de atencion y FFN (0 = desactivado). |
cWeightsFile | Cadena | "" | Ruta al archivo de pesos preentrenados (formato GGUF). Establecer antes de cargar. |
lCausal | Logico | .T. | Usar mascara causal (decodificador). Establecer a .F. para modo solo codificador o bidireccional. |
Eventos
| Evento | Parametros | Descripcion |
|---|---|---|
OnAttention | aWeights, nLayer, nHead | Se dispara durante el paso adelante con matrices de pesos de atencion. Usar para visualizacion y analisis. |
OnGenerate | cToken, nStep | Se dispara por cada token generado durante la inferencia. Permite salida en streaming. |
OnTrainStep | nStep, nLoss, nBatch | Se dispara despues de cada paso de entrenamiento con el valor de perdida actual. Usar para mostrar progreso. |
OnLoss | nLoss | Se 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).
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.
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.