SFT 사고의 대부분은 하이퍼파라미터가 아니라 템플릿-마스킹-EOS 처리의 불일치에서 난다. 학습이 "돌아가는 것"과 "제대로 되는 것"의 차이를 만드는 디테일들 — 이번 글은 그 실무 매뉴얼이다.
세 가지 핵심 메커니즘
- Chat Template (HF 문서) — 대화(messages 리스트)를 모델별 학습 포맷 문자열로 바꾸는 Jinja 템플릿. ChatML의 <|im_start|>, Llama 포맷 등 모델마다 다르다. SFT 실패의 최다 원인이 학습 템플릿과 추론 템플릿의 불일치 — 반드시 같은 apply_chat_template으로 통일하고, 추론 시 add_generation_prompt를 빼먹으면 모델이 답변을 시작하지 못하는 전형적 버그가 난다.
- Loss Masking — 지시문 토큰에도 loss를 걸 것인가? NeurIPS 2024 연구의 답: 일반적 대규모 SFT는 completion-only가 안전한 기본값이지만, "긴 프롬프트 + 짧은 응답" 데이터나 소량 데이터에서는 지시문 loss가 정규화로 작동해 오히려 낫다. 2025년의 후속(WIT)은 프롬프트에 0.1~0.5의 낮은 가중치를 주는 중간 지대가 가장 견고하다고 보고. 개념 정리는 Raschka의 해설이 최고다: "마스킹은 스위치가 아니라 내 데이터가 어떤 분포를 배워야 하는가에 대한 답."
- Packing (Packing Analysis, ACL 2025) — 짧은 샘플들을 한 시퀀스로 이어붙여 패딩 낭비를 없애는 기법. 체계 비교 결론: 학습 시간을 크게 줄이면서 성능도 대체로 더 좋고, 모델·데이터가 클수록 유리. 수만 건 이상이면 packing=True가 기본값.
검증된 하이퍼파라미터 출발점
- Tülu 3 (2024) — full SFT 기준: 8B는 LR 5e-6, 70B는 2e-6, 2 epoch, 유효 배치 128, 시퀀스 4096. 원칙: 모델이 클수록 LR은 낮게.
- Zephyr (2023, HF) — 7B 표준 레시피의 원형: peak LR 2e-5, cosine, warmup 10%, packing. alignment-handbook의 YAML을 그대로 복사해 시작할 수 있다. 두 레시피를 합치면: full SFT LR은 2e-6~2e-5 범위, 데이터가 클수록 낮게.
- Secret Recipe (2024, IBM) — 3B-7B 소형 모델 대규모 그리드 실험: 큰 배치+낮은 LR 조합의 우위, 단계별 커리큘럼보다 데이터를 섞어 한 번에(stacked), 그리고 초반 몇백 스텝의 추이가 최종 성능의 좋은 예측자다 — 나쁜 run은 조기 중단하라.
- NEFTune (2023) — 임베딩에 노이즈를 더하는 한 줄 정규화로 AlpacaEval 승률 29.8→64.7% 사례. 거의 공짜지만, 효과가 대화체 벤치마크에 집중되고 지식 벤치마크(MMLU)에는 무영향이라는 한계도 알아둘 것.
망각 방지와 도구
퇴행("SFT 후 MMLU가 떨어졌다")의 처방 셋: 일반 instruction 데이터 replay 혼합(근거), LoRA 선택(⑤편의 forgets-less), 낮은 LR. 구현은 TRL SFTTrainer가 표준(completion_only_loss, assistant_only_loss, packing, neftune_noise_alpha 전부 플래그), 멀티턴의 턴별 마스킹·EOS 제어가 필요하면 Axolotl(roles_to_train, train_on_eos)이 더 세밀하다.
정리
한 줄 교훈: 학습 전에 토큰화된 샘플 몇 개를 눈으로 디코딩해서 정확히 어떤 토큰에 loss가 걸리는지 확인하라. 대부분의 SFT 사고는 거기서 예방된다. 다음 글: SFT 다음 단계 — 선호 최적화(RLHF, DPO, GRPO).
— All about SFT 시리즈 ⑥ / 다음 글: SFT 다음 단계, 선호 최적화
댓글 없음:
댓글 쓰기
국정원의 댓글 공작을 지탄합니다.