Dans cet article de blog, je vais parler des détails et des principes de la méthode LoRA (Low-Rank Adaptation Of Large Language Models), tout en passant en revue le papierL'objectif principal de cet article est de proposer une nouvelle structure qui diminue le coût du réglage fin d'un modèle tout en augmentant ses performances. Les opérations de réglage fin occupent depuis un certain temps une place importante dans les études de traitement du langage naturel. Supposons que vous ayez un modèle entraîné et que vous souhaitiez étendre ses connaissances. Vous pouvez le faire en effectuant un réglage fin, sans entraîner le modèle à partir de zéro.
Supposons qu'un modèle possède n paramètres après l'entraînement et que vous devez l'affiner. Si vous utilisez une méthode d'affinage complète, tous les paramètres du modèle seront mis à jour. Lorsque nous considérons des modèles qui ont des milliards de paramètres, la mise à jour de tous les paramètres créera des problèmes de temps et de stockage. Dans l'article, les résultats de performance meilleurs ou égaux sont mis en évidence pour les modèles RoBERTa, DeBERTa, GPT-2 et GPT-3 en utilisant la méthode LoRA.
Il est mentionné dans l'article que la méthode LoRA s'inspire des études de Li et al. (2018a) et Aghajanyan et al. (2020). Ces études soulignent que le succès des modèles surparamétrés repose en fait sur une faible dimension intrinsèque. C'est ce qui a façonné l'hypothèse de la méthode LoRA.
La méthode LoRA est une étude entièrement basée sur la factorisation des rangs. Dans cette méthode, deux matrices séquentielles sont ajoutées parallèlement à certaines couches denses des réseaux neuronaux comme le montre la figure 1. Ces matrices séquentielles sont formées par une configuration de rang donnée. La figure ci-dessous montre à quoi ressemble une couche dense après l'ajout des matrices de rangs séquentiels. Les variables d'entrée sont envoyées à la fois via la matrice de pondération de pré-entraînement d'origine et via la première matrice des matrices séquentielles. Ensuite, les valeurs de sortie sont calculées en additionnant les sorties de ces deux matrices parallèles.

La méthode LoRA
Les réseaux neuronaux comportent de nombreuses couches denses qui effectuent des multiplications de matrices. Les matrices de pondération de ces couches sont en fait des matrices de rang complet (toutes les lignes et colonnes sont indépendantes). Mais Aghajanyan et al. ont mentionné dans leur journal Les modèles de langage pré-entraînés ont une « dimension intrinsèque » faible. C'est dans ce contexte que l'hypothèse LoRA a été formulée. L'hypothèse LoRA est donc que les modèles peuvent apprendre avec des changements de faible dimension dans la matrice de pondération lors de l'adaptation à une tâche spécifique.
Les mises à jour de cette matrice ont été effectuées via des matrices

