"ν μν κ°μ " μλλ¦¬μ€ μμ λΆμ
μμ±μΌ: 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μκ°)
λ°μ΄ν° ν보 λ°©μ:
kuotient/orca-math-korean-dpo-pairs: μν μ€μ¬, 193K β λλ©μΈ νΈν₯ μμΌλ μ¦μ μ¬μ© κ°λ₯- μ체 μμ± (κΆμ₯):
- νμ¬ λͺ¨λΈλ‘ λμΌ ν둬ννΈμ λν΄ λ°λ³΅ μΆλ ₯ μμ± β rejected
- κΉ¨λν λ°μ΄ν°μ μ μ λ΅ β chosen
- ~10K-20K μ μμ± κ°λ₯ (1μκ° μμ)
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, λμ νλ₯ λ‘.
κ·Όκ±°:
- μ€μΌ λ°μ΄ν° 720/159,125 = 0.45% β λͺ¨λΈ κ°μ€μΉμ λ―ΈμΉ μν₯ κ·Ήν μ νμ
- SFTλ pretrain κ°μ€μΉ μμ fine-tuning β pretrain κ°μ€μΉλ 무κ΄
- μ¬νμ΅ μ clean λ°μ΄ν°λ‘ from scratch (κΈ°μ‘΄ SFT 체ν¬ν¬μΈνΈκ° μλ base checkpointμμ) β μ€μΌ μμ μ κ±°
- 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 |
κΆμ₯ μ¬λΆ
β κΆμ₯: "κ³ μ³μ κ°λ€"
κ·Όκ±°:
- μ΄λ―Έ μμ μλ£: μ½λ λ²κ·Έ 2κ° μμ , λ°μ΄ν° μ¬μ²λ¦¬ μλ£ β μ¬νμ΅λ§ νλ©΄ λ¨
- λΉμ© λλΉ ν¨κ³Ό: Phase Aλ 40λΆμ΄λ©΄ λλκ³ , λ°λ³΅λ₯ 8-13%κΉμ§ ν보 κ°λ₯
- μ μ§μ κ°μ κ°λ₯: Phase A β B β Cλ₯Ό μμ°¨μ μΌλ‘ μ§ννλ©° λ§€ λ¨κ³ νκ° κ°λ₯
- μ΅μ μ κ²½μ°μλ μμ€ μ΅μ: 7.4μκ° ν¬μλ‘ μ΅μν μΈνλΌ μ λΉ μλ£
- 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μ λ°μ΄ν° μΆκ°λ‘ λͺ©ν λ¬μ± νλ₯ μ λμΌ μ μλ€."