이 블로그 게시물에서는 LoRA(Low-Rank Adaptation Of Large Language Models) 방법론의 세부 사항과 원리를 논문을 통해 살펴보겠습니다 . 이 논문의 핵심은 모델의 미세 조정 비용을 줄이면서 성능을 향상시키는 새로운 구조를 제시하는 것입니다. 미세 조정 작업은 자연어 처리 연구에서 오랫동안 중요한 위치를 차지해 왔습니다. 예를 들어, 학습된 모델이 있고 모델의 지식을 확장하고 싶다고 가정해 보겠습니다. 모델을 처음부터 다시 학습시키지 않고도 미세 조정을 통해 이를 수행할 수 있습니다.
모델이 학습 후 n개의 매개변수를 가지고 있고 이를 미세 조정해야 한다고 가정해 보겠습니다. 전체 미세 조정 방법을 사용하면 모델의 모든 매개변수가 업데이트됩니다. 수십억 개의 매개변수가 있는 모델을 고려할 때 모든 매개변수를 업데이트하면 시간과 저장 문제가 발생합니다. 이 논문에서는 LoRA 방법을 사용하여 RoBERTa, DeBERTa, GPT-2 및 GPT-3 모델에 대해 더 나은 또는 동등한 성능 결과가 강조됩니다.
논문에서는 LoRA 방식이 Li et. al(2018a)과 Aghajanyan et al.(2020)의 연구에서 영감을 받았다고 언급합니다. 이러한 연구는 과도하게 매개변수화된 모델의 성공이 실제로 낮은 내재적 차원에 기반을 두고 있다는 것을 강조합니다. 이는 LoRA 방식 가설을 형성한 지점이 되었습니다.
LoRA 방법은 전적으로 랭크 인수분해에 기반한 연구입니다. 이 방법에서는 그림 1과 같이 신경망의 일부 밀집 계층에 두 개의 순차적 행렬을 병렬로 추가합니다. 이러한 순차적 행렬은 주어진 랭크 구성에 의해 형성됩니다. 아래 그림은 순차적 랭크 행렬을 추가한 후 밀집 계층이 어떻게 생겼는지 보여줍니다. 입력 변수는 원래 사전 학습 가중치 행렬과 순차적 행렬의 첫 번째 행렬을 모두 통해 전송됩니다. 그런 다음 이 두 병렬 행렬의 출력을 합산하여 출력 값을 계산합니다.

LoRA 방식
신경망은 행렬 곱셈을 수행하는 많은 밀집 레이어를 가지고 있습니다. 이 레이어들의 가중치 행렬은 실제로 모든 행과 열이 독립적인 완전랭크 행렬입니다. 하지만 아가자냔(Aghajanyan) 외 연구진은 논문에서 사전 학습된 언어 모델이 낮은 "내재적 차원"을 가지고 있다고 언급했습니다. 이러한 점이 LoRA 가설의 토대가 되었습니다. 따라서 LoRA 가설은 모델이 특정 작업에 적응하는 동안 가중치 행렬의 차원 변화를 통해 학습할 수 있다는 것입니다.
이 매트릭스의 업데이트는 매트릭스를 통해 이루어졌습니다.

