frankenstallm / source /eval /decision /fix_scenario.md
pathcosmos's picture
Upload folder using huggingface_hub (#29)
5b1ff4d

"ν˜„ μƒνƒœ κ°œμ„ " μ‹œλ‚˜λ¦¬μ˜€ μ™„μ „ 뢄석

μž‘μ„±μΌ: 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와 데이터 μΆ”κ°€λ‘œ λͺ©ν‘œ 달성 ν™•λ₯ μ„ 높일 수 μžˆλ‹€."