※ 'LLM을 활용한 실전 AI 애플리케이션 개발' 책을 정리한 내용입니다.
LLM과 같은 기반 모델의 크기가 커지면서 하나의 GPU를 사용해 모든 파라미터를 학습하는 전체 미세 조정(full fine-tuning)을 수행하기 어려워졌다. 하지만 대부분의 개인과 조직은 여러 GPU를 사용해 모델을 학습시키기 어렵기 때문에 일부 파라미터만 학습하는 PEFT(Parameter Efficient Fine-Tuning) 방법 연구가 확발히 이뤄지고 있다.
LoRA(Low-Rank Adaptation)
모델 파라미터를 재구성(reparameterization)해 더 적은 파라미터를 학습함으로써 GPU 메모리 사용량을 줄인다. LoRA에서 파라미터 재구성은 행렬을 더 작은 2개의 행렬의 곱으로 표현해 전체 파라미터를 수정하는 것이 아니라 더 작은 2개의 행렬을 수정하는 것을 의미한다.
이를 쉽게 이해하기 위해서는 원래 파라미터 W를 학습시키기 위해서는 n차원인 입력 X와 파라미터를 곱해 최종적으로 n차원인 출력 h를 생성해 낸다. 즉 n이 100이라면 파라미터 W를 학습시키기 위해서는 총 10,000개의 파라미터를 학습시켜야하는것이다.
하지만, 파리미터 W를 고정하고 차원이 (d,r)인 행렬 A와 차원이(r,d)인 행렬 B의 곱을 학습시킨다. 행렬의 곱셈에서 (d,r)차원인 행렬과 (r,d) 차원인 행렬이 곱해지면 (d,d) 차원이 된다. 행렬을 2개 학습하지만 r을 d보다 작은 수로 설정하는 경우 파라미터 W를 학습시킬 때보다 훨씬 적은 파라미터 업데이트로 모델을 학습시킬 수 있다.
위 그림처럼 기존 파라미터 W에 새로운 행렬을 추가시켜서 학습하는데 왜 GPU 메모리 사용량이 줄어드는 이유는 행렬 A와 B가 파라미터 W에 비해 훨씬 작다고는 하더라도 파라미터가 추가되는 것이기 때문에 모델 파라미터 용량 자체는 아주 작게 증가한다. 하지만 GPU 메모리에는 모델 파라미터뿐만 아니라, 그레이디언트와 옵티마이저 상태가 저장이 되는데, LoRA에서 사용한 행렬 A와 B는 어댑터로, 어댑터를 사용하게 되면 그레이디언트와 옵티마이저는 그레이디언트를 계산하지 않거나 어댑터의 파라미터만을 옵티마이저로 계산하게 된다. 그러므로 그레이디언트와 옵티마이저를 저장하는데 필요한 메모리가 줄어들기 때문에 전체적으로 GPU 메모리 사용량을 줄일 수 있는 것이다.
LoRA를 사용할 때에는 파라미터 W에 더할 행렬 A와 B를 만들 때 차원 r을 몇으로 할지 정해야 한다. r을 작게 설정하면 학습시켜야 하는 파라미터의 수가 줄어들기 때문에 GPU 메모리 사용량을 더 줄일 수 있다. 하지만 r이 작아질 경우 그만큼 모델이 학습할 수 있는 용량(capacity)가 작아지기 때문에 학습 데이터의 패턴을 충분히 학습하지 못할 수 있으므로 적절한 r 값을 설정해야 한다.
알파(alpha)
추가한 파라미터를 기존 파라미터에 얼마나 많이 반영하지 결정하는 것이다. 사용 방법은 행렬 A와 B 부분을 (알파/r)만큼의 비중으로 기존 파라미터 W에 더해준다. 알파가 커질수록 새롭게 학습한 파라미터의 중요성을 크게 고려한다는 것이다.