SDFT: 자기 증류로 망각 없이 학습하기
복잡한 강화학습 없이, 모델이 스스로를 선생님 삼아 새로운 기술을 배우면서도 기존 능력을 유지하는 방법.

SDFT: 자기 증류로 망각 없이 학습하기
복잡한 강화학습 없이, 모델이 스스로를 선생님 삼아 새로운 기술을 배우면서도 기존 능력을 유지하는 방법.
TL;DR
- 문제: 기존 SFT는 새로운 것을 배우면 이전 것을 잊음 (Catastrophic Forgetting)
- 해결: SDFT (Self-Distillation Fine-Tuning) - 자기 증류 미세조정
- 핵심: 모델이 demonstration을 조건으로 받아 스스로 학습 신호 생성 (On-policy)
- 결과: 망각 없이 여러 기술을 순차적으로 학습 가능
1. 왜 SFT는 망각을 유발하는가?
Supervised Fine-Tuning의 한계
기존 SFT 방식의 문제:
python
학습 데이터 분포 ≠ 모델의 현재 출력 분포| 특성 | SFT | 문제점 |
|---|---|---|
| 학습 방식 | Off-policy | 정답 데이터만 보고 학습 |
| 분포 차이 | 큼 | 모델 출력과 학습 데이터 괴리 |
| 결과 | 망각 | 새 데이터로 기존 분포 덮어씀 |
Off-policy vs On-policy
Off-policy (SFT):
python
모델 출력: "The cat sat on the..."
정답 레이블: "A feline rested upon the..."
→ 모델의 자연스러운 출력 무시하고 강제 학습On-policy (SDFT):
python
모델 출력: "The cat sat on the mat."
학습 신호: 모델 자신의 출력에서 생성
→ 현재 분포를 유지하면서 개선2. SDFT: 자기 증류 미세조정
핵심 아이디어
모델에게 시연(demonstration)을 보여주고, 그 지식을 기반으로 모델 스스로가 학습 데이터를 생성하게 한다.
작동 방식
python
1. Demonstration 제공
[예시 입력] → [예시 출력]
2. 모델이 조건부 생성
π(y|x, demonstrations)
3. 생성된 데이터로 자기 학습
모델 출력 → 학습 신호수식으로 표현
기존 SFT 목표:
SDFT 목표:
차이점: $y$가 고정된 정답이 아니라 모델 자신이 생성한 출력.
3. 왜 SDFT가 효과적인가?
분포 유지의 중요성
python
SFT: P_model → P_new_data (기존 분포 파괴)
SDFT: P_model → P_model + Δ (기존 분포 보존하며 개선)자기 증류의 장점
| 측면 | SFT | SDFT |
|---|---|---|
| 학습 신호 | 외부 데이터 | 모델 자체 생성 |
| 분포 변화 | 급격함 | 점진적 |
| 기존 능력 | 손실 | 보존 |
| 보상 함수 | 필요 없음 | 필요 없음 |
RL과의 비교
강화학습도 on-policy지만:
- RL: 보상 함수 필요 (설계 어려움)
- SDFT: 보상 함수 불필요 (demonstration만 있으면 됨)
4. 실험 결과
연속 학습 성능
논문의 주요 실험 결과:
| 메트릭 | SFT | SDFT |
|---|---|---|
| 새 작업 정확도 | 기준 | 더 높음 |
| 기존 작업 유지 | 급격히 저하 | 대부분 유지 |
| 다중 작업 축적 | 성능 퇴화 | 지속적 개선 |
순차 학습 시나리오
python
작업 순서: Task A → Task B → Task C
SFT 결과:
- Task A: 90% → 60% → 40% (계속 하락)
- Task B: — → 85% → 55%
- Task C: — → — → 80%
SDFT 결과:
- Task A: 90% → 88% → 86% (거의 유지)
- Task B: — → 85% → 83%
- Task C: — → — → 82%5. 구현 개념
Pseudo-code
python
def sdft_training_step(model, input_x, demonstrations):
# 1. Demonstration을 조건으로 모델 출력 생성
with torch.no_grad():
# In-context learning으로 출력 생성
y_generated = model.generate(
input_x,
context=demonstrations,
temperature=1.0
)
# 2. 생성된 출력으로 학습 (on-policy)
loss = -model.log_prob(y_generated, given=input_x)
return loss핵심 구성요소
- Demonstration 조건화: 모델에 예시를 보여줌
- 자기 생성: 모델이 직접 출력 생성
- On-policy 학습: 생성된 출력으로 자기 학습
6. 한계와 고려사항
현재 한계
| 한계 | 설명 |
|---|---|
| Demonstration 품질 | 좋은 예시가 필요 |
| 생성 비용 | 매 학습 시 생성 필요 |
| 초기 모델 의존 | 기본 능력이 있어야 증류 가능 |
적용 시 고려사항
- Demonstration 선택: 대표적이고 다양한 예시 필요
- 생성 다양성: Temperature 조절로 다양한 출력 유도
- 학습률 조절: 너무 빠른 학습은 여전히 망각 유발
7. 실용적 시사점
언제 SDFT를 쓸까?
✅ 적합한 경우:
- 모델을 지속적으로 업데이트해야 할 때
- 새 도메인 적응이 필요하지만 기존 능력 유지 필요
- 보상 함수 설계가 어려운 상황
❌ 부적합한 경우:
- 완전히 새로운 능력 학습 (기존 모델에 관련 지식 없음)
- 빠른 one-shot 적응이 필요한 경우
미래 전망
SDFT는 대규모 언어 모델의 지속적 업데이트에 핵심 기술이 될 수 있다.
- 모델 업데이트: 새 지식 추가 시 전체 재학습 불필요
- 도메인 적응: 특정 분야 특화 시 범용 능력 유지
- 안전성: 기존의 안전 학습 결과 보존
핵심 정리
| 개념 | 설명 |
|---|---|
| Catastrophic Forgetting | 새 학습이 기존 지식을 덮어쓰는 현상 |
| Off-policy (SFT) | 외부 데이터 분포로 학습 → 망각 유발 |
| On-policy (SDFT) | 모델 자체 분포에서 학습 → 망각 방지 |
| Self-Distillation | 모델이 스스로를 선생님 삼아 학습 |
| Demonstration-conditioned | 예시를 조건으로 모델 출력 유도 |
참고 자료
- 논문: Self-Distillation Enables Continual Learning
- 프로젝트 페이지: https://self-distillation.github.io/SDFT.html
- 저자: Idan Shenfeld, Mehul Damani, Jonas Hübotter, Pulkit Agrawal (MIT CSAIL)
이메일로 받아보기
관련 포스트

