Explorer l’adaptation de bas rang (LoRA) à partir de zéro

DEV - 25/04
Lien vers le notebook : ici, j'ai exploré LoRA et je cherchais une implémentation simple...

Lien du carnet : ici

J'ai exploré LoRA et je cherchais un exemple de mise en œuvre simple. De nombreuses ressources que j'ai trouvées se concentrent sur la formation de grands modèles et utilisent souvent PEFT et le package loralib, ainsi que certaines implémentations de base utilisant des CNN ou des ANN, comme indiqué dans des sources comme [[2]].

Je suis tombé sur quelques exemples utilisant LoRA avec BERT, DistillBert et d'autres impliquant une couche Linear(). Cependant, je souhaite spécifiquement l'appliquer à GPT2, qui utilise une couche Conv1D() au lieu de Linear().

De nos jours, les modèles d’apprentissage profond comportent beaucoup plus de couches. L’un des défis majeurs liés au réglage fin des grands modèles comme GPT est leur taille ; ils ne rentrent souvent pas dans la VRAM limitée disponible. Pour résoudre ce problème, des chercheurs de Microsoft ont développé la technique Low Rank Adaptation (LoRA). Cette méthode exploite le principe de décomposition matricielle de bas rang. Il a montré que les modèles pré-entraînés courants peuvent être efficacement affinés ou adaptés en utilisant seulement un petit sous-ensemble de leurs paramètres d'origine, au lieu de modifier chaque paramètre. Cette approche réduit non seulement les besoins en VRAM, mais peut être tout aussi efficace à des fins de réglage précis que l'utilisation de l'ensemble complet des paramètres.

LoRA se rapproche des changements de poids d'une couche pendant l'entraînement, ΔW, dans un format de bas rang.

Par exemple, alors que lors d'un réglage fin régulier, nous calculons les mises à jour de poids d'une matrice de poids W sous la forme ΔW, dans LoRA, nous approximons ΔW via la multiplication matricielle de deux matrices AB plus petites, comme illustré dans la figure ci-dessous. (Si vous êtes familier avec PCA ou SVD, considérez cela comme décomposant ΔW en A et B.)

Avec LoRA, la transformation dans une couche particulière impliquait à l'origine uniquement W⋅xW \cdot xW⋅x , où WWW est la matrice de poids et xxx est l'entrée. Cette opération inclut désormais un terme supplémentaire, ce qui donne Wx+(WAWB​)⋅xWx + (W_A W_B) \cdot xWx+(WA​WB​)⋅x .

Opération originale : L'opération WxWxWx implique WWW , une grande matrice généralement avec des dimensions telles que 768×768768 \times 768768×768 comme on le voit dans des modèles comme BERT ou GPT-2. La complexité de calcul de cette opération est O(d2)O(d^2)O(d2) , où ddd est la dimension de WWW (en supposant des matrices carrées pour plus de simplicité).

Foncti...
[Courte citation de 8% de l'article original]

Loading...