W tym wpisie na blogu omówię szczegóły i zasady metody LoRA (Low-Rank Adaptation Of Large Language Models), omawiając jednocześnie treść artykułu . Głównym celem artykułu jest zaprezentowanie nowej struktury, która obniży koszty dostrajania modelu, jednocześnie zwiększając jego wydajność. Operacje dostrajania zajmują ważne miejsce w badaniach nad przetwarzaniem języka naturalnego od jakiegoś czasu. Załóżmy, że masz wytrenowany model i chcesz poszerzyć jego wiedzę. Możesz to zrobić poprzez dostrajanie, bez konieczności trenowania modelu od podstaw.
Załóżmy, że model ma n parametrów po treningu i trzeba go dostroić. Jeśli użyjesz metody pełnego dostrajania, wszystkie parametry modelu zostaną zaktualizowane. Gdy weźmiemy pod uwagę modele, które mają miliardy parametrów, aktualizacja wszystkich parametrów spowoduje problemy z czasem i pamięcią masową. W artykule podkreślono lepsze lub porównywalne wyniki wydajności dla modeli RoBERTa, DeBERTa, GPT-2 i GPT-3 przy użyciu metody LoRA.
W artykule wspomniano, że metoda LoRA jest inspirowana badaniami Li et. al. (2018a) i Aghajanyan et al. (2020). Badania te podkreślają, że sukces modeli nadmiernie sparametryzowanych opiera się w rzeczywistości na niskim wymiarze wewnętrznym. Stało się to punktem, który ukształtował hipotezę metody LoRA.
Metoda LoRA to badanie oparte całkowicie na faktoryzacji rangi. W tej metodzie dwie macierze sekwencyjne są dodawane równolegle do niektórych gęstych warstw w sieciach neuronowych, jak pokazano na rysunku 1. Te macierze sekwencyjne są tworzone przez daną konfigurację rangi. Poniższy rysunek pokazuje, jak wygląda gęsta warstwa po dodaniu macierzy rangi sekwencyjnej. Zmienne wejściowe są przesyłane zarówno przez oryginalną macierz wag wstępnego treningu, jak i pierwszą macierz macierzy sekwencyjnych. Następnie wartości wyjściowe są obliczane przez zsumowanie wyników tych dwóch równoległych macierzy.

Metoda LoRA
Sieci neuronowe mają wiele gęstych warstw, które wykonują mnożenie macierzy. Macierze wag w tych warstwach są w rzeczywistości macierzami pełnego rzędu (wszystkie wiersze i kolumny są niezależne). Jednak Aghajanyan i in. wspomnieli w swoim artykule , że wstępnie wytrenowane modele językowe mają niski „wymiar wewnętrzny”. Ukształtowało to hipotezę LoRA w tym aspekcie. Hipoteza LoRA przyjęła zatem, że modele mogą uczyć się za pomocą niskowymiarowych zmian w macierzy wag podczas adaptacji do konkretnego zadania.
Aktualizacje tej macierzy zostały wykonane za pomocą macierzy

