Aller au contenu principal

Module 7 — LoRA et inversion textuelle pour un style

ControlNet fournit une structure ; il ne fournit pas un style. Pour apprendre au modèle « toutes les images de la marque ressemblent à ceci », deux voies existent : l'inversion textuelle, minuscule et rapide, et surtout LoRA (Low-Rank Adaptation), aujourd'hui l'outil dominant. Le fil rouge du cours passe par un LoRA de style : 20 à 40 images de mobilier de la marque, une nuit d'entraînement, un fichier d'une centaine de mégaoctets, et n'importe quelle génération peut ensuite adopter ce style.

L'inversion textuelle : apprendre un nouveau mot

L'inversion textuelle, proposée en 2022 par Rinon Gal, prend une position radicale : ne pas toucher au modèle du tout, et n'apprendre qu'un nouveau vecteur d'embedding de token. Concrètement, on ajoute un token artificiel — mettons <mobmarque> — à l'encodeur de texte, et on optimise le vecteur associé pour que, sur les 20 images d'entraînement, la reconstruction fonctionne.

Le fichier final ne contient que ce vecteur : quelques kilooctets. Le modèle reste intact ; seule la représentation du nouveau mot est apprise. On l'utilise en écrivant le mot dans la consigne : un fauteuil dans le style de <mobmarque>.

L'inversion textuelle est légère et sans risque pour le modèle de base, mais elle a un plafond de qualité : un seul vecteur ne peut pas capturer un style riche. Elle marche bien pour un concept isolé (un objet, une créature), moins bien pour un style cohérent qui traverse toutes les images.

LoRA : la solution qui a pris le dessus

LoRA (Low-Rank Adaptation), publiée par Microsoft en 2021 pour les LLM et adaptée aux diffuseurs en 2023, ajoute au modèle des matrices de faible rang qui viennent modifier les poids sans les remplacer.

L'idée mathématique tient en une ligne. Pour une matrice de poids WW de taille d×kd \times k, on n'apprend pas une correction pleine — trop de paramètres — mais deux petites matrices AA de taille d×rd \times r et BB de taille r×kr \times k, avec rr typiquement entre 4 et 32. La correction effective est W+BAW + BA, qui reste de rang au plus rr. Comme rr est petit, on manipule bien moins de paramètres que le poids d'origine tout en gardant assez d'expressivité pour capturer un style.

Trois conséquences pratiques.

D'abord, un LoRA entier pèse quelques dizaines à quelques centaines de mégaoctets, contre plusieurs gigaoctets pour un modèle de base. Il s'échange facilement, se charge à la volée, et plusieurs LoRA peuvent être combinés à l'inférence.

Ensuite, l'entraînement d'un LoRA de style tient sur une carte grand public (12 à 24 Go de mémoire graphique) et prend une à deux heures pour 20 à 40 images, contre des semaines pour un affinage complet du modèle.

Enfin, l'effet est réversible : à l'inférence, on charge le LoRA avec un poids réglable (entre 0 et 1,2 typiquement). À poids 0, on retrouve le modèle de base ; à poids 1, l'effet est pleinement appliqué.

Le jeu d'entraînement : 20 à 40 images, cohérentes

C'est le paramètre le plus déterminant, et de loin. Un LoRA réussi commence par 20 à 40 images qui partagent réellement un trait commun — style graphique, palette, matière, éclairage — pas simplement un thème.

Pour le fil rouge, on rassemble 30 photos de la marque de mobilier : mêmes conditions d'éclairage (lumière naturelle indirecte), même palette (bois clair, tissus pastel), même mise en scène (fond neutre, plan de trois quarts). Chaque image est légendée — une phrase brève qui décrit ce qui varie d'une image à l'autre, jamais ce qui est constant. Les traits constants sont ce que le LoRA doit apprendre ; les décrire dans les légendes empêche justement le modèle de les intégrer au style.

Un mot déclencheur (trigger word) est associé au LoRA : c'est un token rare, souvent une chaîne inventée comme mobmk1. On le glisse dans chaque légende d'entraînement, puis on l'utilise à l'inférence pour activer le style. Ce mécanisme rend le LoRA optionnel : sans le mot déclencheur, le modèle génère normalement ; avec, il applique le style.

Le surapprentissage visuel : le piège central

C'est le problème d'un LoRA mal entraîné, et il ressemble à un succès à première vue. Après trop d'itérations, le LoRA cesse d'avoir appris un style pour avoir appris par cœur les images d'entraînement. Les symptômes :

  • L'image générée reproduit littéralement une composition du jeu d'entraînement, avec l'objet placé exactement au même endroit du cadre.
  • Le modèle refuse toute variation demandée par la consigne : « une chaise rouge » sort une chaise du même bois que dans le jeu, parce que la couleur a été mémorisée.
  • Un poids de LoRA supérieur à 0,7 dégrade l'image, avec artefacts et couleurs plates.
  • La diversité des graines s'effondre : cinq graines donnent quasiment la même image.

Trois défenses en pratique. Limiter le nombre de pas d'entraînement, typiquement 1000 à 2000 pas pour 30 images en SDXL, et surveiller la perte de validation qui doit rester stable. Utiliser un taux d'apprentissage modéré (autour de 10410^{-4} pour un LoRA SDXL). Et surtout, générer périodiquement des images de test pendant l'entraînement, à graines variées et consignes variées, pour détecter l'effondrement de la diversité avant qu'il ne soit consommé.

Charger et combiner à l'inférence

import torch
from diffusers import StableDiffusionXLPipeline

pipeline = StableDiffusionXLPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
torch_dtype=torch.float16,
).to("cuda")

# Chargement du LoRA de style de la marque.
pipeline.load_lora_weights(
"./loras/",
weight_name="mobmk1-style-v2.safetensors",
adapter_name="marque",
)

# Poids d'application : 0.85 laisse un peu de marge au modele de base.
pipeline.set_adapters(["marque"], adapter_weights=[0.85])

image = pipeline(
prompt="mobmk1 style, une chaise a bascule en chene, atelier lumineux, "
"photographie produit, plan large",
negative_prompt="floue, artefacts jpeg, filigrane",
num_inference_steps=30,
guidance_scale=7.0,
).images[0]

image.save("chaise-style-marque.png")

Plusieurs LoRA peuvent être combinés : un LoRA de style de marque et un LoRA d'objet spécifique, chacun avec son poids. Comme pour ControlNet, l'empilement additionne les contraintes ; il faut baisser les poids à mesure qu'on en cumule.

Un LoRA porte une licence

Un LoRA téléchargé sur une plateforme publique a une licence propre, qui n'est pas celle du modèle de base. Certaines interdisent l'usage commercial, d'autres imposent une attribution, d'autres protègent le style d'un artiste identifié. Le module 10 y revient : un LoRA gratuit et pratique peut être juridiquement inutilisable pour un client payant. Vérifier avant d'intégrer.

En résumé

  • L'inversion textuelle n'apprend qu'un vecteur d'embedding : légère, précise pour un objet isolé, insuffisante pour un style riche.
  • LoRA insère des matrices de faible rang qui modifient les poids sans les remplacer, s'entraîne en 1 à 2 heures sur carte grand public et pèse quelques centaines de mégaoctets.
  • Un LoRA de style demande 20 à 40 images cohérentes, un mot déclencheur rare, et un taux d'apprentissage modéré.
  • Le surapprentissage visuel se voit à la perte de diversité et à la mémorisation des compositions ; surveillance périodique et taux modéré sont les défenses.

Module suivant : la mise à l'échelle et la correction des visages, pour préparer une image générée à l'impression ou à la diffusion en haute définition.