L'intuition fondamentale derrière LoRA, publié par Hu et al. en 2021, est que les mises à jour de poids pendant le fine-tuning tendent à être de rang faible — ce qui signifie que les changements peuvent être bien approximés par le produit de deux matrices beaucoup plus petites. Au lieu de mettre à jour une matrice de poids W (disons 4096 x 4096 = 16 millions de paramètres), LoRA gèle W entièrement et ajoute deux petites matrices A (4096 x r) et B (r x 4096) où r (le rang) est typiquement 8, 16 ou 64. La mise à jour effective est le produit BA, qui a la même forme que W mais est paramétrisé par seulement 2 x 4096 x r valeurs. Au rang 16, cela fait environ 131 000 paramètres entraînables au lieu de 16 millions — une réduction de 120x pour cette seule couche. En appliquant cela à toutes les couches d'attention du modèle, le total de paramètres entraînables passe de milliards à quelques millions, c'est pourquoi un fichier d'adaptateur LoRA ne fait souvent que 10 à 50 Mo comparé au modèle de base de plusieurs gigaoctets.
En pratique, on choisit à quelles couches appliquer LoRA (typiquement les matrices de projection de l'attention : Q, K, V, et la projection de sortie) et on définit le rang r et un facteur de mise à l'échelle appelé alpha. Le ratio alpha/r contrôle l'influence de l'adaptateur par rapport aux poids de base gelés. Un rang plus élevé signifie plus d'expressivité mais aussi plus de paramètres et de mémoire ; en pratique, un rang de 16 ou 32 couvre la plupart des cas d'usage. QLoRA, introduit par Dettmers et al. en 2023, a poussé l'efficacité encore plus loin en combinant LoRA avec la quantification 4 bits du modèle de base : les poids gelés sont stockés en NF4 (un format 4 bits optimisé pour des poids de distribution normale) tandis que les adaptateurs LoRA s'entraînent en bf16. Cela permet de faire du fine-tuning sur un modèle de 70 milliards de paramètres avec un seul GPU de 48 Go — ce qui nécessiterait autrement une configuration multi-GPU avec des centaines de gigaoctets de VRAM.
L'écosystème LoRA a mûri rapidement. La bibliothèque PEFT de HuggingFace est l'implémentation standard, et des outils comme Axolotl, LLaMA-Factory et Unsloth l'enveloppent dans des interfaces de plus haut niveau qui gèrent le formatage des données, les hyperparamètres par défaut et les boucles d'entraînement. L'une des fonctionnalités pratiques les plus puissantes est la composabilité des adaptateurs : comme les adaptateurs LoRA sont additifs, on peut entraîner des adaptateurs séparés pour différentes tâches et les fusionner ou les échanger au moment de l'inférence sans recharger le modèle de base. Certains frameworks de service comme LoRAX et vLLM exploitent cela pour servir des centaines d'adaptateurs LoRA différents à partir d'un seul modèle de base en mémoire, en routant chaque requête vers l'adaptateur approprié. Cela rend possible l'offre de modèles ajustés par client sans le coût de déploiement d'instances de modèles séparées.
LoRA n'est pas une solution miracle, toutefois. La contrainte de rang faible signifie qu'il ne peut pas apprendre des changements de poids arbitraires — si la tâche requiert une restructuration significative des représentations internes du modèle, le fine-tuning complet surpassera LoRA. En pratique, cela compte surtout pour les tâches très différentes de ce sur quoi le modèle de base a été pré-entraîné, ou quand on essaie d'enseigner au modèle des connaissances factuelles substantiellement nouvelles plutôt que d'ajuster son style ou format. Il y a aussi une erreur courante qui consiste à définir le rang trop bas et se demander pourquoi l'adaptateur ne semble pas apprendre, ou le définir trop haut et se retrouver avec un adaptateur qui surapprend sur de petits jeux de données. Le rang est autant un paramètre de régularisation qu'un paramètre de capacité, et l'ajuster conjointement avec le taux d'apprentissage et le nombre d'étapes d'entraînement est essentiel pour de bons résultats.