Tan Kim

fine-tuning

Fine-tuning

사전 학습된 모델을 특정 도메인/태스크 데이터로 추가 학습. 모델의 동작 방식 자체를 변경.

RAG vs Fine-tuning

항목 RAG Fine-tuning
목적 지식 주입 스타일/동작 변경
최신 정보 반영 쉬움 (DB 업데이트) 어려움 (재학습 필요)
비용 추론 비용 학습 비용 (GPU)
데이터 필요량 불필요 필요 (수백~수천 샘플)
적합한 경우 사실 기반 QA 특정 형식/어조, 분류 태스크

Fine-tuning 기법

Full Fine-tuning

모든 파라미터 업데이트. 최고 성능이지만 비용 큼.

PEFT (Parameter-Efficient Fine-Tuning)

일부 파라미터만 학습해 효율적으로 미세조정.

LoRA (Low-Rank Adaptation)
  — 가중치 행렬에 저랭크 행렬 삽입
  — 학습 파라미터 수 대폭 감소 (1~5%)
  — 가장 널리 사용

QLoRA
  — LoRA + 4비트 양자화
  — 소비자급 GPU(24GB)에서 13B 모델 파인튜닝 가능

Prefix Tuning / Prompt Tuning
  — 입력에 학습 가능한 소프트 토큰 추가

데이터 형식 (Instruction Tuning)

// JSONL 형식
{"messages": [
  {"role": "system", "content": "당신은 전문 번역가입니다."},
  {"role": "user", "content": "Hello, how are you?"},
  {"role": "assistant", "content": "안녕하세요, 잘 지내고 있습니다."}
]}

OpenAI Fine-tuning

from openai import OpenAI
 
client = OpenAI()
 
# 파일 업로드
file = client.files.create(
    file=open("training_data.jsonl", "rb"),
    purpose="fine-tune"
)
 
# 파인튜닝 시작
job = client.fine_tuning.jobs.create(
    training_file=file.id,
    model="gpt-4o-mini"
)
 
# 완료 후 사용
response = client.chat.completions.create(
    model=job.fine_tuned_model,
    messages=[{"role": "user", "content": "..."}]
)

LoRA 구현 (Hugging Face)

from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model, TaskType
 
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.2-3B")
 
lora_config = LoraConfig(
    task_type=TaskType.CAUSAL_LM,
    r=16,           # 랭크
    lora_alpha=32,  # 스케일링
    target_modules=["q_proj", "v_proj"],
    lora_dropout=0.1,
)
 
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
# trainable params: 4,194,304 || all params: 3,215,617,024 || trainable%: 0.13%

학습 팁

  • 데이터 품질 > 데이터 양
  • 최소 수백 개 샘플 권장 (태스크 복잡도에 따라 다름)
  • 학습률은 사전학습보다 낮게 (1e-4 ~ 1e-5)
  • Overfitting 주의 — validation loss 모니터링

메모