Files
frankenstallm/source/eval/decision/fix_scenario.md

279 lines
11 KiB
Markdown
Raw Permalink Normal View History

# "현 상태 개선" 시나리오 완전 분석
**작성일**: 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와 데이터 추가로 목표 달성 확률을 높일 수 있다."*