LoRA
요약
- 학습된 모델의 가중치를 고정
- 훈련 가능한 분해 가중치를 트랜스포머 아키텍처의 각 레이어에 주입
- 튜닝에 필요한 파라미터 수를 줄임
LLM 튜닝
- LLM이 있다고 가정
- 필요하면 파인튜닝
- 이 때 모든 가중치를 업데이트
- 이 경우 시간과 비용이 많이 소모됨
LoRA 이전 방식
- 특정한 태스크의 파라미터들을 Pretrained Model에 주입
- 추론 지연 발생
- 모델 깊이를 연장시키거나, 모델의 사용 가능한 시퀀스 길이를 줄이기 때문.
- 효율성과 모델 성능의 트레이드 오프 조정도 실패
- 추론 지연 발생
LoRA의 이론적 기반
- 과도하게 파라미터가 많은 모델이 실제로 낮은 고유 차원에 있다
- 파라미터가 아무리 많아도 실제로 사용하는 파라미터 수는 적다
- => 성능 향상에 영향을 주는 파라미터는 전체 파라미터의 일부
- => 모델 adaptation하는 동안 가중치 변화도 일부만 될 것이다
LoRA의 장점
- LoRA 모듈을 통해 다른 작업에 더 효과적으로 대응 가능
- 학습 효율
- 랭크 분해 행렬만 최적화 시키기 때문
- 풀 파인튜닝에 비해 더 적은 추론 지연
LoRA의 간략한 설명
- 트랜스포머 레이어 dmodel의 인풋과 아웃풋 사이즈를 불러옴
- self-attention 모듈에 있는 query/key/value/output 투영행렬 \(W_q, W_k, W_v, W_o\)사용
- \(W, W_{\theta}\)는 학습된 가중치 행렬
- \(\Delta W\)는 adaption동안 업데이트
- \(\Delta W\)는 adaptation 동안의 변화량
- gradient(손실함수의 기울기)들이 누적되면 변화량을 뜻함
- \(\Delta W\)는 adaptation 동안의 변화량
- r = LoRA 모듈의 랭크
- 트랜스포머 구조를 그대로 참조
기존 파인튜닝
- 하나의 LLM이 있다고 가정
- 각기 다른 특정 작업에선 성능이 좋진 않다
- 이 문제를 해소하기 위해선 파인튜닝 필요
- 이 경우 \(Z = {(x_i, y_i)}_{i = 1, 2, ..., N}\) 형식의 데이터셋 필요
- 재학습 시 기존의 파라미터 만큼의 새로운 파라미터 학습 -> 모델 저장 및 배포에 어려움이 생긴다
LoRA가 가지는 차이점
\(\triangle\Phi = \triangle\Phi(\theta)\)
- 위의 식은 LoRA가 파라미터 변화량을 만드는 방식
- LoRA는 변화량을 더 작은 집합인 \(\theta\)를 통해 구한다.
- \(\triangle\Phi \, 를\, 찾는 \, 것이\, \theta\)를 최적화하는 것이 된다.
- 즉 변화량을 더 작은 크기의 파라미터 \(\theta \, 로 \, 구하므로\, \theta\)만 학습시키면 된다
- => 더 효율적인 학습이 가능해짐
이 논문에서 사용한 방법
가정 : LLM은 특정 태스크에 사용될 때 일부 파라미터만 사용
- 언어모델의 가중치 행렬
- \[W_0 \in R^{d \times K}\]
- 이를 더 작은 랭크로 분해
- \[W_0 + \triangle W = W_0 + BA,\, where\, B \in R^{d \times r},\, A \in R^{r \times k},\, r << min(d, k)\]
- 학습동안 \(W_0\)는 고정, A, B에 훈련 가능한 파라미터 포함
- \(W_0,\, \triangle W = BA\)는 각각 같은 인풋으로 곱해진다
- 아웃풋 벡터는 같는 좌표로 합해짐
- \[h = W_0 x + \triangle W_0 x = W_0 x + BA\]
- A는 가우시안 분포를 따르는 랜덤 난수로 초기화, B는 0으로 초기화
- \(\triangle W\)는 훈련 초기에 0으로 초기화
- \(\triangle W \, 를\, \frac{\alpha}{r}\)로 스케일링
- \(\alpha\)는 r값에 따라 정해진 상수
- Adam으로 옵티마이징할 때 초기화를 적절하게 스케일링 했다면 알파를 조정하는 것은 학습률을 조정하는 것과 같게 된다