séparés par un rang faible. Ici, B est une matrice dxr, A est une matrice rxk, tandis que r (rang) est bien plus petit que d et k. Pendant le réglage fin, les mises à jour du gradient de Wo sont empêchées. Les matrices Wo et ∆W sont multipliées par les mêmes valeurs d'entrée et les résultats sont additionnés et la sortie h= w0 + ∆Wx = w0 +BAx est formée.
Au début de la formation, ils ont utilisé une initialisation gaussienne aléatoire pour les valeurs de la matrice A et une initialisation complète à zéro pour les valeurs de la matrice B. En d'autres termes, BA est égal à zéro au début.
Application LoRA dans l'architecture des transformateurs
Il existe 4 matrices de pondération Wq, Wk, Wv, Wo dans le module d'auto-attention et 2 matrices de pondération dans le module MLP dans l'architecture du transformateur. Lors de l'adaptation de LoRA, ils ont gelé les pondérations dans le module MLP et appliqué la méthode aux pondérations d'attention afin de garder la formation simple.
Avantages
- Les plus grandes commodités offertes par LoRA sont les utilisations de la mémoire et du stockage. Par exemple, dans l'article, il est mentionné que pour un grand modèle de transformateur entraîné avec Adam, l'utilisation de la VRAM est réduite jusqu'à 2/3 si << r d. Cela est dû au fait que les états de l'optimiseur ne sont pas conservés pour les paramètres figés.
- Pour le modèle GPT-3 175B, la consommation de VRAM a diminué de 1.2 To à 350 Go.
- Dans le scénario où r = 4 et seuls les poids des matrices de valeur et de requête ont été modifiés, la taille du point de contrôle a été réduite de 350 Go à 35 Mo. Cela a permis d'effectuer la formation avec moins de GPU.
- De plus, comme il n’y a pas de mise à jour du gradient dans la plupart des paramètres, une accélération de 25 % a été obtenue lors de l’entraînement du GPT-3 175B avec LoRA par rapport au processus de réglage fin complet.
L'article mentionne également que si le processus de réglage fin est nécessaire pour une langue différente, l'ensemble du modèle doit être utilisé à la place de LoRA.
Connaissances supplémentaires
Qu'est-ce qu'un rang
Rang est le nombre total de colonnes ou de lignes linéairement indépendantes d'une matrice. Supposons que nous ayons une matrice à n colonnes et que toutes les colonnes soient indépendantes les unes des autres, alors nous pouvons dire que le rang de colonne de cette matrice est n. Encore une fois, si toutes les lignes d'une matrice à n lignes sont indépendantes les unes des autres, alors nous pouvons dire à nouveau que le rang de ligne de la matrice est n.
Le rang des lignes et le rang des colonnes d'une matrice doivent être égaux. À titre d'exemple, nous pouvons examiner la matrice ci-dessous.
Matrice A = [[1,2,5], [ 2, 4, 10] ]
Si nous observons attentivement la matrice, nous pouvons voir que la 2e ligne est deux fois plus grande que la 1re ligne. De même, les 2e et 3e colonnes de la matrice sont respectivement 2 et 5 fois plus grandes que la 1re colonne. En d'autres termes, bien qu'il y ait deux vecteurs sur la même ligne au niveau des lignes dans la matrice, et trois vecteurs différents sur une autre ligne au niveau des colonnes, il n'y a qu'un seul vecteur unique sur chaque ligne et colonne. Cela signifie que le rang de la matrice est 1.
Afin de trouver le rang, nous convertissons la matrice dans sa forme échelonnée, puis nous calculons le nombre de lignes qui contiennent au moins une valeur non nulle.
Qu'est-ce qu'une matrice de rang bas
Dans les matrices, le rang peut être égal ou inférieur au nombre de colonnes ou de lignes. Les matrices dont le nombre de lignes ou de colonnes linéairement indépendantes est inférieur au nombre actuel de lignes ou de colonnes sont appelées matrices de rang faible. Les matrices dont toutes les lignes ou colonnes sont indépendantes sont appelées matrices de rang complet.
Qu'est-ce qu'une factorisation/décomposition de rang
Nous pouvons réécrire une matrice de rang r comme B=LR^T en la décomposant en matrices L et R. Ici, L est une matrice de dimensions mxr, tandis que R^T est une matrice de dimensions rxn. Ce processus est connu sous le nom de décomposition des rangs.
L'importance de la factorisation des rangs :
L'importance du processus de factorisation des rangs est qu'il nous permet de diviser une matrice en matrices plus petites, L et R, et de les conserver dans moins d'espace. Cela signifie que vous pouvez stocker B en stockant ses facteurs L et R. Cela réduit les besoins de stockage de B à (m+n)r nombres au lieu de mn nombres. Un point supplémentaire qui mérite d'être mentionné ici est qu'après avoir décomposé une matrice en ces deux petites matrices, cela permet d'effectuer de nombreux calculs sur la matrice sans même produire à nouveau la même matrice. Pour cette raison, lorsqu'il s'agit d'une matrice de faible rang, la factorisation de rang est toujours considérée comme une première étape importante. Après la factorisation de rang, les calculs peuvent être effectués beaucoup plus rapidement et en utilisant moins de mémoire.
Le saviez-vous ?
Pour des informations plus détaillées sur les matrices de faible rang, vous pouvez lire Ethan R. Epperly blog et Papier LoRA. De plus, vous pouvez examiner en détail les applications basées sur le code de LoRA sur le Microsoft/LoRA dépôt github.
Gizem ABALI, MSc. / Chef d'équipe