LoRA (Low-Rank Adaptation) est une technique populaire conçue pour affiner les grands modèles de langage (LLM). Cette technologie a été initialement proposée par des chercheurs de Microsoft et incluse dans l'article « LORA : LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS ». LoRA diffère des autres techniques en ce sens qu'au lieu d'ajuster tous les paramètres du réseau neuronal, elle se concentre sur la mise à jour d'un petit nombre de matrices de bas rang, réduisant ainsi considérablement la quantité de calcul requise pour entraîner le modèle.
Étant donné que la qualité du réglage fin de LoRA est comparable à celle du réglage fin du modèle complet, de nombreuses personnes appellent cette méthode un artefact de réglage fin. Depuis sa sortie, de nombreuses personnes sont curieuses de connaître cette technologie et souhaitent écrire du code pour mieux comprendre la recherche. Dans le passé, le manque de documentation appropriée était un problème, mais nous disposons désormais de didacticiels pour vous aider.
L'auteur de ce tutoriel est Sebastian Raschka, un chercheur bien connu en apprentissage automatique et en IA. Il a déclaré que parmi les diverses méthodes efficaces de réglage fin du LLM, LoRA reste son premier choix. À cette fin, Sebastian a écrit un blog "Code LoRA From Scratch" pour construire LoRA à partir de zéro. Selon lui, c'est une bonne méthode d'apprentissage.
Cet article présente l'adaptation de bas rang (LoRA) en écrivant du code à partir de zéro. Sebastian a affiné le modèle DistilBERT dans l'expérience et l'a appliqué à la tâche de classification.
Les résultats de comparaison entre la méthode LoRA et la méthode de réglage fin traditionnelle montrent que la méthode LoRA atteint 92,39 % en précision de test, ce qui est supérieur au réglage fin uniquement des dernières couches du modèle (précision de test de 86,22 % ) performance. Cela montre que la méthode LoRA présente des avantages évidents dans l'optimisation des performances du modèle et peut mieux améliorer la capacité de généralisation et la précision de prévision du modèle. Ce résultat souligne l'importance d'adopter des techniques et des méthodes avancées lors de la formation et du réglage du modèle pour obtenir de meilleures performances et de meilleurs résultats. En comparant comment
Sebastian y parvient, jetons un coup d'œil ci-dessous.
Expliquer une couche LoRA dans le code est comme ceci :
où in_dim est la dimension d'entrée de la couche que vous souhaitez modifier à l'aide de LoRA, correspondant à ce out_dim est la dimension de sortie de la couche. Un hyperparamètre, le facteur d'échelle alpha, est également ajouté au code. Des valeurs alpha plus élevées signifient des ajustements plus importants du comportement du modèle, et des valeurs plus faibles signifient le contraire. De plus, cet article initialise la matrice A avec des valeurs plus petites provenant d'une distribution aléatoire et initialise la matrice B avec des zéros.
Il convient de mentionner que là où LoRA entre en jeu, c'est généralement la couche linéaire (feedforward) d'un réseau neuronal. Par exemple, pour un simple modèle ou module PyTorch avec deux couches linéaires (par exemple, il peut s'agir d'un module feedforward du bloc Transformer), la méthode forward peut être exprimée comme suit :
Lors de l'utilisation de LoRA, elle Il est courant d'ajouter des mises à jour LoRA à la sortie de ces couches linéaires, et le code résultant est le suivant :
Si vous souhaitez implémenter LoRA en modifiant un modèle PyTorch existant, un moyen simple consiste à chaque couche linéaire est remplacé par une couche LinearWithLoRA :
Les concepts ci-dessus sont résumés dans la figure ci-dessous :
Afin d'appliquer LoRA, cet article remplace les couches linéaires existantes dans le réseau neuronal par une combiné La couche linéaire d'origine et la couche LinearWithLoRA de LoRALayer.
LoRA peut être utilisé pour des modèles tels que GPT ou la génération d'images. Pour une explication simple, cet article utilise un petit modèle BERT (DistilBERT) pour la classification de texte.
Étant donné que cet article entraîne uniquement de nouveaux poids LoRA, vous devez définir require_grad de tous les paramètres entraînables sur False pour geler tous les paramètres du modèle :
Ensuite, utilisez print (model) pour vérifier le modèle. structure de :
On peut voir sur la sortie que le modèle se compose de 6 couches de transformateur, dont des couches linéaires :
De plus, le modèle a deux couches de sortie linéaires :
LoRA peut éventuellement être activé pour ces couches linéaires en définissant la fonction d'affectation et la boucle suivantes :
Vérifiez à nouveau le modèle en utilisant print (model) pour vérifier sa structure mise à jour :
Comme vous pouvez le voir ci-dessus, le calque Linear a été remplacé avec succès par le calque LinearWithLoRA. 92,15 %
Précision du test : 89,44 %
Précision de l'entraînement : 86,68 %
Précision de la validation : 87,26 %
Précision du test : 86,22 %
Si l'utilisateur souhaite essayer différentes configurations d'hyperparamètres, vous pouvez. utilisez la commande suivante :
Cependant, la configuration optimale des hyperparamètres est la suivante :
Sous cette configuration, le résultat est :
Il convient de noter que même s'il n'y a qu'un petit ensemble de paramètres entraînables dans le réglage LoRA (500k VS 66M), la précision est encore légèrement supérieure à la précision obtenue avec un réglage fin complet.
Lien original : https://lightning.ai/lightning-ai/studios/code-lora-from-scratch?cnotallow=f5fc72b1f6eeeaf74b648b2aa8aaf8b6
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!