Entrenamiento y Optimización
Desliza para mostrar el menú
El entrenamiento de modelos generativos implica la optimización de paisajes de pérdida que suelen ser inestables y complejos. Esta sección presenta funciones de pérdida adaptadas a cada tipo de modelo, estrategias de optimización para estabilizar el entrenamiento y métodos para ajustar modelos preentrenados a casos de uso personalizados.
Funciones de pérdida principales
Diferentes familias de modelos generativos emplean formulaciones de pérdida distintas según cómo modelan las distribuciones de datos.
Pérdidas en GAN
Pérdida minimax (GAN original)
Configuración adversarial entre el generador G y el discriminador D (ejemplo con la biblioteca pythorch):
loss_D = -torch.mean(torch.log(D(real_data)) + torch.log(1. - D(fake_data)))
loss_G = -torch.mean(torch.log(D(fake_data)))
Least squares GAN (LSGAN)
Utiliza la pérdida L2 en lugar de la pérdida logarítmica para mejorar la estabilidad y el flujo del gradiente:
loss_D = 0.5 * torch.mean((D(real_data) - 1) ** 2 + D(fake_data) ** 2)
loss_G = 0.5 * torch.mean((D(fake_data) - 1) ** 2)
Wasserstein GAN (WGAN)
Minimiza la distancia Earth Mover (EM); reemplaza el discriminador por un "crítico" y utiliza recorte de pesos o penalización de gradiente para la continuidad de Lipschitz:
loss = torch.mean(D(fake_data)) - torch.mean(D(real_data)) + gradient_penalty
Pérdida VAE
Evidencia Inferior Limitada (ELBO)
Combina reconstrucción y regularización. El término de divergencia KL incentiva que el posterior latente permanezca cercano al previo (usualmente normal estándar):
recon_loss = F.binary_cross_entropy(recon_x, x, reduction='sum')
kl_div = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())
loss = recon_loss + kl_div
Pérdidas en Modelos de Difusión
Pérdida de Predicción de Ruido
Los modelos aprenden a eliminar el ruido gaussiano añadido a lo largo de un programa de difusión. Existen variantes que utilizan predicción de velocidad (por ejemplo, v-prediction en Stable Diffusion v2) u objetivos híbridos:
noise = torch.randn_like(x)
x_t = q_sample(x, t, noise)
pred_noise = model(x_t, t)
loss = F.mse_loss(pred_noise, noise)
Técnicas de Optimización
El entrenamiento de modelos generativos suele ser inestable y sensible a los hiperparámetros. Se emplean varias técnicas para asegurar la convergencia y la calidad.
Optimizadores y Planificadores
- Adam / AdamW: los optimizadores adaptativos de gradiente son el estándar de facto. Usar β1=0.5, β2=0.999 para GANs;
- RMSprop: a veces utilizado en variantes de WGAN;
- Planificación de la tasa de aprendizaje:
- Fases de calentamiento para transformers y modelos de difusión;
- Decaimiento cosenoidal o ReduceLROnPlateau para una convergencia estable.
optimizer = torch.optim.Adam(model.parameters(), lr=2e-4, betas=(0.5, 0.999))
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=100)
Métodos de Estabilización
- Recorte de gradiente: evita la explosión de gradientes en RNNs o UNets profundos;
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
- Normalización espectral: aplicada a las capas del discriminador en GANs para imponer restricciones de Lipschitz;
from torch.nn.utils import spectral_norm
layer = spectral_norm(nn.Linear(100, 100))
- Suavizado de etiquetas: suaviza etiquetas estrictas (por ejemplo, real = 0.9 en lugar de 1.0) para reducir la sobreconfianza;
- Regla de actualización a dos escalas de tiempo (TTUR): utiliza diferentes tasas de aprendizaje para el generador y el discriminador para mejorar la convergencia;
- Entrenamiento de precisión mixta: aprovecha FP16 (mediante NVIDIA Apex o PyTorch AMP) para un entrenamiento más rápido en GPUs modernas.
scaler = torch.cuda.amp.GradScaler()
with torch.cuda.amp.autocast():
output = model(input)
loss = loss_fn(output, target)
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()
Supervisar por separado las pérdidas del generador y del discriminador. Utilizar métricas como FID o IS periódicamente para evaluar la calidad real de la salida en lugar de depender únicamente de los valores de pérdida.
Ajuste fino de modelos generativos preentrenados
Los modelos generativos preentrenados (por ejemplo, Stable Diffusion, LLaMA, StyleGAN2) pueden ajustarse para tareas específicas de dominio utilizando estrategias de entrenamiento más ligeras.
Técnicas de aprendizaje por transferencia
- Ajuste fino completo: reentrenar todos los pesos del modelo. Alto costo computacional pero máxima flexibilidad;
model = AutoModel.from_pretrained('model-name')
model.train()
optimizer = torch.optim.Adam(model.parameters(), lr=5e-5)
- Re-congelación de capas / descongelación gradual: comenzar congelando la mayoría de las capas y luego descongelar gradualmente capas seleccionadas para un mejor ajuste fino. Esto evita el olvido catastrófico. Congelar las primeras capas ayuda a conservar características generales del preentrenamiento (como bordes o patrones de palabras), mientras que descongelar las últimas permite que el modelo aprenda características específicas de la tarea;
for param in model.parameters():
param.requires_grad = False
# Unfreeze final transformer block or decoder
for param in model.transformer.block[-1].parameters():
param.requires_grad = True
- LoRA / capas adaptadoras: inyectar capas entrenables de bajo rango sin actualizar los parámetros del modelo base;
from peft import get_peft_model, LoraConfig, TaskType
config = LoraConfig(task_type=TaskType.SEQ_2_SEQ_LM, r=8, lora_alpha=16, lora_dropout=0.1)
model = get_peft_model(base_model, config)
- DreamBooth / inversión textual (modelos de difusión):
- Ajuste fino utilizando un pequeño conjunto de imágenes específicas del sujeto.
- Utilizar el pipeline de
diffusers:
from diffusers import StableDiffusionPipeline
pipeline = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4")
pipeline.train(texts, images) # pseudo-call: use DreamBooth training scripts in practice
- Ajuste de prompts / p-tuning:
from peft import PromptTuningConfig, get_peft_model
config = PromptTuningConfig(task_type=TaskType.CAUSAL_LM, num_virtual_tokens=20)
model = get_peft_model(base_model, config)
Casos de uso comunes
- Adaptación de estilo: ajuste fino en conjuntos de datos de anime, cómics o artísticos;
- Ajuste específico de la industria: adaptación de LLMs a los dominios legal, médico o empresarial;
- Personalización: condicionamiento de identidad o voz personalizada utilizando pequeños conjuntos de referencia.
Utilizar Hugging Face PEFT para métodos basados en LoRA/adaptadores, y la biblioteca Diffusers para flujos de ajuste fino ligeros con soporte integrado para DreamBooth y guía libre de clasificadores.
Resumen
- Utilizar funciones de pérdida específicas del modelo que coincidan con los objetivos de entrenamiento y la estructura del modelo;
- Optimizar con métodos adaptativos, técnicas de estabilización y programación eficiente;
- Ajustar modelos preentrenados utilizando estrategias modernas de transferencia de bajo rango o basadas en prompts para reducir costos y aumentar la adaptabilidad al dominio.
1. ¿Cuál de los siguientes es un propósito principal del uso de técnicas de regularización durante el entrenamiento?
2. ¿Cuál de los siguientes optimizadores se utiliza comúnmente para entrenar modelos de aprendizaje profundo y adapta la tasa de aprendizaje durante el entrenamiento?
3. ¿Cuál es el principal desafío al entrenar modelos generativos, especialmente en el contexto de las GANs (Redes Generativas Antagónicas)?
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla