[LLM] LLM 파인튜닝에 대해 (LLM, 파인튜닝, PEFT)
ChatGPT 등과 같은 AI 툴이 널리 사용되면서 LLM에 대해 정말 많은 언급이 이루어지고 있고, 여러 AI 기술 중 LLM에 대해서 관심을 갖는 사람들이 증가하고 있다.
나도 그 중 하나이다. 이번 게시글에서는 연구실에서 간단하게 해본 LLM 파인튜닝에 대한 이야기를 담아보고자 한다.
(참고로, 나는 AI에 대한 깊은 지식이 있지 않기에, 내용을 100% 신뢰하지는 말기 바란다.)
LLM(Large Language Model)
LLM, 그놈의 LLM 도대체 LLM이란 무엇일까 ?
영어로 된 약자를 풀어서 보면 단순하게 이해할 수 있다. Large Language Model, 즉 겁나 큰 언어모델이라는 뜻이다.
수많은 양의 언어 데이터가 모델에 학습되어 있다. 여기서 말하는 수많은 데이터는 기본적으로 billion 단위를 훌쩍 넘긴다.
단순하게 생각하면 정말 엄청난 양의 언어 데이터를 모델에 학습시켰기 때문에, "언어"에 대한 데이터를 잘 알고 있을 것이다.
예를 들어 영어에서 어떤 문장 뒤에는 어떤 문장이 주로 온다던가, 수많은 데이터에 의해 학습된 언어적 이해가 존재한다.
아마 단순히 모델에게 언어 데이터를 양으로 때려박았지는 않을 것이다. 좀 더 언어 데이터를 잘 이해하고 학습할 수 있도록 여러 기법들이 활용되었을 것이다.
AWS 에서는 LLM을 아래와 같이 설명하고 있다.
대규모 언어 모델(LLM)은 방대한 양의 데이터로 사전 학습된 초대형 딥 러닝 모델입니다. 기본 트랜스포머는 셀프 어텐션(self-attention) 기능을 갖춘 인코더와 디코더로 구성된 신경망 세트입니다. 인코더와 디코더는 일련의 텍스트에서 의미를 추출하고 텍스트 내의 단어와 구문 간의 관계를 이해합니다.
나도 아직 완벽하게 이해하지는 못하지만, 위 사진처럼 "인코더"와 "디코더"로 이루어져 있으며, input에 대해 인코더는 문맥을 이해하고, 디코더는 답변을 생성하는 구조인 거 같다.
위 설명(인코더, 디코더)은 LLM 구조 중 하나의 아키텍쳐이고, 여러 다양한 아키텍쳐가 존재한다.
(GPT는 디코더만 사용하고, BERT는 인코더만, T5는 둘 다 사용한다고 한다.)
이전에 학습 언어 데이터가 billion 개는 그냥 넘는다고 했는데, 정확히 말하면 LLM은 이러한 수십억 개의 문장 데이터를 바탕으로 학습하며, 이 데이터를 통해 모델 내부의 '파라미터'라는 수많은 숫자 값을 조정해 나간다.
현시점에 배포되어있는 모델은 아래와 같다.
모델명 | 기업 | 파리미터 수 |
GPT-3.5 | Open AI | 1750억 |
GPT-4 | Open AI | 1조 7천억 |
PaLM | 5400억 | |
Llama 3 | Meta | 700억 |
양질의 데이터를 제공했다는 가정 하에, LLM에서 모델 파라미터 크기가 커질수록 성능이 좋아진다고 볼 수 있다.
Fine Tuning이란?
하지만, 이러한 LLM은 다방면의 여러 데이터로 학습을 하였기 때문에 여러 지식에 대해 가볍게 답변을 할 수는 있지만, 특정 분야에 대해 깊게 질문을 이어간다면 대답을 잘 못하게 된다.
이를 보완하기 위해 우리는 특정 분야의 추가적인 정보를 더 넣는 작업을 할 수 있다. 이를 파인튜닝이라 칭한다.
위 사진처럼, 우리는 잘 학습되어 있는 모델, Base LLM을 가지고 추가적인 데이터를 학습하여 파인튜닝된 모델을 만들 수 있다.
이러한 파인튜닝을 하는 방법에는 크게 세 가지가 존재한다.
- In-context Learning
- Full Fine-tuning
- PEFT(Parameter Efficient Fine-tuning)
In-context Learning
사용자가 예제를 제공하고, 결과를 맞춰보라고 프롬프트를 작성하는 방식이다.
가중치를 따로 업데이트 하지 않고, 프롬프트 만으로 문제를 해결하는 방법이다.
- Zero-shot Learning : 예시를 주지 않고 바로 질문을 하는 방식
- Few-shot Learning : 여러 예시를 주고, 모델에게 질문을 하는 방식
Full Fine-tuning
여기부터는 실제로 가중치를 업데이트 하는 방식이다.
Full Fine-tuning은 Base Model의 모든 파라미터를 재학습한다. 즉, 모든 가중치를 업데이트 하게된다.
- 장점 : 적은 데이터로도 효과적, 정확도 높음
- 단점 : 너무 높은 계산 비용, 엄청난 GPU 요구량, 이전 내용 까먹음
실제로 Base Model의 파라미터 수가 점점 더 커지고 있기에, Full Fine-tuning은 사실상 불가능한 상태가 되어가고 있다.
거기다 연구소가 아니라면, 개인 컴퓨터 수준에서는 엄두도 못낼 것이다.
PEFT(Parameter Efficient Fine-tuning)
우리는, PEFT에 주목해야 한다.
PEFT는 전체 파라미터를 조정하는 Full Fine-tuning과는 다르게, 일부 파라미터만을 조정하여 모델의 핵심을 유지하면서 새로운 내용을 학습시킬 수 있게된다.
일부 파라미터만 학습하기 때문에, GPU 요구량과 계산 비용도 자연스레 줄어들게 된다.
그럼 어떻게 이러한 효율적인 기술을 사용하냐 ?
주로 아래와 같은 세 가지 기술을 사용한다.
- Adaptive Layes : 기존 아키텍쳐 사이에 작은 신경망을 추가한다. 학습 시 기존 파라미터를 고정시키고 Adapter 레이어의 파라미터만 학습하여 게산량을 줄일 수 있다.
- Prompt Tuning : 특정 입력에 대한 응답을 조정한다. 모델의 전체 가중치를 변경하는 게 아니라 입력 프롬프트에 해당하는 파라미터만 학습하게 된다. 프롬프트 파라미터는 모델 전체 파라미터보다 작기 때문에 학습 시간이 단축된다.
- LoRA(Low-Rank Adaptation) : 모델의 가중치 행렬에 저차원 행렬을 적용하여 원래의 가중치는 유지하고, 소수의 파라미터만 조절하는 요즘 핫한 기술
요즘은 LoRA를 더 경량화시킨 QLoRA를 많이 사용한다.
LoRA와 QLoRA에 대해서는 따로 포스팅을 해보도록 하겠다.
설명한 내용들처럼, LLM을 파인튜닝 하는 방법은 크게 세 가지가 존재하며, 현재는 PEFT 방법을 많이 사용하고 있다.
또한 PEFT의 기술 중 QLoRA 기법을 사용하여 파인튜닝을 좀 더 경량화하여 실행한다고 정리하면 좋을 거 같다.