Large Language Model Fine-tuning에서 In-Context Learning 능력 보존하기
Preserving In-Context Learning ability in Large Language Model Fine-tuning
TL;DR Highlight
논문은 파인튜닝으로 저하되는 ICL(In-Context Learning) 능력을 보존하는 기법을 개발하여 파인튜닝 후에도 새로운 task에 대한 few-shot 학습 성능을 유지했다.
Who Should Read
LLM을 특정 도메인에 파인튜닝하면서도 범용 추론 능력을 유지하고 싶은 ML 엔지니어. 파인튜닝 후 few-shot 성능이 떨어지는 문제를 겪고 있는 개발자.
Core Mechanics
- 파인튜닝(fine-tuning)을 하면 ICL(In-Context Learning, 예시 몇 개만 보고 새 task를 푸는 능력)이 손상되는 현상이 실제로 발생함
- ICL 능력은 사전학습(pre-training) 때 형성되는데, 파인튜닝 데이터가 이 패턴을 덮어쓰는 게 주요 원인
- 파인튜닝 데이터에 ICL 형식(few-shot 예시 포함)의 샘플을 혼합하면 ICL 능력 보존에 효과적
- 특정 레이어나 파라미터가 ICL에 더 중요하게 작동하며, 이를 선택적으로 보호하는 전략이 유효
- LoRA(적은 파라미터만 학습하는 기법) 같은 파라미터 효율적 학습법이 full fine-tuning보다 ICL 보존에 유리한 경향
- ICL 보존과 task 성능은 트레이드오프 관계이며, 데이터 혼합 비율 조정이 핵심 튜닝 포인트
Evidence
- ICL 형식 데이터를 혼합했을 때 few-shot 평가 벤치마크에서 full fine-tuning 대비 ICL 성능 유의미하게 회복 (논문 본문 수치 기반)
- LoRA 방식이 full fine-tuning 대비 ICL 벤치마크 점수 하락 폭을 줄이는 효과 확인
- 파인튜닝 후 ICL 성능이 baseline 대비 최대 수십 % 하락하는 문제를 데이터 혼합 전략으로 완화 가능함을 실험으로 검증
How to Apply
- 파인튜닝 데이터셋 구성 시, 타겟 task 데이터 외에 few-shot 예시 형식(질문-예시1-예시2-정답)으로 구성된 샘플을 10~30% 비율로 섞어보면 ICL 능력 보존에 도움이 됨
- full fine-tuning 대신 LoRA나 QLoRA를 쓰는 경우, ICL 성능 하락이 덜하므로 범용 추론이 중요한 서비스라면 파라미터 효율적 방법을 우선 고려
- 파인튜닝 후 few-shot 벤치마크(예: MMLU, BBH)로 ICL 능력을 주기적으로 체크해서, 성능 하락이 감지되면 ICL 형식 데이터 혼합 비율을 높이는 방식으로 대응
Code Example
# 파인튜닝 데이터에 ICL 형식 샘플 혼합 예시 (HuggingFace datasets 기준)
from datasets import concatenate_datasets, load_dataset
# 타겟 task 데이터
task_dataset = load_dataset("your_task_dataset")
# ICL 형식으로 변환하는 함수
def to_icl_format(examples, num_shots=3):
"""
few-shot 예시를 포함한 ICL 형식으로 변환
예: [예시1 Q&A] [예시2 Q&A] [예시3 Q&A] [실제 질문]
"""
icl_samples = []
data = examples # 실제 데이터에 맞게 수정
for i in range(num_shots, len(data)):
shots = data[i-num_shots:i]
shot_text = "\n".join([f"Q: {s['input']}\nA: {s['output']}" for s in shots])
query = f"{shot_text}\nQ: {data[i]['input']}\nA:"
icl_samples.append({"text": query, "label": data[i]['output']})
return icl_samples
# ICL 형식 데이터를 전체의 20% 비율로 혼합
# (실제 구현시 데이터 구조에 맞게 조정 필요)
print("ICL 데이터 혼합 비율: 20% 권장")
print("LoRA rank: 8~16 (full fine-tuning 대신 LoRA 사용 권장)")
# LoRA 설정 예시
from peft import LoraConfig, get_peft_model
lora_config = LoraConfig(
r=16, # rank
lora_alpha=32,
target_modules=["q_proj", "v_proj"],
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM"
)
# model = get_peft_model(base_model, lora_config)Terminology
관련 논문
Neural Particle Automata: 자기조직화 파티클 시스템을 학습하는 신경망 모델
고정된 격자 대신 움직이는 파티클 위에서 동작하는 Neural Cellular Automata의 확장 버전으로, 형태 생성·포인트 클라우드 분류·텍스처 합성 등 다양한 작업에서 자기조직화 동작을 학습할 수 있다.
PyTorch Training Loop 완전 해부: 각 줄이 하는 일과 순서를 바꾸면 생기는 문제
PyTorch 학습 루프의 각 코드 줄이 왜 그 위치에 있어야 하는지, 순서를 바꾸거나 빠뜨렸을 때 어떤 문제가 생기는지를 단계별로 설명한 심층 가이드다.
좋은 Verifier도 망가질 수 있다: Self-Improving VLM이 새로운 태스크에서 오히려 퇴보하는 현상
VLM 자가학습 루프에서 verifier가 특정 태스크에 맞지 않으면 학습할수록 오히려 성능이 떨어지는데, DPO 손실값은 멀쩡히 내려가서 눈치채기도 어렵다.
Self-Distillation에서 Feedback Alignment의 역할
LLM이 스스로를 가르칠 때, 피드백을 모델의 추론 흐름에 단계별로 맞추면 GRPO보다 16점 이상 수학 추론 성능이 오른다.
작고 수정 가능한 CUDA 기반 Language Model 직접 구현체
CUDA로 작성된 GPT(Generative Pretrained Transformer) 미니멀 구현체로, 텍스트뿐 아니라 모든 바이트 스트림을 학습할 수 있어 LLM 내부 구조를 직접 뜯어보고 싶은 개발자에게 유용하다.
Stanford CS336: Language Modeling from Scratch - LLM을 처음부터 직접 만드는 강의
Stanford에서 운영하는 LLM 전 과정 구현 강의로, 토크나이저부터 데이터 수집, 트랜스포머 구현, 분산 학습, RL 기반 정렬까지 직접 코딩하며 배운다. 이론이 아닌 구현 중심이라 실제로 LLM이 어떻게 작동하는지 깊이 이해하고 싶은 개발자에게 가장 체계적인 커리큘럼 중 하나다.