I dette blogindlæg vil jeg tale om detaljerne og principperne bag LoRA-metoden (Low-Rank Adaptation Of Large Language Models), mens jeg gennemgår artiklen . Artiklens hovedfokus er at præsentere en ny struktur, der reducerer omkostningerne ved finjustering af en model, samtidig med at dens ydeevne øges. Finjusteringsoperationer har haft en vigtig plads i studier af naturlig sprogbehandling i et stykke tid. Lad os sige, at du har en trænet model, og du ønsker at udvide dens viden. Du kan gøre det ved at finjustere uden at træne modellen fra bunden.
Lad os sige, at en model har n parametre efter træningen, og du skal finjustere den. Hvis du bruger en fuld finjusteringsmetode, vil modellens alle parametre blive opdateret. Når vi overvejer modeller, der har milliarder af parametre, vil opdateringen på alle parametre skabe tids- og lagringsproblemer. I papiret fremhæves de bedre eller på niveau med præstationsresultater for RoBERTa-, DeBERTa-, GPT-2- og GPT-3-modeller ved at bruge LoRA-metoden.
Det er nævnt i papiret, at LoRA-metoden er inspireret af undersøgelserne af Li et. al (2018a) og Aghajanyan et al. (2020). Disse undersøgelser understreger, at succesen med overparametriserede modeller faktisk er baseret på en lav indre dimension. Dette blev det punkt, der formede hypotesen om LoRA-metoden.
LoRA-metoden er en undersøgelse baseret udelukkende på rangfaktorisering. I denne metode tilføjes to sekventielle matricer parallelt med nogle tætte lag i de neurale netværk som vist i figur 1. Disse sekventielle matricer er dannet af en given rangkonfiguration. Nedenstående figur viser, hvordan et tæt lag ser ud efter tilføjelse af de sekventielle rangeringsmatricer. Inputvariablerne sendes gennem både den oprindelige fortræningsvægtmatrix og den første matrix af de sekventielle matricer. Derefter beregnes outputværdier ved at opsummere output fra disse to parallelle matricer.

LoRA-metoden
Neurale netværk har mange tætte lag, der udfører matrixmultiplikationer. Vægtmatricerne i disse lag er faktisk full-rank-matricer (alle rækker og kolonner er uafhængige). Men Aghajanyan et al. nævnte i deres artikel , at præ-trænede sprogmodeller har en lav "intrinsisk dimension". Det formede LoRA-hypotesen inden for dette aspekt. Så LoRA-hypotesen blev, at modellerne kunne lære med lavdimensionelle ændringer i vægtmatricen under tilpasningen til en specifik opgave.
Opdateringerne til denne matrix blev foretaget gennem matricer