낮은 랭크로 구분됩니다. 여기서 B는 dxr 행렬이고, A는 rxk 행렬이며, r(랭크)은 d와 k보다 훨씬 작습니다. 미세 조정 중에 Wo에 대한 그래디언트 업데이트가 방지됩니다. Wo와 ∆W 행렬은 모두 동일한 입력 값으로 곱해지고 결과가 합산되어 출력 h= w0 + ∆Wx = w0 +BAx가 형성됩니다.
훈련 시작 시, 그들은 A 행렬 값에 대해 랜덤 가우시안 초기화를 사용했고 B 행렬 값에 대해 풀 제로 초기화를 사용했습니다. 즉, BA는 시작 시 0과 같습니다.
변압기 아키텍처에서의 LoRA 응용
트랜스포머 아키텍처의 셀프 어텐션 모듈에는 4개의 가중치 행렬 Wq, Wk, Wv, Wo가 있고 MLP 모듈에는 2개의 가중치 행렬이 있습니다. LoRA 적응 중에 MLP 모듈의 가중치를 동결하고 어텐션 가중치에 이 방법을 적용하여 트레이닝을 단순하게 유지했습니다.
장점
- LoRA가 제공하는 가장 큰 편의성은 메모리와 스토리지 사용입니다. 예를 들어, 이 기사에서는 Adam으로 학습한 대형 트랜스포머 모델의 경우 VRAM 사용량이 << r d이면 최대 2/3까지 줄어든다고 언급합니다. 이는 동결된 매개변수에 대한 최적화 상태가 유지되지 않기 때문입니다.
- GPT-3 175B 모델의 경우 VRAM 소모량이 1.2TB에서 350GB로 감소했습니다.
- r=4이고 값과 쿼리 행렬의 가중치만 변경된 시나리오에서 체크포인트 크기는 350GB에서 35MB로 줄었습니다. 이를 통해 더 적은 GPU로 훈련을 수행할 수 있었습니다.
- 또한 대부분 매개변수에 그래디언트 업데이트가 없기 때문에 LoRA로 GPT-25 3B를 훈련할 때 전체 미세 조정 프로세스와 비교했을 때 175%의 가속이 달성되었습니다.
또한 이 기사에서는 다른 언어에 미세 조정 과정이 필요한 경우 LoRA 대신 전체 모델을 사용해야 한다고 언급합니다.
추가 지식
랭크란 무엇인가
행렬의 랭크 는 행렬에서 선형적으로 독립적인 열 또는 행의 총 개수를 나타냅니다. 예를 들어, n개의 열을 가진 행렬이 있고 모든 열이 서로 독립적이라면, 이 행렬의 열 랭크는 n이라고 할 수 있습니다. 마찬가지로, n개의 행을 가진 행렬에서 모든 행이 서로 독립적이라면, 이 행렬의 행 랭크는 n이라고 할 수 있습니다.
행렬의 행 랭크와 열 랭크는 같아야 합니다. 예를 들어, 아래 행렬을 살펴보겠습니다.
행렬 A = [[1,2,5], [ 2, 4, 10] ]
행렬을 주의 깊게 살펴보면 2번째 행이 1번째 행의 두 배라는 것을 알 수 있습니다. 마찬가지로 행렬의 2번째와 3번째 열은 각각 2번째 열의 5배와 1배입니다. 다시 말해, 행렬에서 행 기준으로 같은 줄에 두 개의 벡터가 있고, 열 기준으로 다른 줄에 세 개의 다른 벡터가 있지만, 각 행과 열 기준으로 고유한 벡터는 단 하나뿐입니다. 즉, 행렬의 랭크는 1입니다.
순위를 구하기 위해 우리는 행렬을 사다리꼴 형태로 변환한 다음, 적어도 하나의 0이 아닌 값으로 구성된 행의 수를 계산합니다.
저랭크 행렬이란 무엇입니까?
행렬에서 랭크는 열 또는 행의 수와 같거나 작을 수 있습니다. 현재 행 또는 열의 수보다 선형적으로 독립적인 행 또는 열이 작은 행렬을 저랭크 행렬이라고 합니다. 모든 행 또는 열이 독립적인 행렬을 풀랭크 행렬이라고 합니다.
랭크 인수분해/분해란 무엇입니까?
행렬의 랭크가 r인 행렬을 L과 R로 분해하여 B=LR^T로 다시 쓸 수 있습니다. 여기서 L은 mxr 크기의 행렬이고, R^T는 rxn 크기의 행렬입니다. 이러한 과정을 랭크 분해 라고 합니다.
순위 요인 분석의 중요성:
행렬 분해의 중요성은 행렬 B를 더 작은 행렬 L과 R로 나누어 저장 공간을 줄일 수 있다는 데 있습니다. 즉, 행렬 B를 분해한 후, 두 개의 작은 행렬 L과 R을 저장함으로써 B의 저장 공간을 mn개에서 (m+n)r개로 줄일 수 있습니다. 또한, 행렬을 두 개의 작은 행렬로 분해한 후에는 동일한 행렬을 다시 생성하지 않고도 다양한 계산을 수행할 수 있습니다. 따라서 랭크가 낮은 행렬을 다룰 때는 랭크 분해가 매우 중요한 첫 단계로 간주됩니다. 랭크 분해 후에는 계산 속도가 훨씬 빨라지고 메모리 사용량도 줄어듭니다.
게다가
저차 행렬에 대한 더 자세한 정보는 Ethan R. Epperly의 블로그 와 LoRA 논문을 참조하십시오 . 또한, microsoft/LoRA GitHub 저장소 에서 LoRA의 코드 기반 응용 프로그램을 자세히 살펴볼 수 있습니다 .
Gizem ABALI, MSc. / 팀 리더