📚 Paper
https://arxiv.org/abs/2106.09685
LoRA: Low-Rank Adaptation of Large Language Models
An important paradigm of natural language processing consists of large-scale pre-training on general domain data and adaptation to particular tasks or domains. As we pre-train larger models, full fine-tuning, which retrains all model parameters, becomes le
arxiv.org
Abstract
NLP 패러다임을 이루고 있는 단계는 크게 pre-training (large-scale pre-training on general domain data)와 fine-tuning (adaptation to particular tasks or domains)로 나뉜다. 그러나 모델의 크기가 점점 커질수록 pre-training의 어려움도 증가했고, pre-trained parameters를 모두 업데이트하는 full fine-tuning 역시 실현 가능성이 낮아졌다. 예를 들어 GPT-3 175B를 full fine-tuning하려면 175B, 즉 1750억 개의 파라미터를 모두 업데이트해야 한다.
따라서 본 논문은 LoRA (Low-Rank Adaptation)를 제시한다. LoRA는 pre-trained 모델의 가중치를 freeze하고 trainable rank decomposition matrices를 모델 아키텍처의 각 레이어마다 포함시킴으로써 모델을 adapt시킨다.
LoRA를 사용하면 Adam optimizer로 fine-tuned된 GPT-3 175B의 경우보다 trainable parameter의 개수를 10,000배나 줄일 수 있고 GPU 사용량도 3배나 줄일 수 있다. 그럼에도 LoRA는 fine-tuning된 모델들보다 비슷하거나 더 나은 성능을 보인다. 즉 trainable parameter는 적으면서 throughput (주어진 시간에 수행하는 일의 양)은 높다. 또한 adapter와 다르게 추가적인 inference latency (입력이 들어오고 출력이 생성되기까지 걸리는 시간)이 발생하지 않는다.
Introduction
대부분의 NLP 태스크에서 하나의 pre-trained 모델을 여러 개의 downstream task에 fine-tuning하는 식으로 모델을 만든다. Fine-tining은 pre-trained 모델의 모든 파라미터를 업데이트함으로써 특정 태스크에 모델을 특화시키는 과정이다. Fine-tuning의 단점이라면 모델의 크기가 점점 커질수록 튜닝해야 하는 파라미터 수도 많아지기 때문에 단순히 불편함에서 불가능의 영역으로 문제가 확장된다는 것이다.
이와 같은 문제를 해결하기 위해서 adapting only some parameters (use adapters)나 learning external modules for new task와 같은 해결책들이 제시되었다. 물론 이러한 해결책들은 operational efficiency를 늘려 주었지만 그와 동시에 inference latency를 발생시켰다. 예를 들어 adapter를 사용하면 model depth가 늘어나고 prefix tuning을 이용해 특정 태스크의 prompt quality를 높이면 model's usable sequence length가 줄어들었다. 무엇보다 기존의 해결책들은 fine-tuning했을 때보다 성능이 떨어지는 efficiency-model quality trade-off를 야기했다.
파라미터의 수가 매우 많은 over-parameterized model에서는 모든 가중치가 중요한 게 아니다. 모델의 크기는 매우매우 커졌지만 사실 정말 중요한 가중치는 low intrinsic dimension에 존재한다. 본 논문에서는 adaption 과정에서 주요한 변화가 일어나는 가중치는 low rank (낮은 차원)을 가진다고 가정하며 LoRA를 제시한다. 기존의 pre-trained weights W0는 freeze시키고 low rank decomposition matrices weights AB만을 학습시킴으로써 최종 weight W = W0 + AB를 계산할 수 있다. GPT-3 175B를 예시로 들자면, full rank (dimension of pre-trained model)가 12,288로 매우 커도 low rank r만으로 weight adaptation을 간접적으로 진행할 수 있으며 이를 통해 storage-와 compute-efficient를 모두 확보할 수 있다고 한다.
rank라는 것은 선형대수의 관점에서 어떤 행렬의 열벡터들이 기저가 되어 만들 수 있는 (생성하는) 벡터 공간의 최대 차원을 의미한다. rank가 낮을수록 그만큼 원본 행렬의 정보가 중복이거나 불필요하다는 것을 의미한다. (rank가 낮다는 것은 원본 행렬의 열 벡터가 선형 종속인 벡터가 많다는 의미. 벡터가 선형 조합을 통해 서로를 만들 수 있기 때문) 이는 곧 행렬의 rank가 낮다면 분해를 통해 low-rank면서도 정말 중요한 정보를 담고 있는 행렬을 만들 수 있음을 의미한다.
본 논문에서는 크게 네 가지 contribution을 소개한다.
- 태스크에 따라 matrices A and B를 갈아 끼움으로써 storage requirement (전체 파라미터를 업데이트하지 않으므로 A와 B의 업데이트 가중치만 저장하면 됨)와 task-switching overhead (pre-trained 파라미터는 고정이므로 태스크를 바꿀 때마다 A와 B의 가중치만 load하면 되기 때문에 overhead가 줄어듦)를 상당히 줄일 수 있다.
- matrices A와 B의 가중치만 학습하므로 training을 더욱 효율적으로 만들고 hardware barrier의 진입 장벽을 3배나 낮췄다.
- simple linear design으로 frozen weights와 trainable matrices의 가중치를 합친다. 따라서 full fine-tuning을 할 때보다 LoRA를 사용할 때 additional inference latency가 발생하지 않는다.
- LoRA는 prefix-tuning과 같은 다른 방법들과 함께 사용할 수 있다. (orthogonal하다)
본 논문에서는 transformer 논문의 notation을 사용한다.
- \(d_{model}\): transformer layer의 입력과 출력 dimension
- \(W_q, W_k, W_v, W_o\): self-attention에서 사용되는 query, key, value, output projection matrices
- W or \(W_0\): pre-trained weight matrix
- \(\Delta W\): accumulated gradient update during adpation
- r: the rank of a LoRA module
- use Adam for model optimization
- feedforward dimension \(d_{ffn}\) = 4 x \(d_{model}\)
Problem Statement
본 논문의 방법론은 어떤 training objective에도 사용할 수 있지만, language modeling에 집중한다. 본 섹션은 language modeling problem에 대해 소개한다.
예시로 파라미터 \(\Phi\)를 파라미터로 가지는 언어 모델 \(P_{\Phi}(y|x)\)가 있다고 해보자. 이 언어 모델이 pre-trained된 모델이라고 한다면, 이후 adaptation을 통해 conditional text generation task (summarization, machine reading comprehension, NL2SQL)을 수행할 수 있다. 각 downstream task는 \(Z = {(x_i, y_i)}_{i = 1, ..., N}\)과 같은 데이터셋이며 \(x_i\)는 natural language query이고 \(y_i\)는 그에 대한 natural language 답이다.
full fine-tuning을 할 때에는 모델의 pre-trained 가중치 \(\Phi_0\)으로 초기화되고 conditional language modeling objective인 아래 식을 최대화하는 방향으로 gradient가 업데이트된다. \(\Phi_0 + \Delta \Phi\)와 같이 기존 가중치에 gradient update가 더해지며 파라미터가 조정된다.
각 downstream task에 full fine-tuning을 하게 되면 발생하는 가장 큰 문제 중 하나가 바로 업데이트되는 파라미터 \(\Delta \Phi\)의 차원이 \(\Phi_0\)와 같아 매우 크다는 점이다. 본 논문은 more parameter-efficient approach를 제안한다. 엄청나게 큰 dimension을 갖는 \(\Delta \Phi\)를 훨씬 작은 차원을 갖는 파라미터 \(\theta\)를 이용해 encoding한다. 즉, 아래 training objective를 보면 기존의 가중치 \(\Phi_0\)는 freeze시켜놓고 훨씬 작은 차원을 갖는 파라미터 \(\theta\)를 찾는 방향으로 gradient update한다. LoRA를 이용하면필요한 trainable parameters \(\theta\)가 \(\Phi_0\)의 0.01%으로 대폭 줄일 수 있다.
Aren't Existing Solutions Good Enough?
그동안 transfer learning (전이 학습; 어떤 데이터셋으로 모델을 pre-trained하여 initialization point를 잘 찾은 다음에, 수행하고자 하는 태스크를 적은 데이터셋으로 fine-tuning하는 기법)parameter- and compute- efficient한 adaption 방법을 찾기 위해 노력했다. Language modeling을 예시로 들자면, adding adpater layers나 optimizing some forms of the input layer activations와 같은 efficient adaption 방법이 있다. 그러나 이 두 가지 방법은 모두 large-scale, latency-sensitive production scenario에서 한계를 드러냈다.
- Adpater Layers Introduce Inference Latency: adapter에는 transformer block 당 두 개의 adpater layers가 있는 것이 있고 하나의 adapter layer + LayerNorm block이 있는 것이 있다. adpater는 self-attention의 출력을 받아 down-projection을 거친 뒤 up-projection을 수행한다. 문제는 이 adapter의 계산을 우회할 방법이 없고 모두 계산해야 한다는 것이다. adapter layer는 매우 적은 파라미터 수를 갖도록 설계되어 큰 문제가 아니라고 생각될 수 있지만, large neural network는 latency를 낮추기 위해 hardware parallelism에 의존한다. 그러나 adapter는 sequentially하게 처리되어야 하기 때문에 병렬화의 이점을 사용할 수 없다. 이러한 점은 online inference, 즉 batch size = 1인 환경에서 문제점으로 두드러져 adapter를 이용할 때의 latency가 그렇지 않을 때보다 눈에 띄게 증가한다. 또한 adapter는 추가적인 layer라서 모델의 깊이를 더 깊게 한다. 이는 우리가 모델을 sharding할 때 더 많은 GPU가 필요하도록 한다.
- Directly Optimizing the Prompt is Hard: prefix-tuning은 사용자의 입력 prompt의 앞에 특정 downstream task 수행에 도움을 주는 적절한 prefix를 벡터 형식으로 학습하는 것이다. 그러나 prefix-tuning은 최적화하기 어렵고 trainable parameters가 증가해도 항상 성능이 증가하지 않는다. (non-montonically) 또한 prefix-tuning을 하면 어쨌든 모델의 prompt 앞에 추가적인 벡터를 붙이는 작업이므로 그만큼 사용자가 모델에 입력으로 넣을 수 있는 시퀀스의 길이에 제약이 생긴다.
Our Method
Low-Rank-Parameterized Update Matrices
neural network는 matrix multiplication을 수행하는 많은 dense layer를 갖고 있다. layer에 존재하는 weight matrix는 학습의 대상인 행렬로, \(W_q, W_k, W_v, W_o\)와 같은 것들이며 일반적으로 full rank이다. 즉 pre-trained된 가중치 행렬은 표현력이 극대화된 상태다. full rank란 어떤 행렬의 rank가 행렬의 열의 개수와 같은 경우를 의미한다. 즉, 행렬의 모든 열 벡터가 선형 독립인 경우를 full rank라고 한다. rank는 행의 관점에서 보나 열의 관점에서 보나 항상 같으므로 (m, n)인 행렬 A가 있을 때 rank (A) = min(m, n)인 경우를 full rank라고 한다.
We empirically show that common pre-trained models have a very low intrinsic dimension; in other words, there exists a low dimension reparameterization that is as effective for fine-tuning as the full parameter space.
https://arxiv.org/pdf/2012.13255
위 논문의 내용에 따르면, 대부분의 pre-trained 언어 모델은 low intrinsic dimension을 가진다고 하는데 이는 곧 full rank의 가중치 행렬을 low dimension으로 reparameterization을 한 뒤 fine-tuning을 하는 것과 전체 파라미터 공간에서 fine-tuning을 하는 것이 비슷한 fine-tuning 성능을 낼 수 있음을 의미한다. 즉, 훨씬 저차원으로 모델의 파라미터를 재조정한 뒤 fine-tuning을 진행해도 성능에는 문제가 없다는 것이다. 이 사실을 토대로 본 논문에선 adaptation, 즉 업데이트되는 가중치도 low intrinsic rank를 가진다고 가정한다. (즉, 적은 수의 벡터들만으로 중요한 정보를 표현하여 업데이트할 수 있다)
pre-trained 파라미터 \(W_0 \in R^{d, k}\), \(B \in R^{d, r}\), \(A \in R^{r, k}\), d는 레이어의 입출력 차원, k는 \(W_q, W_k\)의 차원인데 대부분의 경우 d와 같다. r은 rank를 의미한다. 즉, BA의 차원은 결과적으로 (d, k)로 기존 파라미터와 같지만 이를 low-rank 행렬로 분해 (decompose)함으로써 파라미터의 수를 훨씬훨씬 줄인 것이다. B는 (d, r)차원, A는 (r, d)차원을 가지므로 행렬곱하면 (d, d)차원이 된다. 이후 (n, d)차원의 입력과 행렬곱하면 (n, d)차원의 출력이 생성된다. rank r은 하이퍼파라미터로, 모델과 태스크에 따른 적절한 값을 empirical하게 구해야 한다. 훈련 시 \(W_0\)는 frozen되어 아무런 gradient update가 일어나지 않고 A와 B는 trainable parameters이다. \(W_0\)와 \(\Delta W = BA\)는 같은 입력 x와 곱해지고 출력은 coordinate-wise하게 더해진다. BAx의 값이 cooredinate-wise하게 원래 \(W_0x\)에 더해짐으로써 사용자가 adapt하고자 하는 가중치의 값만 업데이트된다. 따라서 아래와 같은 forward pass 식이 만들어진다.
A는 Gaussian 분포로 초기화되고 B는 0으로 초기화된다. 따라서 \(\Delta W = BA\)는 tuning 시작 시 항상 0이다. \(W_0\)은 \(\frac{\alpha}{r}\)로 스케일링되고 \(\alpha\)는 상수다. \(\alpha\)를 처음 r로 설정한 뒤 별도로 튜닝하지 않는다. 이 스케일링은 r이 달라질 때 hyperparameter를 retune하지 않아도 되도록 해준다.
+) transformer architecture 참고: (n, d) 차원을 갖는 입력 임베딩 X에 (d, k)의 차원을 갖는 W_q, W_k, W_v, W_o가 곱해져서 (n, k)의 차원을 갖는 쿼리, 키, 밸류로 변환된다. 이후 쿼리와 키는 self-attention matrix를 계산하는 데 사용되고 softmax를 거친 값이 밸류와 곱해져서 self-attention 가중치가 반영된 새로운 (n, d) 차원의 임베딩이 생성된다. 이때 일반적으로 d == k이다.
- A Generalization of Full Fine-tuning: 기존의 full fine-tuning은 full rank인 pre-trained 가중치를 모두 업데이트하는 것이었다. 그러나 LoRA는 적절한 low rank r << min(d, k)를 이용해 학습해야 하는 파라미터의 수를 대폭 줄인다. LoRA를 모든 weight matrix에 적용한다는 것은 (d, k) 차원의 가중치 행렬 \(W_q, W_k, W_v, W_o\) 을 (d, r) x (r, k)의 low-rank decomposition matrix를 이용해 학습해야 하는 파라미터의 양을 대폭 줄이는 것을 의미한다. rank r을 크게 할수록 (trainable parameters를 늘릴수록) LoRA를 이용했을 때의 성능은 full fine-tuning을 할 때의 성능에 수렴할 수 있다. 그러나 기존의 adapter-based 방법은 MLP에 수렴하고 prefix-tuning은 긴 시퀀스를 입력으로 받을 수 없는 모델에 수렴하는 한계가 있다.
- No Additional Inference Latency: 모델의 deployment를 할 때 \(W = W_0 + BA\)를 계산해야 한다. downstream task마다 BA를 갈아끼워야 하는데 이때마다 W에서 BA를 빼줌으로써 \(W_0\)를 복원하고 다시 B'A'를 더해줄 수 있다. 이 과정은 매우 빠르게 처리할 수 있어 작은 memory overhead를 발생시킨다. 또한 LoRA는 추가적인 순차적 연산을 요하는 것이 아니라 마지막에 기존 파라미터와 weighted sum을 하기 때문에 full fine-tuning에 비해 추가적인 inference latency를 발생시키지 않는다.
Applying LoRA to Transformer
LoRA는 neural network의 어떤 weight matrices에도 적용 가능하다. Transformer architecture에는 self-attention module에 네 개의 weight matrices \(W_q, W_k, W_v, W_o\)가 있다. \(W_q, W_k, W_v\)은 (d, d)차원을 갖는다. 본 논문에서는 오직 몇몇 attention weights에만 LoRA를 적용하고 MLP modules에 있는 weights W1, W2는 freeze시켰다.
- Practical Benefits and Limitations: LoRA의 가장 큰 이점은 memory와 storage 사용량의 절감이다. Adam optimizer로 훈련된 transformer의 경우, frozen parameters에 대해서 gradient update states를 저장할 필요가 없기 때문에 VRAM 사용량이 2/3배 감소하여 1/3의 자원으로도 충분했다. GPT-3 175B의 경우, 훈련에 필요한 VRAM의 사용량이 1.2TB에서 350GB로 줄었다. 결과적으로 LoRA를 사용한 GPT-3 175B adaptation 시간이 대부분의 파라미터의 기울기를 계산해서 업데이트 및 저장할 필요가 없기 때문에 메모리 사용량도 줄어들고 속도도 full fine-tuning보다 25% 더 빨라졌다.
Empricial Experiments
LoRA의 성능을 RoBERTa, DeBERTa, GPT-2, GPT-3 175B에 적용했다. 데이터셋은 NLU에서 NLG 태스크이며, GLUE benchmark로 성능을 평가했다.
Baselines
- Fine-Tuning (FT): fine-tuning을 할 때에 pre-trained 모델의 가중치와 편향으로 초기화된 후 gradient update를 한다. 이때 전부 tuning하지는 않고 일부는 freeze시키고 몇 개의 layer만 학습시킨다. \(FT^{Top2}\)는 GPT-2를 나머지는 freeze시킨 뒤 마지막 2개의 layer만 fine-tuning한 모델이다.
- Bias-only or BitFit: 다른 가중치는 모두 freeze하고 bias vector에만 LoRA를 적용한 모델이다.
- Prefix-embedding tuning (PreEmbed): 입력 토큰에 훈련 가능한 work embeddings인 special token을 삽입한 것으로 special token은 일반적으로 모델의 vocabulary에 존재하지 않는다. speical token을 prompt의 어디에 삽입하느냐는 성능에 중요한 영향을 미친다. special token을 prompt의 앞부분에 추가한 것을 prefixing이라고 하고 prefix에 추가한 토큰의 개수를 \(l_p\)라고 한다. 만약 special token을 prompt 뒤에 추가한다면 이는 infixing이 되고, infix에 추가한 토큰의 개수를 \(l_i\)라고 한다. 추가한 토큰 임베딩만이 훈련 대상이므로 trainable parameter의 수는 \(d_{model}\) x (\(l_p + l_i\))이다.
- Prefix-layer tuning (PreLayer): PreEmbed처럼 입력의 special token의 임베딩 (embedding layer의 activation)만 학습하기보다 Transformer의 각 layer마다의 prefix를 추가하여 activations를 학습한다. 즉, PreEmbed는 입력의 activation만 훈련했다면 PreLayer는 모든 Layer의 activation을 훈련한다. 모든 레이어의 prefix가 훈련 대상이므로 trainable parameter 수는 L x \(d_{model}\) x (\(l_p + l_i\))이다.
- Adpater tuning
- \(Adapter^H\): transformer 모델에서 self-attention module (and the MLP module)과 subsequent residual connection 사이에 adpater layer를 추가한 방법이다. 가장 original design으로, FFNN와 같은 포맷. 모두 bias를 갖는 2개의 fully connected layer + 그 중간에 nonlinearity 포함
- \(Adapter^L\): adapter layer를 MLP module과 LayerNorm 뒤에만 추가한 더 효율적인 포맷.
- \(Adapter^D\): adapterdrop. 효율성을 위해 일부 adapter layer를 drop한 것.
- 각 adapter의 파라미터 수: \(L_{Adpt}\) x (2 x \(d_{model}\) x r + r + \(d_{model}\)) + 2 x \(L_{LN}\) x \(d_{model}\)
- LoRA: 존재하는 가중치 행렬에 trainable paris of rank decomposition matrices를 더한 것으로, \(W_q\)와 \(W_k\)에만 LoRA를 적용했다. 즉, 훈련 가능한 가중치 중 query 행렬과 key 행렬을 만드는 가중치들만 업데이트해주겠다는 의미다. LoRA의 trainable parameters 개수는 rank r에 의해 결정된다. 따라서 파라미터 수는 2 x \(L_{LoRA}\) x \(d_{model}\) x r이다. \(L_{LoRA}\)는 가중치 행렬의 개수이다. (그렇다면 논문의 경우에선 A와 B 두 개이므로 \(L_{LoRA}\) = 2이다)
- * (asterisk): 최대한 많은 basline을 확보하기 위해 이전의 결과를 가져온 것.
RoBERTa Base/Large
RoBERTa는 BERT의 pre-trained obejctive와 settings을 변경한 모델로, 최근의 큰 모델에 의해 overtaken되었지만 여전히 경쟁력 있는 모델 중 하나다. 논문은 pre-trained RoBERTa abse (125M)과 RoBERTa large (355M)를 사용했다.
모델 평가의 공평성을 위해 모든 태스크의 배치 사이즈를 갖도록 했고 adapter baseline에 맞추기 위해 sequence length를 128로 맞췄다. 모델을 MRPC, RTE, STS-B와 같은 데이터셋에 pre-trained된 모델의 가중치로 초기화했다. \(\dagger\)는 이와 같은 more restricted setting에서의 실험 결과다.
DeBERTa XXL
DeBERTa는 BERT의 변형으로 더 많은 파라미터를 가지고 GLUE and SuperGLUE benchmark에서 상당히 높은 성능을 보인다. 논문은 LoRA가 fully fine-tuned DeBERTa XXL과도 비슷한 성능을 내는지에 대한 실험을 했다.
GPT-2 Medium/Large
GLUE benckmark를 통해 LoRA가 NLU 태스크에 대해 뛰어난 성능을 보임을 확인했다. 그렇다면 GPT-2와 같은 NLG 태스크를 수행하는 모델에 대해서는 어떨까?
Scaling up to GPT-3 175B
LoRA는 모든 데이터셋에 대해 baseline보다 뛰어난 성능을 보였다. Figure 2에서 확인할 수 있듯 # of trainable paramters가 많다고 항상 성능이 증가한 것은 아니었다. 또한 prefix-embedding tuning에서 special token이 256개가 넘어가면 성능이 급격히 떨어졌고, prefix-layer tuning에서 special token이 32개가 넘어가면 성능이 급격히 떨어졌다. 이는 과도한 수의 speical token이 pre-trained data distribution을 shfiting시켰기 때문이라고 해석된다.
Related Works
- Transformer Language Models: transformer는 self-attention을 이용한 sequence-to-sequence 구조이다. transformer decoder 블록의 stack을 사용해 autoregressive한 태스크도 수행할 수 있게 되었으며 곧 transformer는 NLP 분야에 지배적인 모델이 되었다. 또한 어떤 태스크에 대해 directly하게 학습시키기보다는 general corpus를 이용해 pre-training을 한 뒤 fine-tuning을 하는 것이 훨씬 좋은 성능을 낸다는 사실이 발혀졌다.
- Prompt Engineering and Fine-Tuning: 모델의 입력 prompt를 어떻게 하느냐도 모델의 성능을 결정하는 중요한 요소다. 이에 관련된 연구 분야가 바로 prompt engineering이다. Fine-tuning은 pre-trained model을 특정 태스크에 대해 특화되도록 재훈련하는 것이다. 그러나 모델의 크기가 매우매우 커지면 hardware barrier가 높아져서 재훈련이 힘들어진다.
- Parameter-Efficient Adpation: 모델 내부에 adapter를 추가하는 방법과 LoRA는 기존의 가중치는 frozen시킨 후 소수의 가중치만 재학습시킨다는 점에서 비슷해 보일 수 있다. 그러나 adpater는 adapter를 모델 내부에 넣음으로써 adapter layer의 가중치를 훈련시키고, 이후 inference 과정에서 멀쩡히 있었던 frozen weights과 입력 사이의 연산 이외에도 adapter layer weights와의 추가적인 순차적인 계산을 요한다. 그러나 LoRA는 low-rank matrices의 훈련한 뒤 inference 과정에서 이를 사용할 때 frozen weights와의 sum을 해준 다음 원래 있던 연산만 해주면 되기 때문에 inference latency를 발생시키지 않는다.
- Low-Rank Structures in Deep Learning: 대부분의 machine learning 태스크는 intrinsic low-rank structure를 가진다. 즉, 태스크를 수행하는 데 있어 정말 중요한 정보 (가중치)는 낮은 차원에 존재한다는 것이다. 특히 over-parameterized model, 파라미터의 수가 매우매우 많은 모델의 경우, 훈련 이후에 대부분의 중요한 가중치는 low-rank에 존재하게 된다.
Understanding the Low-Rank Updates
GPT-3 175B에 LoRA를 적용하면 성능 손상 없이도 trainable parameters를 10,000배나 줄일 수 있다. 본 섹션은 아래 질문에 답한다.
- pre-trained Transformer의 어떤 weight matrices를 adapt해야 최적의 성능을 내는가?
- 진짜 full rank가 아니라 low-rank여도 (rank deficient) 최적의 adaptation을 할 수 있는가? 그렇다면, 최적의 rank r은 얼마인가?
- \(\Delta W\)와 \(W\) 사이의 관계는? \(\Delta W\)는 highly correlated되어 있는가?
Which Weight Matrices in Transformer Should We Apply LoRA to?
# of trainable parameters = 18M로 고정하고 self-attention weights만을 고려하기로 했다. adapt하는 가중치 행렬의 수가 늘어나면 rank의 크기는 줄이기로 했다.
그 결과, 단일 가중치 행렬 with 높은 rank보다는 여러 개의 가중치 행렬 with 낮은 rank로 adapt하는 것이 좋은 성능을 냈다.
What is the Optimal Rank r for LoRA?
adapt할 가중치 행렬 set으로 {\(W_q, W_v\)}, {\(W_q, W_k, W_v, W_o\)}를 사용했고 비교를 위해 {\(W_q\)}에 대해서도 adapt했다.
결과를 보면, 작은 rank의 성능이 오히려 너무 많은 rank를 사용한 것보다 좋았다. 이는 곧 \(\Delta W\)가 low intrinsic rank를 갖고 있음과 rank r을 크기 하는 것이 meaningful subspace를 더 찾지는 않는다는 의미다. (low rank matrix만으로 weight update에 중요한 정보를 표현하기에 충분하다)
- Subspace similarity between different r: \(A_{r=8}\)과 \(A_{r=64}\)를 각각 SVD (특이값 분해)를 하여 \(U_{A_{r=8}}\)와 \(U_{A_{r=64}}\)를 얻는다. 논문에서는 \(U_{A_{r=8}}\)의 top i singular vectors (1 <= i <= 8; rank = 8)이 생성하는 subspace와 \(U_{A_{r=64}}\)의 top j singular vectors (1 <= j <= 64; rank = 64)이 생성하는 subspace가 얼마나 겹치는지에 대해 알고 싶어하여 Grassmann distance를 이용해 subspace similarity를 계산했다. \(U_{A_{r=8}}^i\)는 행렬 \(U_{A_{r=8}}\)의 i번째 열벡터, \(U_{A_{r=64}}^j\)는 행렬 \(U_{A_{r=64}}\)의 j번째 열벡터를 의미한다. 아래 값이 1에 가까울수록 overlapping이 많이 되고 0에 가까울수록 overlapping이 적다는 것을 의미한다.
Figure 3의 3, 4번째 그림은 1, 2번째 그림을 확대한 것으로, 빨간색 영역이라고 보면 된다. Figure 3을 통해 알 수 있는 것은, \(A_{r=8}\)와 \(A_{r=64}\)의 top singular vector의 방향이 상당부분 겹친다는 것이다. (direction이 겹친다 == subspace similarity가 높다) 특히 dimension = 1일 때 similarity가 0.5 정도로 높았기에 rank r = 1일 때도 LoRA가 잘 adaptation을 수행할 수 있는 이유가 됐다. 말이 좀 어렵지만 요점은 r = 8로 설정하나 r = 64로 설정하나 rank의 수를 점점 늘릴수록 벡터가 표현할 수 있는 subspace의 유사도가 떨어지기 때문에 (이는 곧 높은 rank의 열 벡터가 표현하는 정보가 점점 덜 중요해짐을 의미) rank가 8개로 낮아도 어쨌든 8개의 열 벡터 안에 행렬 A의 중요한 정보가 포함되어 있기 때문에 adaptation을 잘 수행할 수 있다는 것이다. top singular vectors (8개)는 유용한 반면 나머지 direction vector는 subspace similarity가 낮기 때문에 random noise를 포함하는 벡터일 확률이 높다.
- Subspace similarity between different random seeds: Figure 4에서 보면 random gaussian matrices는 noise 정보를 담은 열 벡터이기 때문에 벡터가 만들 수 있는 subspace 사이에서 아무것도 공유하지 않는다. 1, 2번째 그림은 2개의 random seed로 생성한 r = 64인 행렬의 열들의 subspace similarity를 계산한 것이다. \(\Delta W_q\)의 subspace similarity가 \(\Delta W_v\)보다 더 크기 때문에 더 큰 intrinsic rank를 갖고 있다. 왜냐하면 subspace similarity가 크다는 것은 그만큼 rank가 어느 정도 커질 때까지 해당 벡터가 나타낼 수 있는 유의미한 정보량이 많다는 의미이기 때문이다. rank가 커져도 열 벡터가 noise 정보를 담고 있는 것이 아니라 유의미한 정보를 담고 있기 때문에 subspace similarity가 높다고 해석할 수 있다. 따라서 \(\Delta W_q\)의 중요한 정보를 표현하기 위해서는 \(\Delta W_v\)보다 많은 rank가 필요하다. (\(\Delta W_q\)의 rank가 커져도 subspace similarity가 높은 부분이 많다 -> 높은 rank도 \(\Delta W_q\)의 중요한 정보를 많이 담고 있다 -> \(\Delta W_q\)의 중요한 정보를 표현하기 위해서는 높은 rank가 필요하다) \(\Delta W_q\)의 rank가 \(\Delta W_v\)보다 높은 이유는 common singular value direction이 \(\Delta W_q\)에 의해 학습되기 때문이다.
How does the Adaptation Matrix \(\Delta W\) Compare to W?
\(\Delta W\)가 W와 높은 연관성을 갖고 있는가? (수학적으로, \(\Delta W\)이 W의 top singular direction에 포함되어 있는가? top singular direction은 W에 대한 중요한 정보를 담고 있는 벡터로 이해할 수 있다.) 또, 얼마나 높은 연관성을 갖고 있는가? (얼마나 중요한 정보를 반영하고 있는가?)
질문에 답하기 위해, W를 \(\Delta W\)의 차원인 r-dimensional subspace로 투영했다. W를 \(\Delta W\)을 이용해 r-dimension으로 투영하고 그것의 frobenius norm을 구하면 \(\Delta W\)이 W의 주요 특징 방향과 얼마나 일치하는 지를 알 수 있다. 만약 frobenius norm이 작다면 그만큼 W와 \(\Delta W\)는 관계가 없다는 것이고 (새로운 정보를 많이 담고 있다는 것) norm이 크다면 \(\Delta W\)가 W의 주요 특징을 많이 담고 있어 \(\Delta W\)로 가중치를 업데이트하면 그 주요 특징 방향으로 큰 증폭이 일어난다는 것이다. SVD를 이용하면 \(W = U \sum V^T\)로 W를 분해할 수 있는데, U와 \(V^T\)를 각각 r개의 열, r개의 행만을 사용하여 \(W_{projected} = U^T W V^T\)으로 W를 r-차원으로 투영해줄 수 있다.
그 다음 \(W_{projected} = U^T W V^T\)와 W의 frobenius norm을 계산한 뒤 비교한다. 가중치 \(W_q\)를 adapt할 가중치로 사용한다. 아래 표의 의미는 W를 4-dimension / 64-dimension으로 투영했을 때 U와 V를 얻은 행렬이 각각 \(\Delta W_q\), \(W_q\), random 행렬인 경우를 의미한다.
\(W_{projected}\)의 frobenius norm (행렬의 크기)이 클수록 원래 행렬 W를 더 많이 설명한다는 의미다. W를 r-dimension으로 투영시킬 때 사용하는 U와 V를 각각 \(\Delta W_q\), \(W_q\), random 행렬로부터 얻었을 때의 \(W_{projected}\)의 frobenius norm을 구한 것이다.
- \(\Delta W\)는 random matrix를 이용했을 때보다 W와 연관성이 크다. 즉, \(\Delta W\)가 W에 있는 features를 더 잘 반영한다는 의미다.
- W에서 강조되지 않은 특징을 \(\Delta W\)이 강조한다. 그 이유는, \(\Delta W\)을 이용해 W를 r-dimension으로 투영시켰을 때의 frobenius norm이 0.32로 작기 때문이다. 이는 W가 강조하지 못했던 부분을 \(\Delta W\)가 강조하고 있음을 나타내고 (norm이 작다는 것은 W와 \(\Delta W\)의 상관관계가 작다는 것을 의미; \(\Delta W\)이 W를 잘 설명하지 못함을 의미), 이는 곧 pre-trained 때 발견하지 못했던 특징을 찾아 성능을 끌어 올리려는 fine-tuning의 목적과 부합한다.
- r = 64보다 low-rank (r = 4)에서 6.91/0.32 = 21.5으로 ampilification factor가 크다. 즉, 원래 \(\Delta W\)가 설명하는 부분은 6.91이고 \(\Delta W\)를 이용해 투영된 r-dimension \(W_{projected}\)가 W를 설명하는 부분이 0.32이다. (W와 \(\Delta W\)는 큰 상관관계가 없다. 즉, 서로 다른 부분을 강조하여 설명하고 있다.) 따라서 \(\Delta W\)로 W를 추가로 설명할 때 기존에 설명 (강조)되지 않았던 부분이 약 21.5배 증폭된다. 원래 이는 비유하자면 \(\Delta W\)를 W에 추가하면 W에서 고려하지 못했던 특징을 \(\Delta W\)가 21.5배 정도 강조해주고 있음을 의미한다. 즉, W에서 capture되지 않은 중요한 특징들이 low-rank adaptation matrix를 통해 amplify될 수 있다.
Conclusion and Future Work
LLM을 fine-tuning하는 것은 downstream task마다 막대한 storage/switching cost를 발생시킨다. 본 논문은 inference latency를 발생시키지 않고 sequence length를 줄이지도 않는 효율적인 adpation 전략, LoRA를 제시한다. pre-trained 파라미터는 모두 freeze시키고 low-rank decomposition matrices만을 훈련시킴으로써 replacement도 빠르게 이루어진다. 그러면서도 성능은 유지 혹은 더 높다!