adskilt af lav rang. Her er B en dxr-matrix, A er en rxk-matrix, mens r (rang) er meget mindre end d og k. Under finjusteringen forhindres gradientopdateringer til Wo. Både Wo- og ∆W-matricer ganges med de samme inputværdier, og resultaterne summeres og output h= w0 + ∆Wx = w0 +BAx dannes.
I begyndelsen af træningen brugte de tilfældig Gaussisk initialisering for A-matrixværdier og fuld nulinitiering for B-matrixværdier. Med andre ord, BA er lig med nul i begyndelsen.
LoRA-applikation i transformatorarkitektur
Der er 4 vægtmatricer Wq, Wk,Wv,Wo i selvopmærksomhedsmodul og 2 vægtmatricer i MLP-modul i transformerarkitektur. Under LoRA-tilpasningen frøs de vægtene i MLP-modulet, og anvendte metoden på opmærksomhedsvægte for at holde træningen enkel.
Fordele
- De største bekvemmeligheder leveret af LoRA er hukommelses- og lagerbrug. I artiklen nævnes det f.eks., at for en stor transformermodel, trænet med Adam, reduceres VRAM-forbruget med op til 2/3, hvis << r d. Dette skyldes, at optimeringstilstande ikke bevares for frosne parametre.
- For GPT-3 175B-modellen faldt VRAM-forbruget fra 1.2 TB til 350 GB.
- I scenariet, hvor r=4 og kun vægten af værdien og forespørgselsmatricerne blev ændret, blev kontrolpunktstørrelsen reduceret fra 350 GB til 35 MB. Dette gjorde det muligt at udføre træning med færre GPU'er.
- Da der ikke er nogen gradientopdatering i de fleste af parametrene, blev der desuden opnået en acceleration på 25 % ved træning af GPT-3 175B med LoRA sammenlignet med den fulde finjusteringsproces.
Artiklen nævner også, at hvis finjusteringsprocessen er nødvendig for et andet sprog, skal hele modellen bruges i stedet for LoRA.
Yderligere viden
Hvad er en rang
Rang er det samlede antal lineært uafhængige kolonner eller rækker i en matrix. Lad os antage, at vi har en matrix med n kolonner, og alle kolonner er uafhængige af hinanden, så kan vi sige, at kolonnerangen for denne matrix er n. Igen, hvis alle rækker i en matrix med n rækker er uafhængige af hinanden, så kan vi igen sige, at rækkerangen for matricen er n.
Rækkerangeringen og kolonnerangeringen af en matrix skal være ens. Som et eksempel kan vi se på matrixen nedenfor.
Matrix A = [[1,2,5], [2, 4, 10] ]
Hvis vi ser grundigt på matricen, kan vi se, at 2. række er det dobbelte af 1. række. Ligeledes er 2. og 3. kolonne i matrixen henholdsvis 2 og 5 gange 1. kolonne. Med andre ord, mens der er to vektorer på den samme linje på rækkebasis i matrixen, og tre forskellige vektorer på en anden linje på kolonnebasis, er der kun én unik vektor på hver række og kolonnebasis. Det betyder, at matrixens rang er 1.
For at finde rangen konverterer vi matrixen til dens echelonform, og derefter beregner vi antallet af rækker, der består af mindst én værdi, der ikke er nul.
Hvad er en Low Rank Matrix
I matricer kan rangeringen være lig med eller mindre end antallet af kolonner eller rækker. Matricer, der har mindre lineært uafhængige rækker eller kolonner end det aktuelle antal rækker eller kolonner, kaldes lavrangsmatricer. Matricer, hvor alle rækker eller kolonner er uafhængige, kaldes fuldrangsmatricer.
Hvad er en rangfaktorisering/nedbrydning
Vi kan omskrive en matrix med rangen r til B=LR^T ved at opdele den i L- og R-matricer. Her er L en matrix med mxr-dimensioner, mens R^T er en matrix med rxn-dimensioner. Denne proces er kendt som rangdekomponering.
Betydningen af rangfaktorisering:
Vigtigheden af rangfaktoriseringsprocessen er, at den giver os mulighed for at opdele en matrix i mindre matricer, L og R, og holde dem på mindre plads. Det betyder, at du kan lagre B ved at lagre dens faktorer L og R. Dette reducerer lagringskravene for B til (m+n)r tal ned fra mn tal. Et yderligere punkt, der er værd at nævne her, er, at efter at have opdelt en matrix i disse to små matricer, giver det mulighed for at foretage mange beregninger om matricen uden engang at producere den samme matrix igen. Af denne grund, når man har at gøre med en matrix med lav rang, betragtes rangfaktorisering altid som et vigtigt første skridt. Efter rangfaktoriseringen kan beregninger foretages meget hurtigere og med mindre hukommelse.
Endvidere
For mere detaljerede oplysninger om lavrangsmatricer kan du læse Ethan R. Epperlys blog og LoRA-artikel . Derudover kan du undersøge LoRAs kodebaserede applikationer i detaljer på microsoft/LoRA github-arkivet.
Gizem ABALI, cand.mag. / Teamleder