La idea central detrás de LoRA, publicada por Hu et al. en 2021, es que las actualizaciones de pesos durante el fine-tuning tienden a ser de bajo rango — lo que significa que los cambios pueden aproximarse bien mediante el producto de dos matrices mucho más pequenas. En lugar de actualizar una matriz de pesos W (digamos, 4096 x 4096 = 16 millones de parámetros), LoRA congela W completamente y agrega dos matrices pequenas A (4096 x r) y B (r x 4096) donde r (el rango) es típicamente 8, 16 o 64. La actualización efectiva es el producto BA, que tiene la misma forma que W pero esta parametrizado por solo 2 x 4096 x r valores. Con rango 16, eso es aproximadamente 131,000 parámetros entrenables en lugar de 16 millones — una reducción de 120x para esa sola capa. Aplica esto a todas las capas de atención del modelo y tus parámetros entrenables totales bajan de miles de millones a unos pocos millones, que es por lo que un archivo de adaptador LoRA suele pesar solo de 10 a 50 MB comparado con el modelo base de varios gigabytes.
En la práctica, eliges a que capas aplicar LoRA (típicamente las matrices de proyección de atención: Q, K, V y la proyección de salida) y estableces el rango r y un factor de escalado llamado alpha. La relación alpha/r controla cuanta influencia tiene el adaptador en relación con los pesos base congelados. Mayor rango significa más expresividad pero más parámetros y memoria; en la práctica, rango 16 o 32 cubre la mayoría de los casos de uso. QLoRA, introducido por Dettmers et al. en 2023, llevo la eficiencia aun más lejos al combinar LoRA con cuantización de 4 bits del modelo base: los pesos congelados se almacenan en NF4 (un formato de 4 bits optimizado para pesos con distribución normal) mientras que los adaptadores LoRA entrenan en bf16. Esto te permite hacer fine-tuning de un modelo de 70B parámetros en una sola GPU de 48 GB — algo que de otra forma requeriria una configuración multi-GPU con cientos de gigabytes de VRAM.
El ecosistema LoRA ha madurado rápidamente. La biblioteca PEFT de HuggingFace es la implementación estandar, y herramientas como Axolotl, LLaMA-Factory y Unsloth la envuelven en interfaces de nivel más alto que manejan el formato de datos, valores predeterminados de hiperparametros y ciclos de entrenamiento. Una de las características practicas más poderosas es la composabilidad de adaptadores: como los adaptadores LoRA son aditivos, puedes entrenar adaptadores separados para diferentes tareas y fusionarlos o intercambiarlos en tiempo de inferencia sin recargar el modelo base. Algunos frameworks de serving como LoRAX y vLLM explotan esto para servir cientos de adaptadores LoRA diferentes desde un único modelo base en memoria, enrutando cada solicitud al adaptador apropiado. Esto hace viable ofrecer modelos afinados por cliente sin el costo de desplegar instancias de modelo separadas.
Sin embargo, LoRA no es gratis. La restricción de bajo rango significa que no puede aprender cambios de pesos arbitrarios — si la tarea requiere una reestructuración significativa de las representaciones internas del modelo, el fine-tuning completo superara a LoRA. En la práctica, esto importa más para tareas que son muy diferentes de aquello para lo que el modelo base fue pre-entrenado, o cuando intentas ensenarle al modelo conocimiento factual sustancial nuevo en lugar de ajustar su estilo o formato. También hay un error común de establecer el rango demasiado bajo y preguntarse por que el adaptador no parece aprender, o establecerlo demasiado alto y terminar con un adaptador que sobreajusta en datasets pequenos. El rango es tanto una perilla de regularización como de capacidad, y ajustarlo junto con la tasa de aprendizaje y el número de pasos de entrenamiento es esencial para buenos resultados.