본문 바로가기

논문읽기

LoRA(LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGEMODELS ) 논문읽기

LoRA는 LLM 모델을 학습시키는데 요즘 거의 빼놓지 않고 등장하는 finetuning 기법이다. LLM모델을 full finetuning시키자니 메모리나 특히 시간적 압박 등이 많으니 뭔가 더 효율적으로 학습시킬 수 없을까 하는 컨셉으로 나온 듯하다.

기존의 full finetuning에 비해서 아주 적은 비율의 파라미터만 학습시키는 정도로도 full로 학습시키는것과 비등(일부에서는 더 나은 결과를 보인다고 함)하니 LoRA를 도입하지 않을 이유가 없다.

기존에도 transformers 라이브러리에서 계속 도입하고 있었으나, 더 자세히 배경과 원리를 알기위해 논문을 읽어보았다.

 

full finetuning시 학습시간, 메모리, 스토리지 사용량 등에서 한계점이 있어서 이에 대응하여 등장한 개념으로 19년도에 adapter의 도입이 제안됨.(parameter-Efficient Transfer Learning for NLP논문 참조)

19년도에 제안된 형태는 아래와 같이 MLP layer뒤에 transformer layer안에 총 두번의 adapter layer를 넣어서 추가적인 parameter를 통해 finetune을 효율적으로 시키겠다는 아이디어였음

그러나 위의 구조로 알 수 있듯, 처음의 adapter는 추가적인 layer가 직렬형태로 삽입되어서 inference시에도 latency가 기존의 original모델보다 생긴다는 단점이 있었다.

따라서 본 논문에서는 그러한 latency가 없으면서도 full finetuning과 비슷한 성능을 보이는 효율적인 테크닉인 LoRA (Low Rank Adaptation)을 제안함.

LoRA는 간단한 직관을 가진 컨셉으로 아래의 식으로 전부 이해할 수 있음.

식에서와 같이 finetune으로 학습되는 metrices를 \triangle W라고 표현했을 때, 이를 BA라는 두 metrices의 곱으로 decompose할 수 있다고 가정하고

 

△W 는 (d,k)의 크기을 가진 matric라면, B와 A는 각각 (d,r), (r,k)의 크기를 가진 차원으로 decompose할 수 있고, 논문의 목적상 r은 d나 k보다 작은 수이기 때문에 더 효율적으로 metrics를 쪼개어 학습할 수 있다는 개념을 소개한다.

 

식을 봐서도 알 수 있지만 아래의 그림을 봤을때, 기존의 adapter와 달리, 원래의 parameter에 병렬로 더해지는 B,A행렬을 도입한 것이기 때문에 inference시 latency가 생기지 않는다는 장점이 있다.

또한, 왼쪽의 파란색의 W_0 metrics는 freeze하고 오른쪽의 B,A로만 학습시 gredient를 보내기 때문에, 학습 시 optimizer에서 잡아먹는 메모리 또한 절약할 수 있다.

 

B,A를 어떤 weight에 추가적으로 도입하는게 좋은가에 대한 논의는 아래와 같다.

위의 표를 보면, 최소한 query와 value에 대한 weight에서 LoRA를 도입하는게 좋은 성능을 나타냈다고 한다.

 

그럼 위에서 B와 A는 각각 (d,r), (r,k)의 크기로 decompose한다고 하였을때, r의 크기는 어떻게 정하는 것이 좋을까? 논문에서 실험한 셋팅은 d,k의 크기는 불변이고 r의 크기만 바꿔가며 실험하였기에 개인적인 생각으로는 d,k의 크기에 따라서도 추가적인 실험이 필요하지 않나 싶긴 하다. 일단 논문에서의 실험 결과를 보자.

위의 결과를 보면 약간 놀랍게도 r을 높이지 않고 1,2정도로 설정해도 높은 성능을 보이는 것을 알 수 있다. 다만, q에 대해서보다는 위의 표에서와 같이 최소 q,v는 adaptation을 적용할 때의 성능이 월등히 좋다.