파인튜닝 • 챕터 4 / 7
Instruction Tuning (IT) 은 사전 학습된 언어 모델을 특정 명령어(instruction)에 따라 응답하도록 미세 조정하는 기법입니다.
| 특징 | 설명 |
|---|---|
| 입력-출력 쌍 학습 | 명령어와 적절한 응답을 학습 |
| 제로샷/퓨샷 성능 향상 | 새로운 태스크에 대한 일반화 능력 개선 |
| 사용자 의도 파악 | 자연어 명령의 의미를 정확히 이해 |
학습 데이터의 중요성:
모델의 다양한 능력을 키우고 망각을 방지하기 위해
다양한 데이터를 섞어서 학습하는 것이 필요CPT 모델의 현재 상태:
해결 방법:
입력-출력 템플릿 학습을 위해
일반 QA 데이터 추가 필요다양성 확보:
품질 관리:
Instruction Tuning 데이터셋 구성:
일반 QA 데이터 (템플릿 학습)
도메인 특화 데이터
복잡한 추론 데이터
기본 구조:
{
"instruction": "사용자의 명령어 또는 질문",
"input": "추가 컨텍스트 (선택사항)",
"output": "모델의 기대 응답"
}예시 1: 간단한 QA
{
"instruction": "대한민국의 수도는 어디인가요?",
"input": "",
"output": "대한민국의 수도는 서울입니다."
}예시 2: 컨텍스트 기반 질문
{
"instruction": "다음 문장을 요약해주세요.",
"input": "인공지능은 인간의 학습능력, 추론능력, 지각능력을 인공적으로 구현한 컴퓨터 프로그램입니다.",
"output": "인공지능은 인간의 지능적 능력을 컴퓨터로 구현한 시스템입니다."
}대량 데이터 처리 요구사항:
리소스 선택 가이드:
| 데이터 규모 | 권장 환경 | GPU |
|---|---|---|
| 소규모 (10K 미만) | Colab 무료 | T4 |
| 중규모 (10K~100K) | Colab Pro | V100 |
| 대규모 (100K 이상) | Colab Pro+ 또는 전용 서버 | A100 |
# 일반적인 Instruction Tuning 설정
training_args = {
"learning_rate": 2e-5, # 학습률
"num_train_epochs": 3, # 에폭 수
"per_device_train_batch_size": 4, # 배치 크기
"gradient_accumulation_steps": 4, # 그래디언트 누적
"warmup_steps": 100, # 워밍업 스텝
"weight_decay": 0.01, # 가중치 감쇠
"logging_steps": 10 # 로깅 주기
}LoRA (Low-Rank Adaptation):
QLoRA (Quantized LoRA):
| 특성 | Instruction Tuning | SFT | RLHF |
|---|---|---|---|
| 데이터 형식 | Instruction-Output 쌍 | Task-specific 데이터 | Preference 데이터 |
| 학습 목표 | 다양한 명령 수행 | 특정 태스크 최적화 | 인간 선호도 반영 |
| 데이터 준비 | 상대적으로 쉬움 | 태스크별 레이블링 | 선호도 레이블링 필요 |
| 일반화 능력 | 높음 | 중간 | 높음 |
| 학습 난이도 | 중간 | 낮음 | 높음 |
Instruction Tuning:
SFT (Supervised Fine-Tuning):
RLHF (Reinforcement Learning from Human Feedback):
# 데이터 로드
import json
def load_instruction_data(file_path):
with open(file_path, 'r', encoding='utf-8') as f:
data = json.load(f)
return data
# 데이터 전처리
def format_instruction(example):
"""Instruction 형식으로 변환"""
if example.get("input"):
prompt = f"### Instruction:\n{example['instruction']}\n\n### Input:\n{example['input']}\n\n### Response:\n"
else:
prompt = f"### Instruction:\n{example['instruction']}\n\n### Response:\n"
return {
"prompt": prompt,
"completion": example["output"]
}from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model
# 기본 모델 로드
model_name = "your-base-model"
model = AutoModelForCausalLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
# LoRA 설정
lora_config = LoraConfig(
r=8,
lora_alpha=32,
target_modules=["q_proj", "v_proj"],
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM"
)
# LoRA 모델 생성
model = get_peft_model(model, lora_config)from transformers import Trainer, TrainingArguments
# 학습 인자 설정
training_args = TrainingArguments(
output_dir="./instruction_tuned_model",
num_train_epochs=3,
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
learning_rate=2e-5,
fp16=True,
logging_steps=10,
save_steps=100,
evaluation_strategy="steps",
eval_steps=100
)
# Trainer 초기화
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=eval_dataset
)
# 학습 시작
trainer.train()자동 평가:
인간 평가:
def evaluate_model(model, tokenizer, test_prompts):
results = []
for prompt in test_prompts:
inputs = tokenizer(prompt, return_tensors="pt")
outputs = model.generate(**inputs, max_length=256)
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
results.append({
"prompt": prompt,
"response": response
})
return results문제: 새로운 태스크 학습 시 이전 지식 손실
해결 방법:
문제: 학습 데이터에만 과도하게 최적화
해결 방법:
문제: GPU 메모리 부족, 학습 시간 과다
해결 방법:
| 항목 | 설명 |
|---|---|
| 목적 | 사전 학습 모델이 다양한 명령어를 이해하고 수행 |
| 데이터 | Instruction-Input-Output 형식의 다양한 데이터 |
| 방법 | 일반 QA 데이터로 템플릿 학습 후 특화 데이터로 강화 |
| 자원 | 대규모 학습 시 충분한 컴퓨팅 자원 필요 |