본 게시글은 충남대 정상근 교수님의 강의자료를 바탕으로 작성한 글입니다.
일단 LLM은 크고 연산 비용이 많이 들기에 전체를 파인튜닝하기엔 어렵다.
그래서 PEFT 방식을 이용해서 이를 해결하는 것이다.
전체 모델을 다 바꾸지 않고 일부 파라미터만 선택적으로 튜닝하는 방식!
그 방법 중 LoRA를 소개하겠다.
LoRA란?
Fine-tuning process의 재해석 아이디어와, Parameter를 작게 관리하는 아이디어를 합한 것이다.
기존 fine-tuning은
원래 Data -> W(Pretrained weights) -> h 로 가는 과정을 거친 후, 그 반대 방향으로 backpropagation을 한다.
그렇게 W'를 찾아내고, 새롭게 Data -> W' -> h의 과정을 거칠 수 있도록 한다.
근데 이렇게 계속 가중치를 업뎃하지 말고,
애초에 업데이트 되는 가중치가 W' = W + delta W 로 정의되기에,
그냥 Data -> W + delta W -> h의 형식으로 생각해보자는 것이다. 아래와 같이 말이다.
이렇게 하면 매번 모든 가중치를 바꾸는 게 아니라 update weight만 바꾸면 된다.
근데 저 가중치의 크기를 줄일 수 있다면 그것도 좋지 않을까? 해서 생각해낸 것이
Low-Rank Decomposition이다.
이건 [D, K] 형태의 행렬을 [D, r]과 [r, K] 형태의 두 행렬의 곱으로 표현하는 방법이다.
그럼 아래와 같이 update weight를 바꿀 수 있게 된다.
그럼 저 r을 어떻게 골라야 할까?
r이 커지면 메모리 효율이 낮아지지만 모델 성능은 높아질 수 있는.. 이런 tradeoff 관계이다.
r이 작아지면 학습 속도가 빨리지고, 파라미터 개수가 적어지고, 계산량도 줄어든다.
그치만 너무 작아진다면.. 세부 정보를 반영하지 못하기에 성능이 저하될 수 있다.
즉 너무 작지도 너무 크지도 않은 적당한 r을 골라야 한다.
일단 저 형태로 가려면.. Wa랑 Wb를 초기화시켜야 한다.
Wa는 정규분포로 무작위 초기화를 진행한다.
Wb는 0으로 초기화한다.
그럼 초반에는 Wa * Wb = 0이므로 모델의 파라미터가 기존 상태를 유지하게 된다.
학습이 진행되면 점차 LoRA가 영향을 줄 것이다.
허깅페이스에서 merge_and_unload()함수를 사용하면 LoRA 가중치를 병합하여 base 모델처럼 사용할 수 있다.
LoRA를 그럼 어떻게 적용하는가 하면,
1. Target Layer를 선정한다.
2. Low-Rank Matrix를 삽입한다. 원래 weight matrix에 직접 fine-tuning하는 게 아니라, Wa, Wb를 삽입하는 것이다.
3. 업데이트 방식을 Wx -> (W+AB)x 로 바꾼다.
4. 이렇게 학습을 진행하면 W는 고정되고, A, B만 업데이트 된다.
메모리 측면에서는 어떤 것이 좋으냐 하면,
추가 파라미터 수를 극적으로 줄일 수 있다.
만약 W:[512, 512] -> 262,144 파라미터 였다면, A:[512, 16], B:[16, 512] -> 16,384 파라미터로 감소하는 것이다.
이 LoRA는 다양한 PEFT 기법과 호환할 수 있다. 접두사 튜닝, 어댑터 등..
트랜스포머에서는 어텐션 블록에 LoRA만 적용하는 경우가 많다.
각 모델 별로 W는 공통으로 두고 Wa, Wb만 별도로 저장할 수 있다.
그럼 예를 들어 라마 7B 모델의 full checkpoint는 23GB지만, LoRA weights는 8MB 수준도 가능하다.
그래서 LoRA의 성능을 확인하면, 학습 가능한 파라미터 수는 적으면서 정확도는 높다.
PCA
이거는 데이터를 대표하는 주성분을 찾아 데이터의 차원을 압축하는 방법이다.
예를 들어 원래 15개의 feature로 데이터를 표현하고 있었는데, 그 중 의미 없는 feature들이 있었다고 생각해보자.
만약 y가 성적이라면 '키' feature는 y에 거의 영향을 미치지 않을 것이다. 이런 feature들을 말하는 것이다.
이 의미없는 변수들을 다 제거하고 총 5개의 feature만 남았다면, 이 데이터는 실제로 낮은 차원인 것이다.
이게 갑자기 왜 나왔냐면, LoRA의 rank를 설정할 때 도움이 되기 때문이다.
Rank-Stabilized(랭크 안정화된) LoRA
기존 LoRA는 scaling factor로 lora_alpha/r을 사용한다.
근데 이 rank가 커질수록 불안정해지기 때문에, 이걸 sqrt(r)로 변경한 것이 Rank-Stabilized LoRA이다.
'AI > 자연어처리' 카테고리의 다른 글
AMP, Quantization (1) | 2025.06.13 |
---|---|
Big Neural Network Training Tricks (1) | 2025.06.12 |
PEFT(Parameter Efficient Fine-Tuning) (1) | 2025.06.11 |
언어모델 (0) | 2025.04.29 |
BERT와 GPT, 트랜스포머의 변형 모델 (1) | 2025.04.29 |