AI Engineering - Capítulo 7 - Finetuning
A continuación, se presenta un resumen detallado de los puntos principales del texto, respetando estrictamente la cronología y las secciones originales de la autora:
Capítulo 7: Finetuning (Ajuste Fino)
El finetuning (ajuste fino) es el proceso de adaptar un modelo de aprendizaje automático a una tarea específica mediante el entrenamiento de la totalidad o parte del modelo. Mientras que los métodos basados en prompts adaptan un modelo a través de instrucciones y contexto, el finetuning ajusta directamente los pesos del modelo. Esto mejora las capacidades específicas de dominio, la seguridad y, en particular, la capacidad de seguimiento de instrucciones del modelo para adherirse a estilos y formatos de salida específicos. Sin embargo, el finetuning incurre en una huella de memoria mucho mayor en comparación con los métodos basados en prompts, superando a menudo la memoria disponible en una sola GPU.
Visión General del Finetuning
El finetuning opera bajo el principio del aprendizaje por transferencia (transfer learning), un concepto introducido en 1976, que acelera el aprendizaje para una nueva tarea transfiriendo el conocimiento adquirido en una tarea relacionada. Al entrenar un modelo base en tareas con abundantes datos (como completar texto), ese conocimiento se transfiere a tareas especializadas con datos limitados (como responder preguntas legales). Esto mejora la eficiencia de la muestra, permitiendo que un modelo aprenda de cientos de ejemplos en lugar de los millones necesarios para entrenar desde cero.
El finetuning es una extensión del preentrenamiento y puede tomar varias formas:
- Finetuning autosupervisado (preentrenamiento continuo): Entrenar con datos en bruto no anotados relacionados con la tarea antes de usar costosos datos anotados.
- Finetuning de relleno (infilling): Entrenar un modelo para llenar espacios en blanco, lo cual es muy útil para la edición de texto y la depuración de código.
- Finetuning supervisado: Refinar el modelo usando pares (entrada, salida) de alta calidad para alinearse con el uso humano.
- Finetuning de preferencias: Usar aprendizaje por refuerzo y datos comparativos para generar respuestas que maximicen la preferencia humana.
- Finetuning de contexto largo: Modificar la arquitectura del modelo (como los embeddings posicionales) para ampliar su longitud de contexto máxima.
Cuándo hacer Finetuning
El finetuning requiere recursos significativos en términos de datos, hardware y talento en aprendizaje automático, y normalmente solo se intenta después de extensos experimentos de ingeniería de prompts.
Razones para hacer Finetuning La principal motivación para el finetuning es mejorar la calidad general y específica de la tarea de un modelo, como seguir estrictamente estructuras JSON o YAML. También es efectivo para la mitigación de sesgos, contrarrestando los prejuicios presentes en los datos de preentrenamiento al exponer el modelo a conjuntos de datos seleccionados. Hacer finetuning a modelos más pequeños mediante la destilación (imitar el comportamiento de un modelo más grande) es común porque los modelos pequeños requieren menos memoria, son más rápidos y pueden superar el rendimiento de modelos más grandes predeterminados en tareas específicas. Históricamente, antes del almacenamiento en caché de prompts, el finetuning también se utilizaba para optimizar el uso de tokens incrustando ejemplos en los pesos del modelo en lugar del contexto del prompt.
Razones para no hacer Finetuning Hacer finetuning a un modelo para una tarea específica puede degradar su rendimiento en otras tareas, un fenómeno conocido como el impuesto de alineación (alignment tax). Además, exige una alta inversión inicial, requiriendo la adquisición manual de datos, conocimiento de optimizadores de entrenamiento y tasas de aprendizaje, y un presupuesto dedicado para el mantenimiento continuo a medida que los modelos base evolucionan rápidamente. Los modelos de propósito general superan cada vez más a los modelos con finetuning específicos de dominio; por ejemplo, GPT-4 superó significativamente al especializado BloombergGPT en benchmarks financieros.
Finetuning y RAG A la hora de decidir entre el finetuning y la Generación Aumentada por Recuperación (RAG), la elección depende del modo de fallo del modelo:
- RAG es para hechos: Si a un modelo le falta información actualizada o privada, RAG resuelve esto recuperando conocimiento externo. RAG supera consistentemente al finetuning en tareas que requieren eventos actuales.
- El Finetuning es para la forma: Si un modelo falla en el comportamiento (como errores de formato o tono irrelevante), el finetuning corrige esto. Ambos métodos pueden combinarse; aplicar RAG sobre un modelo con finetuning puede potenciar aún más el rendimiento.
Cuellos de Botella de Memoria
Dado que las redes neuronales se entrenan mediante retropropagación (backpropagation), el uso de memoria en el finetuning está fuertemente dictado por los parámetros entrenables de un modelo. El entrenamiento ejecuta un pase hacia adelante (calculando la salida) y un pase hacia atrás (actualizando los pesos usando gradientes). Durante el pase hacia atrás, se requiere memoria para almacenar los estados del gradiente y del optimizador para cada parámetro entrenable.
Un cálculo aproximado de la memoria para inferencia es $N \times M \times 1.2$, donde $N$ es la cantidad de parámetros, $M$ es la memoria por parámetro y $1.2$ representa los valores de activación y la caché KV. Sin embargo, la memoria de entrenamiento incluye los pesos del modelo, las activaciones, los gradientes y los estados del optimizador. El uso del optimizador Adam requiere almacenar dos valores de estado por parámetro junto al gradiente, lo que incrementa enormemente la huella de memoria.
Representaciones Numéricas y Cuantización Los valores en las redes neuronales se representan típicamente como flotantes (FP32, FP16, BF16, TF32) o enteros (INT8, INT4). Reducir el número de bits de precisión disminuye la memoria pero puede causar cambios de valor o errores.
La cuantización reduce la huella de memoria al convertir los modelos a formatos de menor precisión. La cuantización post-entrenamiento (PTQ) convierte un modelo completamente entrenado para la inferencia, lo que puede permitir la ejecución de modelos masivos en dispositivos periféricos (edge devices). Durante el entrenamiento, el entrenamiento consciente de la cuantización (QAT) simula baja precisión para mantener la calidad del modelo. Entrenar nativamente en baja precisión ahorra tiempo y costes, pero es matemáticamente difícil, lo que lleva al uso de precisión mixta donde los pesos sensibles permanecen en alta precisión mientras que los gradientes y las activaciones se mantienen en menor precisión.
Técnicas de Finetuning
Las técnicas han evolucionado para sortear las limitaciones extremas de hardware del finetuning completo.
Finetuning Eficiente en Parámetros (PEFT) PEFT logra un rendimiento comparable al finetuning completo al actualizar solo una pequeña fracción de los parámetros. Las técnicas PEFT generalmente se dividen en dos categorías:
- Métodos basados en soft-prompts: Modificar la entrada del modelo anteponiendo vectores entrenables continuos y especiales (soft prompts) junto con prompts duros legibles por humanos.
- Métodos basados en adaptadores: Añadir nuevos módulos entrenables a la arquitectura existente del modelo.
LoRA (Adaptación de Rango Bajo / Low-Rank Adaptation) LoRA es el método dominante basado en adaptadores. En lugar de añadir capas adicionales que incurren en latencia de inferencia, LoRA aplica una factorización de rango bajo a matrices de pesos individuales (más comúnmente a matrices de atención como query y value). Congela la matriz original de rango completo $W$ y entrena dos matrices factorizadas más pequeñas, $A$ y $B$, cuyo producto coincide con la dimensión de $W$. Esto reduce drásticamente los parámetros entrenables: para GPT-3, LoRA alcanzó el rendimiento de un finetuning completo usando solo el 0.0027% de los parámetros entrenables. Esta eficiencia funciona porque el preentrenamiento minimiza implícitamente la dimensión intrínseca de un modelo, lo que significa que los ajustes requieren muy pocos cambios reales en los parámetros.
Para el despliegue (serving), los pesos de LoRA pueden fusionarse permanentemente en el modelo base para evitar la latencia de inferencia, o mantenerse separados para el servicio multi-LoRA. El servicio multi-LoRA permite que un modelo base intercambie diferentes adaptadores específicos de tareas dinámicamente en la memoria, reduciendo drásticamente el espacio de almacenamiento. QLoRA da un paso más allá al cuantizar los pesos del modelo base en un formato de 4 bits (NF4) y decuantizarlos durante el cálculo, permitiendo entrenar un modelo de 65B en una sola GPU de 48GB.
Fusión de Modelos y Finetuning Multitarea La fusión de modelos (model merging) combina múltiples modelos con finetuning en un solo marco de trabajo, a menudo sin necesidad de GPUs. Es sumamente útil para el finetuning multitarea, evitando el olvido catastrófico que ocurre cuando un modelo es entrenado en tareas de manera secuencial. Los enfoques incluyen:
- Sumar: Promediar o ponderar los parámetros de diferentes modelos. Los vectores de tarea (el delta entre un modelo con finetuning y su base) pueden sumarse o restarse para combinar o eliminar capacidades. La Interpolación Lineal Esférica (SLERP) interpola vectores a lo largo de la ruta más corta en una superficie esférica. Podar los parámetros redundantes de los vectores de tarea (mediante métodos como TIES o DARE) antes de sumar resuelve en gran medida la interferencia de tareas.
- Apilar capas: Tomar capas de diferentes modelos y apilarlas (frankenmerging). Esto se utiliza en el entrenamiento de arquitecturas de Mezcla de Expertos (MoE) y el escalado de modelos con respecto a la profundidad (p. ej., crear un modelo de 48 capas a partir de uno de 32 capas).
- Concatenación: Combinar linealmente parámetros (p. ej., sumando rangos de adaptadores LoRA), aunque esto rara vez se recomienda ya que no reduce la huella de memoria.
Tácticas de Finetuning
Un finetuning exitoso requiere elegir un modelo base adecuado a través de una vía de progresión (comenzando con modelos baratos para probar el código) o una vía de destilación (usando un modelo fuerte para generar datos para uno más débil). Existen varios frameworks para agilizar esto (unsloth, PEFT, Axolotl).
Los hiperparámetros importantes incluyen:
- Tasa de aprendizaje (Learning rate): Determina el tamaño del paso de las actualizaciones de peso. Debe ajustarse en base a la curva de pérdida.
- Tamaño del lote (Batch size): Determina cuántos ejemplos se procesan por cada actualización de pesos. Los lotes pequeños causan inestabilidad; los grandes requieren más memoria. La acumulación de gradientes puede simular lotes grandes bajo restricciones de memoria.
- Número de épocas: Pasadas sobre los datos de entrenamiento. Los conjuntos de datos pequeños necesitan más épocas, mientras que los conjuntos grandes podrían necesitar solo 1-2.
- Peso de pérdida del prompt (Prompt loss weight): Asegura que el modelo se enfoque en aprender de las respuestas generadas y no de los prompts del usuario.
Resumen
El finetuning pasó de ser una actualización completa del modelo a paradigmas altamente eficientes debido a los masivos tamaños de los modelos. Innovaciones como PEFT, LoRA, la cuantización y la fusión de modelos han reducido fundamentalmente la barrera de entrada, permitiendo adaptaciones localizadas, específicas y eficientes en cuestiones de memoria para los modelos fundacionales masivos.
💡 Comentarios, Anécdotas y Estado del Arte Actual
El Capítulo 7 de AI Engineering de Chip Huyen es increíblemente denso, y como la propia Huyen señala, fue “el más desafiante de escribir a nivel técnico, no por la complejidad de los conceptos, sino por el amplio alcance que cubren”. Al leerlo, se percibe el inmenso impacto de la rapidez con la que avanza la comunidad de ML de código abierto.
Lo que hace destacar la escritura de Huyen es cómo fundamenta conceptos altamente matemáticos en brutales realidades de la ingeniería con las que es fácil empatizar. Por ejemplo, suelta como si nada una anécdota de sus tiempos de universidad que sirve como rito de iniciación para todo ingeniero de ML: “En la universidad, cometí el doloroso error de dejar que mi modelo se entrenara toda la noche, solo para que fallara luego de ocho horas por intentar guardar el checkpoint en una carpeta inexistente. Todo el progreso se perdió”. Es un recordatorio doloroso y a la vez hilarante de que no importa cuán avanzadas sean las matemáticas de retropropagación; un directorio ausente aún puede arruinarte la semana.
Huyen también toca la hermosa naturaleza esotérica de la nomenclatura de la ingeniería de hardware. Al hablar de TensorFloat-32 (TF32), hace referencia a un excompañero de NVIDIA que teorizaba sobre su nombre engañoso: “por qué se llama TF32 y no TF19 es algo que no me deja dormir… la gente podría ser escéptica ante formatos extraños (19 bits), así que nombrar este formato como TF32 lo hace parecer más amigable”. Es un divertido vistazo detrás de la cortina del marketing de hardware. De forma similar, destaca el caos que surgió cuando Llama 2 se lanzó y los desarrolladores cargaron erróneamente los pesos de BF16 como FP16, llevando a una degradación masiva del rendimiento y obligando a toda la comunidad a aprender bruscamente sobre formatos numéricos.
Conectando con el Estado del Arte Actual La exploración del capítulo sobre PEFT (específicamente LoRA) y la fusión de modelos (model merging) captura perfectamente el zeitgeist actual de la comunidad de IA de código abierto. Justo ahora, HuggingFace es prácticamente un patio de colegio de “frankenmerging”. Las técnicas de apilado de capas que describe Huyen son exactamente las que han propulsado la explosión de modelos como Mixtral y el impulso masivo hacia las arquitecturas de Mezcla de Expertos (MoE) open source.
Aún más, su mención de los LLMs de 1 bit mediante BitNet b1.58 de Microsoft parece un atisbo al futuro inmediato. Estamos llegando a un punto en el que la obsesión por escalar parámetros se iguala con la obsesión de comprimir la precisión. Si la industria estandariza con éxito los modelos de 1.58 bits o el preentrenamiento de rango bajo, la barrera de hardware para construir inteligencias masivas se derrumbará por completo. Atravesamos una transición de una era en que el finetuning era un ejercicio matemático de fuerza bruta a una donde constituye una forma de arte elegante y modular: intercambiando adaptadores LoRA como cartuchos para alterar al vuelo la personalidad y la capacidad del modelo.