[LLM] LoRA (Low Rank Adaptation)의 이해
LLM(Large Language Models, 대형 언어 모델)에 있어, 미세조정(Fine-Tuning, 파인 튜닝)은 추론이 불가능한 주제 및 질문에 대한 해결 방법으로 자리 잡았다. 그러나, 모델의 모든 매개변수(Parameter, 파라미터)를 다시 훈련하는 “모델 전체 조정” 과정은 높은 비용과 시간을 필요로 하는데, 제한된 자원의 중소 규모 기업 및 조직에서 이런 접근 방식은 높은 부담일 수밖에 없다.
2021년, Microsoft는 획기적인 논문, Low Rank Adaptation(LoRA, 이하 LoRA)를 발표했다. LoRA는 사전 훈련된 모델의 가중치를 고정한 상태에서 Transformer 아키텍처 각각의 레이어에 훈련 가능한 행렬을 삽입해 다운스트림 과정에서의 매개변수 수를 크게 줄일 수 있는 방법이다. 논문에서 Adam으로 미세조정된 GPT-3 137B 모델의 예제를 찾아볼 수 있는데, LoRA는 훈련에 필요한 파라미터 수를 10,000배 감소시킬 수 있었고, GPU 메모리 요구사항을 1/3로 줄였음에도 불구하고 RoBERTa, DeBERTa, GPT-2 및 GPT-3와 비교해 동등한 품질과 더불어 더 나은 성능을 발휘하는 것으로 밝혀졌다. 즉, 더 높은 훈련 처리량을 적은 리소스를 사용함에도 불구하고 추론에 있어 지연이 발생하지 않는다는 것이 증명됐다.
정리하면, LoRA는 새로운 작업(요청 및 추론)을 위해 LLM을 효율적으로 미세조정하는 기술이다. LoRA의 핵심 포인트는 미세조정 시 모델의 매개변수를 저차원 구조(Low Rank Structure)로 유지한 상태에서 업데이트 하는 것이다. 선형대수를 배웠다면 친숙한 내용이다.
(이미지 출처 : https://rfriend.tistory.com/176)
저차원을 이해하려면 먼저 차원(Rank)에 대해 알고 있어야 한다. 차원은 행렬의 선형 독립 행이나 열의 최대 수를 나타낸다. 선형 독립 벡터는 집합 내 다른 벡터의 선형 결합으로 표현될 수 없는 벡터를 의미한다. 저차원 구조를 유지한다는 것은 관련된 행렬이 소수의 선형 독립 열고 근사할 수 있는 방식으로 구성된다는 것을 의미한다. 따라서 고차원 행렬도 작은 랭크를 가질 수 있으며, 단순하게 소수의 열로 표현될 수 있다.
차원 개념을 정리함에 있어 선형 독립(Linearly independent)은 매우 중요하다. 적어도 하나의 벡터가 다른 벡터들의 선형 결합에 의해 정의될 수 있다면, 이 벡터의 집합은 선형적으로 의존한다 정의하는데, 만약 선형 결합으로 서로 표현될 수 있는 벡터가 존재하지 않다면 , 이 벡터들은 선형적으로 독립한다고 표현한다.
하나의 벡터 공간은 유한하거나 무한한 차원이 될 수 있는데, 이것은 선형적으로 독립적인 기저 벡터의 수에 달려 있다. 선형 의존성의 저으이와 벡터 공간에서 벡터 부분 집합이 선형적으로 의존인지, 독립인지 판단하는 능력은 벡터 공간에서 기저를 결정할 때 매우 중요하다. 다음은 3차원 공간에서 서로 선형 독립인 기저 벡터 3개를 볼 수 있다.
다음 두 예시는 선형 의존적 벡터를 표현하고 있는데, 평면은 두 개의 기저면 충분히 표현이 가능함에도 불구하고 세 개의 기저가 존재한다. 이중 서로 독립적인 두 개를 제외한 한 개를 제거해도 충분히 2차원 평면의 모든 점을 표현할 수 있다.
2차원 공간(R^2)에서 3개의 벡터를 고려해 보자. 다음 예시에서는 v1=(1,1), v2=(-3,2), v3=(2,4) 세 개의 벡터가 있고, 선형 결합을 통해 0이 된다 가정하고 있다.
(1) 두 번째 행에 첫 번째 행을 빼자. 행렬 방정식을 줄일 수 있다. (2) 두 번째 행을 5로 나누고 3을 곱한 다음 첫 번째 행에 추가해 행을 더 축소한다. 이 방정식을 재배열하면 (3)을 얻을 수 있다.
a1은 a2라는 상수가 존재하게 된다. a3에 특정 값을 넣는다면 결국 a1과 a2가 상수로 결정되고, 이것은 위 방정식을 만족하므로 선형결합으로 표현된다. 즉, 세 백터는 선형 의존한다(종속) 정의할 수 있다. 앞서 언급한 선형 독립은 어렵지 않게 이해할 수 있을 거라 생각한다.
두 벡터 v1=(1,1), v2=(-3,2)가 있다고 가정하고 종속성을 고려해 보면 다음과 같이 표현할 수 있다.
두 번째 행에 첫 번째 행을 빼면 다음과 같다.
단위행렬이 앞에 있고, 단위행렬의 역행렬은 단위행렬이므로, 이 역행렬을 양변에 곱하면 a1과 a2는 0 이외의 상수가 만족할 수 없으므로 두 벡터는 선형 독립이라 표현한다.
참고 : https://en.wikipedia.org/wiki/Linear_independence
정리하자면, LoRA는 모델의 매개변수를 저차원 구조로 유지함으로써 미세 조정 시 효율성을 높이는 기술로 다음과 같이 도식화 할 수 있다.
LoRA는 차원(순위) 분해라는 개념을 활용한다. 차원 분해 기법을 사용하면 고차원 행렬을 두 개의 저차원 행렬의 곱으로 표현할 수 있다. 따라서 사전 학습된 가중치 행렬(w)이 차원(n * k)인 경우, 두 개의 행렬 A와 B의 곱으로 표현될 수 있다. 여기서 A는 (n * r) 차원이고 B는 (r * k) 차원이다. A와 B를 곱하면 r이 상쇄되며 기본적으로 사전 학습된 가중치와 동일한 (n * k) 차원을 얻게 된다. 이 r은 n과 k에 비해 매우 작은 수로 1이나 2 일 수도 있다.
실제 값을 넣는다면 이해하기 쉽다.
- 가정 : n = 2,000, k=3,000, r=1
- w (사전 학습된 가중치 행렬, n * k) : n * k = 2,000 * 3,000 = 6,000,000
저랭크 행렬의 매개변수 값을 계산하자.
- A = n * r = 2,000 * 1 = 2,000
- B = r * k = 3,000 * 1 = 3,000
- 총 매개변수 = 2,000 + 3,000 = 5,000
6,000,000 vs 5,000 의 큰 차이가 있다.
LoRA의 핵심은 가중치와 편향 행렬의 저차원 표현(low rank representation)을 생성하고, 이를 미세조정하며 사전 학습된 가중치는 계속 고정된 상태로 유지하는 것이다. 두 행렬의 내적은 원래 가중치에 합산되고, 예측 값은 레이블과 비교되어 손실을 계산한다. 여기서 손실은 원래 사전 학습된 가중치를 그대로 주고 저차원 행렬을 통해서만 역전파 된다. 즉, 전체 매개변수의 작은 부분만 훈련함으로써, LoRA는 미세 조정에 필요한 리소스를 크게 줄이게 된다. 그 결과 낮은 사양의 하드웨어에서 LLM을 적응하는 것이 가능해졌다. 적은 매개변수 수는 저장 요구 사항을 줄이고, 모든 매개변수에 대해 기울기를 계산할 필요가 없기에 훈련 속도는 더 빨라질 수 있게 되었다.
즉, LoRA를 사용하면 사용자들은 고급 자연어 처리 기능을 위해 방대한 리소스를 필요하지 않고 최신 언어 모델을 만들 수 있게 된다.