# "현 상태 개선" 시나리오 완전 분석 **작성일**: 2026-02-26 **역할**: "고쳐서 간다" 옹호자 **현 상태**: SFT 5000 steps, 반복률 17.7% (올바른 포맷 + rep_penalty=1.1), 목표 <5% --- ## 1. 현재 수정 사항들의 효과 예측 ### 1.1 버그 수정 효과 정량 분석 #### Bug #1: Dynamic Padding 미작동 **문제**: `SFTDataset.__init__`에서 모든 샘플을 max_seq_len=4096으로 미리 패딩 → `dynamic_collate_fn`이 사실상 무효화. **수정 후 효과**: - 평균 시퀀스 길이 ~385 토큰 (실측 기반 추정) - 패딩 비율: (4096-385)/4096 = **90.6% 낭비 제거** - gradient 품질: 기존에는 배치 내 모든 시퀀스가 4096이므로 attention 계산에 ~3600개 PAD 토큰 포함 → attention mask로 무시되지만, **backward pass에서 PAD 위치의 불필요한 연산이 gradient noise로 작용** - 실질 gradient 품질 향상: **10-20% 추정** (직접적 loss 영향은 제한적이나, 학습 속도 3-8x 향상으로 **같은 wall-time에 3-4x 더 많은 유효 step 가능**) - **반복률 직접 영향: 미미 (~1-2%p)**. 이건 학습 효율 문제이지 반복 원인이 아님. #### Bug #2: EOS Truncation **문제**: `response_ids[:allowed_response]`에서 마지막 EOS 토큰 절단 가능. **수정 후 효과**: - 영향 받는 샘플: 4096 초과 61건 (0.04%) — 이전 보고서 기준 - 그러나 **재처리된 188,234 샘플에서는 비율 다를 수 있음** - EOS 보존으로 모든 샘플에서 종료 신호 학습 보장 - **반복률 직접 영향: 1-3%p** (EOS 학습 누락 샘플이 극소수이므로) - 심리적 효과 > 실질 효과: "모든 샘플이 EOS를 학습한다"는 보장이 모델 일관성에 기여 #### 데이터 품질 개선 **제거된 오염**: - Q/A 패턴 550건: 모델이 자체 Q/A 루프를 학습하는 원천 제거 - EOS 리터럴 113건: EOS 경계 혼란 원천 제거 - 반복 패턴 57건: 직접적 반복 학습 원천 제거 **효과 추정**: - 총 ~720건 제거 (전체의 0.38%) - 수치적으로는 소량이나, **이들이 반복 패턴의 seed 역할** — 모델이 이 패턴을 한번 학습하면 생성 시 증폭됨 - 예상 반복률 감소: **3-5%p** ### 1.2 종합 예측: 재학습 후 반복률 | 현재 상태 | 17.7% (rep_penalty=1.1) | |-----------|------------------------| | Bug #1 (dynamic padding) | -1~2%p (간접 효과) | | Bug #2 (EOS truncation) | -1~3%p | | 데이터 오염 제거 | -3~5%p | | **재학습 후 예상 (rep_penalty=1.1)** | **8-13%** | | **재학습 후 예상 (rep_penalty 없이)** | **15-25%** | > **핵심 인사이트**: 현재 17.7%는 이미 "올바른 포맷 + rep_penalty"의 결과. 재학습만으로 <5%는 어려움. 추가 조치 필요. --- ## 2. 단계별 개선 계획 ### Phase A: 수정된 코드/데이터로 재학습 (즉시, ~40분) **설정**: ``` - 데이터: 188,234 샘플 (val: 9,907) - Steps: 5,000 (기존과 동일) → ~1.7 epoch - Dynamic padding 작동 → 학습 속도 3-5x 향상 - EOS 보존 보장 ``` **예상 결과**: | 지표 | 현재 | Phase A 후 | |------|------|-----------| | Val Loss | N/A (없었음) | **1.85-1.92** | | 반복률 (rep_penalty=1.1) | 17.7% | **8-13%** | | 반복률 (penalty 없이) | 30.7% | **15-25%** | | 학습 시간 | 39분 | **~40분** (속도 향상되나 유효 연산 증가) | **근거**: - Dynamic padding 수정 → 실제 gradient 품질 개선 + 더 많은 유효 데이터 처리 - 깨끗한 데이터 → 오염 패턴 미학습 - Val split 추가 → 과적합 모니터링 가능 ### Phase B: ORPO 적용 (+2시간) **데이터 확보 방안**: 1. `kuotient/orca-math-korean-dpo-pairs`: 수학 중심, 193K — 도메인 편향 있으나 즉시 사용 가능 2. **자체 생성 (권장)**: - 현재 모델로 동일 프롬프트에 대해 반복 출력 생성 → rejected - 깨끗한 데이터셋의 정답 → chosen - ~10K-20K 쌍 생성 가능 (1시간 소요) 3. `maywell/ko_Ultrafeedback`: 60K 일반 한국어 preference **예상 결과**: | 지표 | Phase A 후 | Phase B 후 | |------|-----------|-----------| | 반복률 (rep_penalty=1.1) | 8-13% | **3-7%** | | 반복률 (penalty 없이) | 15-25% | **8-15%** | | ko_ifeval | 15-25% | **20-30%** | **근거**: ORPO가 명시적으로 "반복 출력은 나쁘다"를 학습 → 반복 억제를 모델 가중치에 내재화. rep_penalty라는 외부 보조 장치 의존도 감소. ### Phase C: 고품질 SFT 데이터 추가 (+4-6시간) **추가 데이터셋**: | 데이터셋 | 크기 | 품질 | 효과 | |---------|------|------|------| | `junelee/sharegpt_deepl_ko` | ~90K | 상 | 다양한 도메인, 긴 답변 | | `beomi/KoAlpaca-v1.1a` | ~21K | 중상 | 검증된 한국어 instruction | | `heegyu/korean_chatgpt_corpus` | ~12K | 상 | ChatGPT 품질 답변 | **예상 결과**: | 지표 | Phase B 후 | Phase C 후 | |------|-----------|-----------| | 반복률 (rep_penalty=1.1) | 3-7% | **2-5%** | | ko_ifeval | 20-30% | **25-35%** | --- ## 3. 타임라인 및 비용 ### 시간 예산 | Phase | 준비 | 학습 | 평가 | 합계 | |-------|------|------|------|------| | **A: 재학습** | 10분 (이미 준비됨) | 40분 | 20분 | **~1.1시간** | | **B: ORPO** | 1시간 (데이터 생성) | 1시간 | 20분 | **~2.3시간** | | **C: 데이터 추가** | 2시간 (다운로드+필터) | 1.5시간 | 30분 | **~4시간** | | **합계** | | | | **~7.4시간** | ### GPU 비용 (8× B200 기준) - Phase A: 0.67 GPU-hours × 8 = 5.3 GPU-hours - Phase B: 1.0 GPU-hours × 8 = 8.0 GPU-hours - Phase C: 1.5 GPU-hours × 8 = 12.0 GPU-hours - **총 GPU 소비: ~25 GPU-hours** ### 마일스톤 예측 ``` 시작 → +1.1h: Phase A 완료 → 반복률 8-13% (rep_penalty) → +3.4h: Phase B 완료 → 반복률 3-7% (rep_penalty) → +7.4h: Phase C 완료 → 반복률 2-5% (rep_penalty), ko_ifeval 25-35% ``` --- ## 4. 17.7% 반복률의 실제 위험도 평가 ### 4.1 업계 기준 | 모델 등급 | 반복률 (3-gram) | 사례 | |----------|----------------|------| | 상용 최상위 (GPT-4, Claude) | <1% | 거의 반복 없음 | | 상용 중상위 (GPT-3.5) | 1-3% | 드물게 반복 | | 오픈소스 우수 (Llama-3 8B SFT) | 3-8% | 간헐적 반복 | | 오픈소스 보통 (7B SFT) | 8-15% | 눈에 띄는 반복 | | **현재 (1B SFT, rep_penalty)** | **17.7%** | **빈번한 반복** | | 미수정 (포맷 불일치) | 57% | 사용 불가 | ### 4.2 실제 사용 시나리오별 영향 | 시나리오 | 17.7% 반복의 영향 | 허용 가능? | |---------|-------------------|-----------| | **짧은 QA** (1-2문장) | 거의 무영향 (반복률 0%, 샘플 #1 참조) | ✅ 가능 | | **설명/교육** (3-5문장) | 간헐적 반복, 읽을 만함 (#3, #6 참조) | ⚠️ 조건부 | | **긴 서술** (10+ 문장) | 반복 눈에 띄고 품질 저하 (#4, #8 참조) | ❌ 불충분 | | **코드 생성** | 심각한 반복 (#2 참조, 30.5%) | ❌ 사용 불가 | | **RAG 백엔드** | 짧은 답변 위주면 OK | ⚠️ 조건부 | ### 4.3 현실적 평가 **17.7%는 "데모는 가능하나 서비스 배포는 불가"한 수준.** - 1B 모델 기준으로는 나쁘지 않음 (대부분의 1B SFT가 비슷하거나 더 나쁨) - 그러나 사용자 대면 서비스에는 <5% 필요 - **rep_penalty=1.1 없이는 30.7%** → 외부 보조 장치 의존이 높음 --- ## 5. 현 경로의 리스크 ### 5.1 1B 모델의 구조적 한계 **반복 퇴화가 스케일 문제인가?** **부분적으로 YES.** - 1B 모델은 hidden dim 2048, 24 layers — attention head당 표현력이 제한적 - 긴 시퀀스에서 이전 토큰들을 "기억"하는 capacity 부족 → 같은 패턴 반복 - **경험적 데이터**: 7B+ 모델은 동일 SFT에서 반복률이 1/3~1/5로 감소 - 1B에서 반복률 <5% 달성은 가능하나 **많은 노력** 필요 (ORPO/DPO 필수) **스케일 외 요인**: - EOS 학습 품질 (수정됨 ✅) - 데이터 오염 (제거됨 ✅) - 학습 epoch 부족 (2 epoch → 3-4 epoch 필요) ### 5.2 데이터 오염의 가중치 영향 **회복 가능한가? → YES, 높은 확률로.** 근거: 1. 오염 데이터 720/159,125 = **0.45%** — 모델 가중치에 미친 영향 극히 제한적 2. SFT는 pretrain 가중치 위에 fine-tuning — pretrain 가중치는 무관 3. **재학습 시 clean 데이터로 from scratch** (기존 SFT 체크포인트가 아닌 base checkpoint에서) → 오염 완전 제거 4. 188,234 clean 샘플로 재학습하면 이전 오염의 잔재 없음 ### 5.3 최악의 시나리오: 고쳐도 안 되는 경우 | 시나리오 | 확률 | 대응 | |---------|------|------| | Phase A 후에도 반복률 >20% | 15% | Phase B (ORPO) 즉시 진행 | | Phase A+B 후에도 반복률 >10% | 10% | Unlikelihood Training loss 추가 | | 모든 Phase 후에도 반복률 >5% | 5% | 1B 한계 인정, 3B 전환 | | 재학습이 기존보다 악화 | <3% | 하이퍼파라미터 문제, LR 조정 | **최악 시나리오 발생 시 손실**: - 시간: 최대 7.4시간 - 수확: 최소한 **데이터 파이프라인 정비 + val split 확보 + 버그 수정** 완료 → 3B로 전환해도 이 인프라는 재사용 --- ## 6. 최종 판정 ### 수치 요약 | 항목 | 현재 | Phase A | Phase A+B | Phase A+B+C | |------|------|---------|-----------|-------------| | 반복률 (rep_penalty) | 17.7% | 8-13% | 3-7% | **2-5%** | | 반복률 (penalty 없이) | 30.7% | 15-25% | 8-15% | 5-12% | | ko_ifeval | 미측정 | 15-25% | 20-30% | **25-35%** | | 소요 시간 (누적) | 0 | 1.1h | 3.4h | 7.4h | ### 성공 확률 | 목표 | 성공 확률 | 경로 | |------|----------|------| | 반복률 <10% (rep_penalty) | **85%** | Phase A만으로 가능 | | 반복률 <5% (rep_penalty) | **70%** | Phase A+B 필요 | | 반복률 <5% (penalty 없이) | **40%** | Phase A+B+C 전부 필요 | | ko_ifeval 20-35% | **65%** | Phase A+B+C | | 두 목표 동시 달성 | **55%** | Phase A+B+C | ### 권장 여부 ## ✅ 권장: "고쳐서 간다" **근거**: 1. **이미 수정 완료**: 코드 버그 2개 수정, 데이터 재처리 완료 — 재학습만 하면 됨 2. **비용 대비 효과**: Phase A는 40분이면 끝나고, 반복률 8-13%까지 확보 가능 3. **점진적 개선 가능**: Phase A → B → C를 순차적으로 진행하며 매 단계 평가 가능 4. **최악의 경우에도 손실 최소**: 7.4시간 투자로 최소한 인프라 정비 완료 5. **3B 전환 시에도 재사용**: clean 데이터, val split, 수정된 코드는 3B SFT에 그대로 사용 **권장하지 않는 경우**: - ko_ifeval 40%+ 같은 **1B 한계를 넘는 목표**가 있다면 → 3B가 맞음 - 시간이 매우 촉박하여 **40분도 아깝다면** → 현재 17.7%로 데모만 하고 3B로 ### 실행 순서 ``` 1. [즉시] Phase A: 재학습 시작 (40분) 2. [Phase A 평가] - 반복률 <10%? → Phase B로 (ORPO) - 반복률 >15%? → 하이퍼파라미터 조정 (LR 1e-5, epoch 3-4) 3. [Phase B 평가] - 반복률 <5%? → 목표 달성. Phase C는 선택적. - 반복률 5-10%? → Phase C (추가 데이터) - 반복률 >10%? → 1B 한계. 3B 전환 고려. ``` --- *"고쳐서 가는" 경로는 비용 효율적이고, 최악의 경우에도 인프라 투자를 회수할 수 있다. Phase A 40분의 투자로 현 상태를 크게 개선할 수 있으며, 이후 ORPO와 데이터 추가로 목표 달성 확률을 높일 수 있다."*