oddzielone przez niski rząd. Tutaj B jest macierzą dxr, A jest macierzą rxk, podczas gdy r (rząd) jest znacznie mniejsze niż d i k. Podczas dostrajania zapobiega się aktualizacjom gradientu Wo. Macierze Wo i ∆W są mnożone przez te same wartości wejściowe, a wyniki są sumowane i powstaje wyjście h= w0 + ∆Wx = w0 + BAx.
Na początku treningu użyli losowej inicjalizacji Gaussa dla wartości macierzy A i pełnej inicjalizacji zerowej dla wartości macierzy B. Innymi słowy, BA jest równe zeru na początku.
Zastosowanie LoRA w architekturze transformatora
Istnieją 4 macierze wagowe Wq, Wk, Wv, Wo w module self-attention i 2 macierze wagowe w module MLP w architekturze transformatora. Podczas adaptacji LoRA zamrożono wagi w module MLP i zastosowano metodę do wag uwagi, aby zachować prostotę treningu.
Zalety
- Największą wygodą zapewnianą przez LoRA jest wykorzystanie pamięci i pamięci masowej. Na przykład w artykule wspomniano, że dla dużego modelu transformatora trenowanego z Adamem, wykorzystanie pamięci VRAM jest zmniejszone nawet o 2/3, jeśli << r d. Dzieje się tak, ponieważ stany optymalizatora nie są przechowywane dla zamrożonych parametrów.
- W przypadku modelu GPT-3 175B zużycie pamięci VRAM zmniejszyło się z 1.2 TB do 350 GB.
- W scenariuszu, w którym r=4 i zmieniono tylko wagi macierzy wartości i zapytań, rozmiar punktu kontrolnego został zmniejszony z 350 GB do 35 MB. Umożliwiło to przeprowadzenie treningu przy użyciu mniejszej liczby procesorów graficznych.
- Ponadto, ponieważ w przypadku większości parametrów nie ma aktualizacji gradientu, podczas trenowania GPT-25 3B z LoRA osiągnięto przyspieszenie o 175% w porównaniu z pełnym procesem dostrajania.
W artykule wspomniano również, że jeśli proces dostrajania okaże się konieczny dla innego języka, należy zastosować cały model, a nie LoRA.
Dodatkowa wiedza
Co to jest ranga
Ranga to całkowita liczba liniowo niezależnych kolumn lub wierszy macierzy. Załóżmy, że mamy macierz z n kolumnami i wszystkie kolumny są od siebie niezależne. Wtedy możemy powiedzieć, że ranga kolumn tej macierzy wynosi n. Ponownie, jeśli wszystkie wiersze macierzy z n wierszami są od siebie niezależne, wtedy możemy ponownie powiedzieć, że ranga wierszy macierzy wynosi n.
Ranga wiersza i ranga kolumny macierzy muszą być równe. Jako przykład możemy spojrzeć na poniższą macierz.
Macierz A = [[1,2,5], [ 2, 4, 10] ]
Jeśli przyjrzymy się uważnie macierzy, możemy zobaczyć, że drugi wiersz jest dwa razy większy od pierwszego wiersza. Podobnie druga i trzecia kolumna macierzy są odpowiednio 2 i 1 razy większe od pierwszej kolumny. Innymi słowy, podczas gdy w macierzy są dwa wektory na tej samej linii na podstawie wiersza i trzy różne wektory na innej linii na podstawie kolumny, na każdej linii i podstawie wiersza jest tylko jeden unikalny wektor. Oznacza to, że ranga macierzy wynosi 2.
Aby znaleźć rząd, przekształcamy macierz do postaci schodkowej, a następnie obliczamy liczbę wierszy, które składają się z co najmniej jednej wartości różnej od zera.
Czym jest macierz niskiego rzędu
W macierzach ranga może być równa lub mniejsza od liczby kolumn lub wierszy. Macierze, które mają mniejsze liniowo niezależne wiersze lub kolumny niż bieżąca liczba wierszy lub kolumn, nazywane są macierzami niskiego rzędu. Macierze, w których wszystkie wiersze lub kolumny są niezależne, nazywane są macierzami pełnego rzędu.
Czym jest faktoryzacja/dekompozycja rangi
Możemy przepisać macierz o randze r jako B=LR^T, dekomponując ją na macierze L i R. Tutaj L jest macierzą o wymiarach mxr, a R^T jest macierzą o wymiarach rxn. Ten proces jest znany jako dekompozycja rangowa.
Znaczenie faktoryzacji rangi:
Znaczenie procesu faktoryzacji rzędu polega na tym, że pozwala on podzielić macierz na mniejsze macierze, L i R, i przechowywać je w mniejszej przestrzeni. Oznacza to, że można przechowywać macierz B, przechowując jej czynniki L i R. Zmniejsza to wymagania dotyczące pamięci macierzy B do (m+n)r liczb w dół z mn liczb. Warto również wspomnieć, że po rozłożeniu macierzy na te dwie małe macierze, pozwala to na wykonanie wielu obliczeń na macierzy bez konieczności ponownego tworzenia tej samej macierzy. Z tego powodu, w przypadku macierzy niskiego rzędu, faktoryzacja rzędu jest zawsze traktowana jako ważny pierwszy krok. Po faktoryzacji rzędu obliczenia można wykonywać znacznie szybciej i przy mniejszym zużyciu pamięci.
Ponadto
Aby uzyskać bardziej szczegółowe informacje na temat macierzy niskiego rzędu, przeczytaj blog Ethana R. Epperly'ego i artykuł na temat LoRA . Dodatkowo, możesz szczegółowo przeanalizować aplikacje oparte na kodzie LoRA w repozytorium GitHub Microsoft/LoRA .
Gizem ABALI, MSc. / Lider zespołu