⭐ 파인 튜닝 (Fine-tuning)
- 이미 학습된 대규모 언어 모델(LLM)을 특정 작업이나 데이터셋에 맞춰 재학습시키는 과정
- 모델이 특정 도메인 또는 작업에서 최적의 성능을 발휘하도록 조정하는 기술
- 특정 데이터에서 더 높은 정확도와 일관성을 제공할 수 있지만 데이터 준비와 학습 비용이 많이 듦
- 학습 과정: 파라미터를 업데이터하는 것
01. 파인 튜닝의 주요 기법
- `PEFT (Parameter-Efficient Fine-Tuning)`
- 대표적인 기법: LoRA (Low-Rank Adaptation)
- 특징
- 거대한 모델 전체를 학습하지 않고, 적은 파라미터만 조정
- 모델 크기에 비해 연산 비용을 절감할 수 있음
- `RLHF (Reinforcement Learning with Human Feedback)`
- 주요 원리
- 모델이 다양한 답변을 생성
- 사람이 가장 적절한 답변을 선택
- 보상 신호를 이용해 모델을 최적화
- 활용 분야
- 대화형 AI
- 윤리적 AI 모델 개발
- 사용자 맞춤형 추천 시스템
- 주요 원리
01 - 01. PEFT (Parameter Efficient Fine-Tuning)
- 모델 전체를 재학습이 아닌 일부 파라미터만 조정해 학습 비용을 줄이는 방법
- 메모리와 계산 비용이 감소해 효율성 증대에 활용
- 일부 하위 집합만 업데이트
01 - 01 - 01. PEFT 주요 기법
- LoRA (Low-Rank Adaption)
- 모델의 큰 파라미터 매트릭스를 조정하지 않고, 저랭크 매트릭스를 추가해 학습
- 즉, 사전 학습된 모델의 가중치는 변경하지 않고, 새로운 저랭크 매트릭스를 학습시킴
- -> 전체 파라미터를 학습하지 않고, 기존 사전 학습된 파라미터는 그대로 유지한 채로 저랭크 행렬을 추가해서 기존 사전 학습된 파라미터와 저랭크 행렬을 더해 파라미터를 만듦
- 작동 원리
- X: d행 배열
- r: 랭크의 차원 수
- W + \Delta W = Pretrained Weight + A \cdot B (A: 저랭크 행렬, B: 저랭크 행렬)
- 사전학습된 기존 가중치(Pretrained Wights)와 새롭게 학습시킨 저랭크 매트릭스 (Low-Rank 행렬) 결과를 더해서 추가 파라미터를 만들어줌
# LoRA
from peft import LoRAConfig, get_peft_model
from transformers import AutoModelForCausalLM
# 모델과 LoRA 구성
base_model = AutoModelForCausalLM.from_pretrained("gpt2")
lora_config = LoRAConfig(
r=8, lora_alpha=32,
target_modules=["query", "value"],
lora_dropout=0.1
)
model = get_peft_model(base_model, lora_config)
# 모델 학습
model.train()
- Q-LoRA (Quantized LoRA)
- LoRA 기법을 양자화(큰 그릇에 있는 걸 작은 그릇으로 옮겨 담기)하여 GPU 메모리 사용량을 줄이고 학습 비용을 절감하는 방법
- 부동소수점 숫자의 표현 방식을 단순화하는 기법 (정수형 변환 or 비트 수 줄이기)
- 모델의 가중치와 파라미터를 효율적으로 저장하고 처리하는 것
- 작동원리
- 4-bit NormalFloat (NF4) 양자화를 적용하여 모델의 가중치를 압축
- LoRA와 결합하여 저비용으로 고효율 파인튜닝
# Q-LoRA
from transformers import AutoModelForCausalLM
from peft import LoRAConfig, get_peft_model
import torch
# 양자화된 파라미터를 위한 설정
class QLoRAConfig(LoRAConfig):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.quantization_bits = 4 # 4-bit 양자화 설정
self.quantization_dtype = torch.float16 # 양자화 데이터 타입
# 모델
base_model = AutoModelForCausalLM.from_pretrained("gpt2")
# LoRA와 Q-LoRA 설정
q_lora_config = QLoRAConfig(
r=8, # low-rank 차원
lora_alpha=32, # LoRA의 알파 값
target_modules=["query", "value"], # LoRA로 수정할 레이어
lora_dropout=0.1, # LoRA 드롭아웃
quantization_bits=4, # 4-bit 양자화
quantization_dtype=torch.float16 # 양자화 데이터 타입 (float16)
)
# Q-LoRA 모델 생성
q_lora_model = get_peft_model(base_model, q_lora_config)
# 모델 학습
q_lora_model.train()
# 훈련할 때 기본적으로 메모리 절약과 효율적인 양자화가 적용
- DoRA (Decomposed LoRA)
- LoRA 기법을 확장해 더 정밀한 파인튜닝을 수행하는 방법으로, 기존 LoRA의 저랭크 행렬을 더 세분화해 학습이 가능하도록 설계
- Soft Prompts
- 입력 데이터에 명시적인 프롬프트 대신 학습 가능한 임베딩 벡터를 사용하는 것
- 파인튜닝보다 가볍게 사용 가능
- 적용 방식에 따라 파인튜닝보다 높은 성능을 내는 경우도 있음
- 장점
- 프롬프트 엔지니어링의 한계를 극복
- 모델의 파라미터를 고정한 상태에서 작업 학습이 가능
- 모델의 파라미터를 고정한 상태라는 것에서 peft 기법 중 하나임을 알 수 있음
- 작동 원리
- 모델이 사전학습해서 가지고 있는 파라미터는 frozen 해놓고
- 추가적으로 넣어주는 입력 벡터로 학습을 진행
01 - 02. RLHF (Reinforcement Learning from Human Feedback)
- 사람의 피드백을 활용해 모델의 성능을 개선하는 강화 학습 방법
01 - 02 - 01. PPO 방식
- Poximal Policy Optimization
- 사람 피드백으로 학습된 보상 모델(reward model)을 기반으로, PPO 알고리즘으로 정책을 미세조정
- 과정
- 1. Supervised fine-tuning (SFT): 사람이 만든 좋은 답변으로 LLM 학습
- 2. Reward Model 학습: 사람 피드백을 학습해서 보상 모델을 만듦
- 3. PPO로 정책 미세 조정: LLM을 rollout 시키고, reward model로 점수를 받은 뒤 PPO로 업데이트
01 - 02 - 02. DPO 방식
- Direct Preference Optimization
- 보상 모델 과정을 생략하고, 사용자의 선호도에 따라 미세조정
- 핵심 아이디어
- a가 b보다 더 낫다는 사람의 선호 쌍 정보를 기반으로 LLM을 직접 분류기처럼 학습시킴
- 장점
- 보상 모델 학습이 불필요해 PPO보다 훨씬 단순한 구현이 가능함
'이것저것' 카테고리의 다른 글
[RLHF] DPO (Direct Preference Optimization) 기법 (0) | 2025.05.02 |
---|---|
알고리즘 문제 풀기 튜토리얼 02 - github에 코드 업로드, pr 올리기 (0) | 2025.03.02 |
[SK네트웍스 Family AI 캠프 11기] 1차 프로젝트 회고 (0) | 2025.02.28 |
알고리즘 문제 풀기 튜토리얼 01 (0) | 2025.02.19 |
Windows 환경에서 oh-my-posh를 사용한 터미널 커스텀 (+VSCode 터미널, 글자 깨짐 해결) (0) | 2025.02.12 |