• Publiceer datum
    18 februari 2025
  • Delen

In deze blogpost ga ik dieper in op de details en principes van de LoRA-methode (Low-Rank Adaptation Of Large Language Models), aan de hand van het bijbehorende artikel . De focus van het artikel ligt op het ontwikkelen van een nieuwe structuur die de kosten van het finetunen van een model verlaagt en tegelijkertijd de prestaties verbetert. Finetuning speelt al geruime tijd een belangrijke rol in onderzoek naar natuurlijke taalverwerking. Stel, je hebt een getraind model en je wilt de kennis ervan uitbreiden. Dat kan door middel van finetuning, zonder het model helemaal opnieuw te trainen.

Stel dat een model n parameters heeft na de training en dat u het moet finetunen. Als u een volledige finetuningmethode gebruikt, worden alle parameters van het model bijgewerkt. Wanneer we modellen met miljarden parameters beschouwen, zal de update van alle parameters tijd- en opslagproblemen opleveren. In het artikel worden de betere of op gelijke voet presterende uitkomsten benadrukt voor RoBERTa-, DeBERTa-, GPT-2- en GPT-3-modellen door de LoRA-methode te gebruiken.

In het artikel wordt vermeld dat de LoRA-methode is geïnspireerd door de studies van Li et. al (2018a) en Aghajanyan et al. (2020). Deze studies benadrukken dat het succes van overgeparametriseerde modellen eigenlijk is gebaseerd op een lage intrinsieke dimensie. Dit werd het punt dat de hypothese van de LoRA-methode vormgaf.

De LoRA-methode is een studie die volledig is gebaseerd op de rangfactorisatie. Bij deze methode worden twee sequentiële matrices parallel toegevoegd aan enkele dichte lagen in de neurale netwerken, zoals weergegeven in Afbeelding 1. Deze sequentiële matrices worden gevormd door een gegeven rangconfiguratie. De onderstaande afbeelding toont hoe een dichte laag eruitziet na het toevoegen van de sequentiële rangmatrices. De invoervariabelen worden verzonden via zowel de oorspronkelijke pretraining-gewichtsmatrix als de eerste matrix van de sequentiële matrices. Vervolgens worden uitvoerwaarden berekend door de uitvoer van deze twee parallelle matrices op te tellen.

 

Ekran Resmi 2024-12-26 15.25.36.png
Bron: https://arxiv.org/abs/2106.09685

De LoRA-methode

Neurale netwerken hebben veel dense lagen die matrixvermenigvuldigingen uitvoeren. De gewichtsmatrices in deze lagen zijn feitelijk matrices van volledige rang (alle rijen en kolommen zijn onafhankelijk). Aghajanyan et al. vermeldden echter in hun artikel dat voorgegetrainde taalmodellen een lage "intrinsieke dimensie" hebben. Dit aspect vormde de basis voor de LoRA-hypothese. De LoRA-hypothese stelt dus dat modellen kunnen leren door veranderingen in de gewichtsmatrix met een lage dimensionaliteit tijdens de aanpassing aan een specifieke taak.

De updates van deze matrix zijn gemaakt via matrices 

Ekran_Resmi_2024_12_26_15_32_57_6efdebb733.png

gescheiden door lage rang. Hier is B een dxr-matrix, A is een rxk-matrix, terwijl r (rang) veel kleiner is dan d en k. Tijdens de fine-tuning worden de gradiëntupdates naar Wo voorkomen. Zowel Wo- als ∆W-matrices worden vermenigvuldigd met dezelfde invoerwaarden en resultaten worden opgeteld en uitvoer h = w0 + ∆Wx = w0 +BAx wordt gevormd.

Aan het begin van de training gebruikten ze willekeurige Gaussiaanse initialisatie voor A-matrixwaarden en volledige nulinitialisatie voor B-matrixwaarden. Met andere woorden, BA is aan het begin gelijk aan nul.

LoRA-toepassing in transformatorarchitectuur

Er zijn 4 gewichtsmatrices Wq, Wk, Wv, Wo in de self-attention module en 2 gewichtsmatrices in de MLP module in transformer architecture. Tijdens de LoRA-aanpassing bevroor men de gewichten in de MLP module en paste men de methode toe op aandachtsgewichten om de training eenvoudig te houden.

