Files
frankenstallm/source/eval/debate/avengers_strategy.md
ModelHub XC d4abdb70fa 初始化项目,由ModelHub XC社区提供模型
Model: pathcosmos/frankenstallm
Source: Original Platform
2026-07-14 04:21:16 +08:00

269 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 어벤져스 팀 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.02.0
- 정제된 ~120K 데이터로 추가 SFT 2-3 epochs
**독립 효과:** 데이터 품질 개선은 ORPO와 무관하게 기저 모델 개선. 하지만 ORPO 없이 이것만으로는 반복률 <5% 불가능 (SFT v1v2에서 이미 데이터 정제했으나 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가 정확한 해법이다. |