初始化项目,由ModelHub XC社区提供模型
Model: pathcosmos/frankenstallm Source: Original Platform
This commit is contained in:
268
source/eval/debate/avengers_strategy.md
Normal file
268
source/eval/debate/avengers_strategy.md
Normal file
@@ -0,0 +1,268 @@
|
||||
# 어벤져스 팀 2번 — ORPO + 고품질 데이터로 1B 완성 전략
|
||||
|
||||
**작성일:** 2026-02-27
|
||||
**전략:** 현재 1B SFT v2 모델을 ORPO로 반복률 <5% 달성
|
||||
**현재 상태:** 반복률 18.0%, val_loss 2.2062
|
||||
|
||||
---
|
||||
|
||||
## 1. 반복률 18% → <5% 달성 로드맵
|
||||
|
||||
### Step A: 추론 파라미터 튜닝 (즉시, 0시간)
|
||||
|
||||
| 파라미터 | 현재 | 변경 |
|
||||
|----------|------|------|
|
||||
| repetition_penalty | 1.1 | **1.2** |
|
||||
| no_repeat_ngram_size | 3 | **4** |
|
||||
|
||||
**예상 반복률: 18% → 10~12%**
|
||||
|
||||
- 근거: 현재 eval에서 repetition_penalty=1.1로 측정. 1.2로 올리면 n-gram 반복이 직접 억제됨
|
||||
- 한계: 생성 품질 저하 없이 가능한 범위. 1.3 이상은 문맥 coherence 손상
|
||||
- **독립 효과:** 모델 가중치 변경 없이 즉시 적용. 다른 단계와 완전히 독립
|
||||
|
||||
### Step B: ORPO 학습 (핵심, 3~5시간)
|
||||
|
||||
**예상 반복률: 10~12% → 4~7%**
|
||||
|
||||
ORPO(Odds Ratio Preference Optimization)는 SFT + preference alignment를 단일 목적함수로 통합:
|
||||
- SFT loss로 chosen 응답 학습
|
||||
- Odds ratio로 chosen vs rejected 선호도 학습
|
||||
- DPO 대비 reference model 불필요 → 메모리/시간 절약
|
||||
|
||||
**왜 ORPO가 반복 퇴화에 효과적인가:**
|
||||
1. 반복 응답을 rejected로 명시적 학습 → 모델이 "반복하지 말라"를 직접 배움
|
||||
2. SFT만으로는 "뭘 하면 안 되는지" 학습 불가 → preference learning이 유일한 해법
|
||||
3. 1B 모델의 반복은 파라미터 부족이 아닌 **EOS 경계 학습 실패** + **반복 패턴 미벌칙** → ORPO로 직접 교정 가능
|
||||
|
||||
**필요 데이터:** 500~2000 preference 쌍 (아래 섹션 2 참조)
|
||||
|
||||
### Step C: 데이터 정제 + 추가 SFT (선택적, 2~4시간)
|
||||
|
||||
**예상 반복률: 4~7% → 3~5%**
|
||||
|
||||
- data_quality_audit에서 발견된 문제 수정:
|
||||
- `</s>` 오염 113건 제거
|
||||
- 짧은 output(<80자) 16,519건 제거
|
||||
- Q/A 마커 ~550건 제거
|
||||
- OpenOrca 가중치 5.0→2.0
|
||||
- 정제된 ~120K 데이터로 추가 SFT 2-3 epochs
|
||||
|
||||
**독립 효과:** 데이터 품질 개선은 ORPO와 무관하게 기저 모델 개선. 하지만 ORPO 없이 이것만으로는 반복률 <5% 불가능 (SFT v1→v2에서 이미 데이터 정제했으나 17.7%→18%로 정체)
|
||||
|
||||
### 종합 예상
|
||||
|
||||
| 단계 | 반복률 | 소요시간 | 누적시간 |
|
||||
|------|--------|----------|----------|
|
||||
| 현재 | 18.0% | - | - |
|
||||
| Step A (추론 파라미터) | 10~12% | 0h | 0h |
|
||||
| Step B (ORPO) | 4~7% | 3~5h | 3~5h |
|
||||
| Step C (데이터 정제 SFT) | 3~5% | 2~4h | 5~9h |
|
||||
| **최종** | **3~5%** | | **5~9h** |
|
||||
|
||||
---
|
||||
|
||||
## 2. 자체 Preference 데이터 생성 전략
|
||||
|
||||
### 방법: Self-Play Rejection Sampling
|
||||
|
||||
```python
|
||||
from transformers import AutoModelForCausalLM, AutoTokenizer
|
||||
import torch
|
||||
|
||||
model = AutoModelForCausalLM.from_pretrained("checkpoints/korean_1b_sft/checkpoint-best")
|
||||
tokenizer = AutoTokenizer.from_pretrained(...)
|
||||
|
||||
def generate_preference_pair(prompt, n_samples=8, temp=0.9):
|
||||
"""프롬프트 당 n_samples개 생성 → chosen/rejected 분류"""
|
||||
responses = []
|
||||
for _ in range(n_samples):
|
||||
output = model.generate(
|
||||
tokenizer.encode(f"<|user|>\n{prompt}\n<|assistant|>\n", return_tensors="pt"),
|
||||
max_new_tokens=256, temperature=temp, top_p=0.95,
|
||||
do_sample=True, repetition_penalty=1.0 # 의도적으로 penalty 없이
|
||||
)
|
||||
text = tokenizer.decode(output[0], skip_special_tokens=True)
|
||||
rep_rate = calc_repetition_rate(text) # 10-gram 기준
|
||||
responses.append((text, rep_rate))
|
||||
|
||||
# 분류
|
||||
chosen = [r for r in responses if r[1] < 0.05] # 반복률 5% 미만 → chosen
|
||||
rejected = [r for r in responses if r[1] > 0.15] # 반복률 15% 이상 → rejected
|
||||
|
||||
if chosen and rejected:
|
||||
return {"prompt": prompt, "chosen": chosen[0][0], "rejected": rejected[0][0]}
|
||||
return None
|
||||
```
|
||||
|
||||
### 규모 계산
|
||||
|
||||
| 항목 | 값 |
|
||||
|------|-----|
|
||||
| 필요 preference 쌍 | 500~1000 (최소 500) |
|
||||
| 프롬프트 당 샘플 수 | 8 |
|
||||
| 유효 쌍 생성률 | ~40% (반복률 18%이므로 chosen/rejected 분리 가능) |
|
||||
| 필요 프롬프트 수 | 500 / 0.4 = **~1,250개** |
|
||||
| 프롬프트 당 생성 시간 | 8 × 256 tokens × ~0.02s/token ≈ 40s |
|
||||
| **총 생성 시간** | 1,250 × 40s ≈ **14시간** (GPU 1개) |
|
||||
|
||||
⚠️ **자체 생성은 느림.** 대안: 기존 HF preference 데이터 활용 (섹션 3)
|
||||
|
||||
### 자동 품질 판단 기준
|
||||
|
||||
- **chosen 임계값:** 10-gram 반복률 < 5%, 길이 > 50 tokens, EOS 정상 생성
|
||||
- **rejected 임계값:** 10-gram 반복률 > 15% OR 동일 문장 2회 이상 반복
|
||||
- 중간 영역(5~15%)은 버림 → contrastive signal 극대화
|
||||
|
||||
### 빠른 대안: 하이브리드 전략 (추천)
|
||||
|
||||
1. HF에서 500~1000쌍 다운로드 (즉시)
|
||||
2. 자체 모델로 200~300쌍 추가 생성 (반복 특화, 3~4시간)
|
||||
3. 총 700~1300쌍으로 ORPO 학습
|
||||
|
||||
---
|
||||
|
||||
## 3. HuggingFace 즉시 사용 가능 한국어 Preference 데이터
|
||||
|
||||
### 확인된 데이터셋
|
||||
|
||||
| 데이터셋 | 크기 | 포맷 | 적합성 |
|
||||
|----------|------|------|--------|
|
||||
| `maywell/ko_Ultrafeedback_binarized` | **61,966쌍** | prompt/chosen/rejected | ⭐⭐⭐ 최적 — 바로 ORPO에 사용 가능 |
|
||||
| `kuotient/orca-math-korean-dpo-pairs` | **192,848쌍** | question/chosen/rejected | ⭐⭐ 수학 특화지만 양 풍부 |
|
||||
| `nayohan/preference-collection-ko-full` | **199,760쌍** | 복잡 포맷 (score_A/B) | ⭐⭐ 전처리 필요 |
|
||||
| `jojo0217/korean_rlhf_dataset` | 미확인 | 미확인 | ⭐ 확인 필요 |
|
||||
| `heegyu/PKU-SafeRLHF-ko` | 미확인 | 미확인 | ⭐ 안전성 특화 |
|
||||
|
||||
### 추천 조합
|
||||
|
||||
```python
|
||||
# 1순위: ko_Ultrafeedback_binarized에서 2000쌍 샘플링
|
||||
from datasets import load_dataset
|
||||
ds = load_dataset("maywell/ko_Ultrafeedback_binarized", split="train")
|
||||
# 이미 prompt/chosen/rejected 포맷 → 바로 사용
|
||||
|
||||
# 2순위: orca-math에서 500쌍 추가 (다양성)
|
||||
ds2 = load_dataset("kuotient/orca-math-korean-dpo-pairs", split="train")
|
||||
```
|
||||
|
||||
**준비 시간: 30분 미만** (다운로드 + 포맷 변환)
|
||||
|
||||
---
|
||||
|
||||
## 4. 1B 모델의 한계와 ORPO 극복 범위
|
||||
|
||||
### 반복 퇴화의 근본 원인: 파라미터 수 vs 학습 방법
|
||||
|
||||
**파라미터 수가 주 원인이 아닌 근거:**
|
||||
1. Pretrain 단계에서 반복률 69% → SFT로 18%까지 낮춤. 같은 1B 파라미터로 51%p 개선
|
||||
2. 반복 패턴은 특정 프롬프트에서만 발생 (짧은 사실 질문은 0%, 긴 설명 질문에서 20~33%)
|
||||
3. data_quality_audit에서 EOS 학습 실패가 핵심 원인으로 지목됨 → 학습 데이터/방법 문제
|
||||
|
||||
**1B에서 반복률 <5% 현실성:**
|
||||
- Qwen2.5-0.5B, SmolLM-1.7B 등 유사 규모 모델이 RLHF/DPO 후 반복률 <5% 달성 사례 다수
|
||||
- ORPO 원논문(Hong et al., 2024)에서 Phi-2(2.7B)와 Llama-2-7B 실험 → 소규모 모델에서도 일관된 개선
|
||||
- 1B급 직접 실험은 드물지만, **반복 퇴화는 alignment 문제이지 capacity 문제가 아님**
|
||||
|
||||
**ORPO 특유의 장점 (1B에 유리):**
|
||||
- Reference model 불필요 → GPU 메모리 절약 (DPO는 2배 메모리)
|
||||
- 1B 모델을 단일 GPU에서 full fine-tuning 가능
|
||||
- SFT + preference를 동시에 학습 → 적은 데이터로 효율적
|
||||
|
||||
### 현실적 기대치
|
||||
|
||||
| 목표 | 달성 가능성 | 조건 |
|
||||
|------|------------|------|
|
||||
| 반복률 <10% | **95%** | ORPO 500쌍 + rep_penalty=1.2 |
|
||||
| 반복률 <5% | **70%** | ORPO 1000쌍 + 데이터 정제 SFT |
|
||||
| 반복률 <3% | **40%** | ORPO 2000쌍 + 데이터 정제 + 파라미터 튜닝 |
|
||||
|
||||
---
|
||||
|
||||
## 5. 총 비용 계산
|
||||
|
||||
### 1B ORPO 경로 (이 전략)
|
||||
|
||||
| 단계 | 작업 | 시간 |
|
||||
|------|------|------|
|
||||
| 1 | HF preference 데이터 다운로드 + 전처리 | 0.5h |
|
||||
| 2 | 자체 preference 생성 (200~300쌍, 선택적) | 3~4h |
|
||||
| 3 | ORPO 학습 (1000쌍, 1~2 epochs) | 1~2h |
|
||||
| 4 | 평가 + 반복 | 0.5h |
|
||||
| 5 | (선택) 데이터 정제 재SFT | 2~4h |
|
||||
| **총합 (필수만)** | | **2~3h** |
|
||||
| **총합 (전체)** | | **7~11h** |
|
||||
|
||||
### 3B 처음부터 경로 (대안)
|
||||
|
||||
| 단계 | 시간 |
|
||||
|------|------|
|
||||
| 3B pretrain | 26h |
|
||||
| SFT | 1~2h |
|
||||
| 평가 | 1h |
|
||||
| **총합** | **28~29h** |
|
||||
|
||||
### 비교
|
||||
|
||||
| 항목 | 1B ORPO | 3B 처음부터 |
|
||||
|------|---------|------------|
|
||||
| 소요 시간 | 2~11h | 28~29h |
|
||||
| 성공 확률 (<5%) | 70% | 80~90% |
|
||||
| 실패 시 비용 | 3~11h 낭비 | 29h 낭비 |
|
||||
| 기대값 (시간×확률) | 3~11h / 0.7 = **4~16h** | 29h / 0.85 = **34h** |
|
||||
| 병렬 가능 | ✅ 3B와 동시 진행 가능 | GPU 점유 |
|
||||
|
||||
---
|
||||
|
||||
## 6. 최종 권고: 왜 지금 당장 ORPO여야 하는가
|
||||
|
||||
### 핵심 논거
|
||||
|
||||
1. **시간 효율:** 필수 단계만 2~3시간. 3B의 1/10 시간
|
||||
2. **리스크 최소:** 실패해도 3시간 손실. 3B는 29시간 손실
|
||||
3. **이미 데이터 있음:** `maywell/ko_Ultrafeedback_binarized` 61K쌍이 HF에 준비됨. 다운로드만 하면 됨
|
||||
4. **정확한 문제 해결:** 반복 퇴화의 원인은 "뭘 하면 안 되는지 모름" → preference learning이 정확한 해법
|
||||
5. **병렬 전략 가능:** ORPO는 2~3시간이므로, 3B 학습과 동시에 시작 가능. 먼저 끝나는 쪽 채택
|
||||
|
||||
### 즉시 실행 계획
|
||||
|
||||
```bash
|
||||
# Step 1: preference 데이터 준비 (30분)
|
||||
python3 scripts/prepare_orpo_data.py \
|
||||
--hf_dataset maywell/ko_Ultrafeedback_binarized \
|
||||
--sample_size 2000 \
|
||||
--output data/orpo/train.jsonl
|
||||
|
||||
# Step 2: ORPO 학습 (1~2시간)
|
||||
python3 scripts/train_orpo.py \
|
||||
--model checkpoints/korean_1b_sft/checkpoint-best \
|
||||
--data data/orpo/train.jsonl \
|
||||
--lr 5e-6 --epochs 2 --batch_size 4 --beta 0.1 \
|
||||
--output checkpoints/korean_1b_orpo
|
||||
|
||||
# Step 3: 평가 (30분)
|
||||
python3 eval/comprehensive_eval.py \
|
||||
--model checkpoints/korean_1b_orpo \
|
||||
--repetition_penalty 1.2 --no_repeat_ngram_size 4
|
||||
```
|
||||
|
||||
### 성공 판정 기준
|
||||
|
||||
| 지표 | 목표 | 현재 |
|
||||
|------|------|------|
|
||||
| 반복률 | <5% | 18% |
|
||||
| 자연 종료율 | >80% | 60% |
|
||||
| 응답 품질 | 유지 또는 개선 | baseline |
|
||||
|
||||
---
|
||||
|
||||
## 요약
|
||||
|
||||
| 항목 | 값 |
|
||||
|------|-----|
|
||||
| **전략** | ORPO + 추론 파라미터 튜닝 |
|
||||
| **예상 반복률** | 3~7% (목표 <5% 달성 확률 70%) |
|
||||
| **총 소요시간** | 2~3h (필수) / 7~11h (전체) |
|
||||
| **vs 3B** | 10~15배 빠름, 기대값 기준 2~3배 효율적 |
|
||||
| **필요 데이터** | HF에서 즉시 사용 가능 (0원, 30분) |
|
||||
| **핵심 메시지** | SFT만으로는 "하지 말아야 할 것"을 가르칠 수 없다. ORPO가 정확한 해법이다. |
|
||||
Reference in New Issue
Block a user