Models & Algorithms
TurboQuant vLLM, A100 한 장에서 실측 — 8B 모델에서 프리셋 4개의 용량·속도·정확도
vLLM 0.28, Qwen3-8B bf16, A100 80GB: bf16·fp8·TurboQuant 프리셋 4개의 KV 용량, 배치 처리량, 32K 디코드, needle-in-haystack, GSM8K를 직접 쟀습니다. vLLM 연구가 다루지 않은 8B 크기입니다.

Models & Algorithms
TurboQuant를 실제 KV 텐서 위에서 밑바닥부터 — 3비트의 진짜 비용, 그리고 포크가 논문 레이아웃을 이기는 이유
PolarQuant를 PyTorch 60줄로 구현해 Llama-3.2-1B·Qwen3-8B의 실제 KV에 적용. 3비트는 +10%, k8v4는 +0.2%, QJL은 저비트에서만 유효, 블록-32 레이아웃이 포크 우위의 절반을 설명합니다.

Models & Algorithms
TurboQuant llama.cpp CUDA 포크, A100에서 실측 — turbo4는 q4_0급, turbo3는 긴 컨텍스트에서 무너진다
Qwen3-8B Q4_K_M, A100 한 장, KV 타입 6종: perplexity·프리필·깊이별 디코드·VRAM 실측. turbo4는 q4_0과 품질 동급에 깊은 컨텍스트에선 q8_0보다 2.5배 빠르고, turbo3는 32K에서 PPL이 세 배로 뜁니다.