Voordelen   

  • De grootste gemakken die LoRA biedt, zijn geheugen- en opslaggebruik. In het artikel wordt bijvoorbeeld vermeld dat voor een groot transformatormodel dat is getraind met Adam, het VRAM-gebruik met maximaal 2/3 wordt verminderd als << r d. Dit komt omdat optimizerstaten niet worden bewaard voor bevroren parameters.
  • Voor het model GPT-3 175B daalde het VRAM-verbruik van 1.2 TB naar 350 GB.
  • In het scenario waarbij r=4 en alleen de gewichten van de waarde- en querymatrices werden gewijzigd, werd de checkpointgrootte teruggebracht van 350 GB naar 35 MB. Hierdoor kon training worden uitgevoerd met minder GPU's.
  • Bovendien werd er, omdat er in de meeste parameters geen gradiëntupdate plaatsvindt, een versnelling van 25% bereikt bij het trainen van de GPT-3 175B met LoRA, vergeleken met het volledige fine-tuningproces.

In het artikel wordt ook vermeld dat als het fine-tuningproces voor een andere taal nodig is, het volledige model moet worden gebruikt in plaats van LoRA.

Aanvullende kennis

Wat is een rang

De rang is het totale aantal lineair onafhankelijke kolommen of rijen van een matrix. Stel dat we een matrix hebben met n kolommen en alle kolommen onafhankelijk van elkaar zijn, dan kunnen we zeggen dat de kolomrang van deze matrix n is. Als alle rijen van een matrix met n rijen onafhankelijk van elkaar zijn, dan kunnen we zeggen dat de rijrang van de matrix n is.

De rijrang en kolomrang van een matrix moeten gelijk zijn. Als voorbeeld kunnen we kijken naar de matrix hieronder.

Matrix A = [[1,2,5], [ 2, 4, 10] ]

Als we de matrix zorgvuldig bekijken, zien we dat de 2e rij twee keer de 1e rij is. Evenzo zijn de 2e en 3e kolom van de matrix respectievelijk 2 en 5 keer de 1e kolom. Met andere woorden, terwijl er twee vectoren op dezelfde lijn op rijbasis in de matrix staan, en drie verschillende vectoren op een andere lijn op kolombasis, is er slechts één unieke vector op elke rij- en kolombasis. Dit betekent dat de rang van de matrix 1 is.

Om de rang te bepalen, zetten we de matrix om in de echelonvorm en berekenen we het aantal rijen waarin minstens één waarde ongelijk aan nul voorkomt.

Wat is een lage rangmatrix?

In matrices kan de rang gelijk zijn aan of kleiner zijn dan het aantal kolommen of rijen. Matrices met kleinere lineair onafhankelijke rijen of kolommen dan het huidige aantal rijen of kolommen worden low-rank matrices genoemd. Matrices waarin alle rijen of kolommen onafhankelijk zijn, worden full-rank matrices genoemd.

Wat is een rangfactorisatie/-decompositie

We kunnen een matrix met rang r herschrijven als B=LR^T door deze te ontbinden in L- en R-matrices. Hierbij is L een matrix van m x r dimensies, terwijl R^T een matrix van r x n dimensies is. Dit proces staat bekend als rangontbinding.

Het belang van rangfactorisatie:

Het belang van rangfactorisatie is dat het ons in staat stelt een matrix op te delen in kleinere matrices, L en R, die minder geheugen in beslag nemen. Dit betekent dat B kan worden opgeslagen door de factoren L en R op te slaan. Hierdoor wordt de benodigde opslagruimte voor B teruggebracht van mn naar (m+n)r. Een ander belangrijk punt is dat na het opdelen van een matrix in deze twee kleinere matrices veel berekeningen met de matrix kunnen worden uitgevoerd zonder dat dezelfde matrix opnieuw hoeft te worden gegenereerd. Om deze reden wordt rangfactorisatie bij het werken met een matrix met een lage rang altijd beschouwd als een belangrijke eerste stap. Na de rangfactorisatie kunnen berekeningen veel sneller en met minder geheugen worden uitgevoerd.

Verdermeer

Voor meer gedetailleerde informatie over matrices met een lage rang kunt u de blog van Ethan R. Epperly en het LoRA-artikel lezen . Daarnaast kunt u de code-gebaseerde toepassingen van LoRA in detail bekijken op de microsoft/LoRA GitHub-repository.

Gizem ABALI, MSc. / Teamleider