| # Preference Optimization ์กฐ์ฌ ๋ณด๊ณ ์ |
|
|
| **์์ฑ์ผ:** 2026-02-26 |
| **๋ชฉ์ :** SFT ์ดํ ๋ฐ๋ณต ํดํ(repetition degeneration) ํด๊ฒฐ์ ์ํ Preference Optimization ๋ฐฉ๋ฒ๋ก ์กฐ์ฌ |
|
|
| --- |
|
|
| ## 1. ํ์ฌ ํ๊ฒฝ |
|
|
| | ํจํค์ง | ๋ฒ์ | ๋น๊ณ | |
| |---------|------|------| |
| | transformers | 5.2.0 | โ
์ค์น๋จ | |
| | accelerate | - | ํ์ธ ํ์ | |
| | peft | - | ํ์ธ ํ์ | |
| | **trl** | **๋ฏธ์ค์น** | โ ๏ธ `pip install trl` ํ์ | |
|
|
| **์ธํ๋ผ:** 8ร B200 183GB |
| **๋ชจ๋ธ:** ์ปค์คํ
1B ํ๋ผ๋ฏธํฐ (Llama ๊ณ์ด ์ํคํ
์ฒ, FP8 ์ง์) |
| **์ต์ ์ฒดํฌํฌ์ธํธ:** |
| - Pretrain: `checkpoints/korean_1b_fp8_run1/checkpoint-0034000` |
| - SFT: `checkpoints/korean_1b_sft/` (์ต์ข
์ฒดํฌํฌ์ธํธ๋ log ํ์ธ ํ์) |
|
|
| **HF ๋ณํ:** `scripts/convert_to_hf.py` ์กด์ฌ โ
โ LlamaForCausalLM ํฌ๋งท์ผ๋ก ๋ณํ ๊ฐ๋ฅ |
|
|
| --- |
|
|
| ## 2. ORPO vs DPO vs SimPO ๋น๊ต |
|
|
| ### ORPO (Odds Ratio Preference Optimization) |
| - **๋
ผ๋ฌธ:** Hong et al. 2024 (arXiv:2403.07691) |
| - **Reference model:** ๋ถํ์ โ
|
| - **ํต์ฌ ์์ด๋์ด:** SFT loss + odds ratio ๊ธฐ๋ฐ preference loss๋ฅผ ๋จ์ผ ๋ชจ๋ธ๋ก ๋์ ํ์ต |
| - **๋ฉ๋ชจ๋ฆฌ:** SFT์ ๋์ผ (1ร ๋ชจ๋ธ๋ง ํ์) |
| - **1B ๋ชจ๋ธ ์ ์ฉ:** 8ร B200์์ ๋งค์ฐ ์ฌ์ (๋จ์ผ GPU๋ก๋ ๊ฐ๋ฅ) |
| - **๊ตฌํ:** TRL `ORPOTrainer` (trl >= 0.8.0) |
| - **์ฅ์ :** ๊ฐ์ฅ ๊ฐ๋จ, ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ , SFT+preference ํ ๋ฒ์ |
| - **๋จ์ :** DPO ๋๋น ์์ ์ฑ ๊ฒ์ฆ ์ฌ๋ก ์ ์ |
|
|
| ### DPO (Direct Preference Optimization) |
| - **๋
ผ๋ฌธ:** Rafailov et al. 2023 (arXiv:2305.18290) |
| - **Reference model:** ํ์ (frozen copy, 2ร ๋ฉ๋ชจ๋ฆฌ) |
| - **๋ฉ๋ชจ๋ฆฌ:** 1B ๋ชจ๋ธ ร 2 โ 4GB (BF16) โ ์ฌ์ ํ ์ฌ์ |
| - **1B ๋ชจ๋ธ ์ ์ฉ:** ๋ฌธ์ ์์ |
| - **๊ตฌํ:** TRL `DPOTrainer` |
| - **์ฅ์ :** ๊ฐ์ฅ ์ ๊ฒ์ฆ๋จ, ์์ ์ , ๋
ผ๋ฌธ/์ฌ๋ก ํ๋ถ |
| - **๋จ์ :** reference model ๊ด๋ฆฌ ํ์ |
|
|
| ### SimPO (Simple Preference Optimization) |
| - **๋
ผ๋ฌธ:** Meng et al. 2024 (arXiv:2405.14734) |
| - **Reference model:** ๋ถํ์ |
| - **ํต์ฌ:** Length-normalized implicit reward, margin ๊ธฐ๋ฐ |
| - **๊ตฌํ:** TRL์ ๋ณ๋ Trainer ์์ โ DPOTrainer์ `loss_type="simpo"` ๋ก ์ฌ์ฉ ๊ฐ๋ฅ (trl >= 0.9.0) |
| - **์ฅ์ :** ORPO๋ณด๋ค ์ฑ๋ฅ ์ฐ์ํ๋ค๋ ๋ณด๊ณ , reference-free |
| - **๋จ์ :** ์๋์ ์ผ๋ก ์๋ก์ด ๋ฐฉ๋ฒ |
|
|
| ### PPO (Proximal Policy Optimization) โ ์ฐธ๊ณ ์ฉ |
| - Reward model ๋ณ๋ ํ์ต ํ์ โ ๋ณต์ก๋ ๋์ |
| - 1B ๋ชจ๋ธ์๋ ๊ณผ๋ํ ์ค๋ฒํค๋ |
| - **์ถ์ฒํ์ง ์์** (๋ฐ์ดํฐ/์ธํ๋ผ ๋๋น ๋นํจ์จ) |
|
|
| --- |
|
|
| ## 3. ์ถ์ฒ: **ORPO โ DPO ์์** |
|
|
| ### 1์์: ORPO |
| - Reference model ์์ โ ๋ฉ๋ชจ๋ฆฌ/๊ตฌํ ์ต์ |
| - SFT ์ฒดํฌํฌ์ธํธ์์ ๋ฐ๋ก ์์ ๊ฐ๋ฅ |
| - ๋ฐ๋ณต ํดํ์ฉ preference ๋ฐ์ดํฐ ์ ์์ด ๊ฐ๋จ |
|
|
| ### 2์์: DPO |
| - ORPO๋ก ๋ถ์กฑํ๋ฉด DPO๋ก ์ ํ |
| - 1B ๋ชจ๋ธ์ด๋ผ reference model ๋ถ๋ด ์์ |
| - ๋ ์์ ์ ์ด๊ณ ๊ฒ์ฆ๋ ๋ฐฉ๋ฒ |
|
|
| ### ๊ทผ๊ฑฐ |
| 1B ๋ชจ๋ธ + 8ร B200 ํ๊ฒฝ์์๋ DPO์ 2ร ๋ฉ๋ชจ๋ฆฌ๋ ๋ฌธ์ ์์ง๋ง, |
| **๊ตฌํ ์๋์ ๋จ์์ฑ** ๋ฉด์์ ORPO๊ฐ ๋จผ์ ์๋ํ ๊ฐ์น๊ฐ ์์. |
|
|
| --- |
|
|
| ## 4. ํ๊ตญ์ด Preference ๋ฐ์ดํฐ์
|
|
|
| ### โ
์ ๊ทผ ๊ฐ๋ฅ (DPO/ORPO ํ์ ํธํ) |
|
|
| | ๋ฐ์ดํฐ์
| ํ์ | Downloads | ์ ํฉ๋ | |
| |----------|------|-----------|--------| |
| | **kuotient/orca-math-korean-dpo-pairs** | `{system, question, chosen, rejected}` | 111 | โญโญโญ DPO/ORPO ์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅ | |
| | **ChuGyouk/argilla-distilabel-math-preference-dpo-korean** | DPO ํ์ | 10 | โญโญโญ ์ํ ๋๋ฉ์ธ | |
| | **nayohan/preference-collection-ko-full** | `{response_A, response_B, orig_score_A, orig_score_B, orig_preference}` | 30 | โญโญโญ ๋ณํ ํ์ํ์ง๋ง ํ๋ถ | |
|
|
| ### โ
์ ๊ทผ ๊ฐ๋ฅ (SFT ํ์, preference ๋ณํ ํ์) |
|
|
| | ๋ฐ์ดํฐ์
| ํ์ | Downloads | |
| |----------|------|-----------| |
| | jojo0217/korean_rlhf_dataset | `{instruction, input, output}` | 54 | |
| | FreedomIntelligence/alpaca-gpt4-korean | SFT ํ์ | 158 | |
| | nlpai-lab/kullm-v2 | SFT ํ์ | 730 | |
|
|
| ### โ ์ ๊ทผ ๋ถ๊ฐ |
| maywell/ko_Ultrafeedback, HAERAE-HUB/KoRA, heegyu/OpenOrca-ko, Bongseok/ko-DPO-v0.1 โ ๋ชจ๋ 404 |
| |
| ### ๐ก ์์ฒด Preference ๋ฐ์ดํฐ ์์ฑ ์ ๋ต (๋ฐ๋ณต ํดํ ํนํ) |
| |
| ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ: **ํ์ฌ ๋ชจ๋ธ์ ๋ฐ๋ณต ์ถ๋ ฅ์ rejected๋ก ํ์ฉ** |
| |
| ``` |
| { |
| "prompt": "์์ธ์ ์ ๋ช
ํ ๊ด๊ด์ง๋ฅผ ์ถ์ฒํด์ฃผ์ธ์.", |
| "chosen": "์์ธ์ ๋ํ์ ์ธ ๊ด๊ด์ง๋ก๋ ๊ฒฝ๋ณต๊ถ, ๋ถ์ดํ์ฅ๋ง์, ๋จ์ฐํ์...", |
| "rejected": "์์ธ์ ๊ด๊ด์ง๋ก๋ ๊ฒฝ๋ณต๊ถ์ด ์์ต๋๋ค. ๊ฒฝ๋ณต๊ถ์ด ์์ต๋๋ค. ๊ฒฝ๋ณต๊ถ์ด ์์ต๋๋ค..." |
| } |
| ``` |
| |
| 1. ํ์ฌ SFT ๋ชจ๋ธ๋ก ๋ค์ํ ํ๋กฌํํธ์ ๋ํด ์์ฑ (temperature ๋ค์ํ๊ฒ) |
| 2. ๋ฐ๋ณต์ด ๋ฐ์ํ ์๋ต โ rejected |
| 3. ์ ์ ์๋ต (๋๋ GPT-4๋ก ์์ฑ) โ chosen |
| 4. 500~2000๊ฐ๋ง์ผ๋ก๋ ํจ๊ณผ์ |
| |
| --- |
| |
| ## 5. HF ๋ณํ |
| |
| `scripts/convert_to_hf.py` ๊ฐ ์ด๋ฏธ ์กด์ฌํ๋ฉฐ LlamaForCausalLM ํฌ๋งท์ผ๋ก ๋ณํ: |
| - FP8 / BF16 ์ฒดํฌํฌ์ธํธ ๋ชจ๋ ์ง์ |
| - ์ถ๋ ฅ: `config.json`, `model.safetensors`, `tokenizer.json` ๋ฑ |
| |
| **๋ณํ ๋ช
๋ น:** |
| ```bash |
| cd /PROJECT/0325120031_A/ghong/taketimes/llm-bang |
| python scripts/convert_to_hf.py \ |
| --checkpoint checkpoints/korean_1b_sft/checkpoint-XXXXX \ |
| --output outputs/hf_for_orpo \ |
| --tokenizer tokenizer/korean_sp/tokenizer.json |
| ``` |
| |
| ๋ณํ ํ `AutoModelForCausalLM.from_pretrained("outputs/hf_for_orpo")` ๋ก ๋ก๋ โ TRL ORPOTrainer ์ฌ์ฉ ๊ฐ๋ฅ. |
|
|
| --- |
|
|
| ## 6. ๋ฐ๋ณต ํดํ ํด๊ฒฐ์ ORPO๊ฐ ํจ๊ณผ์ ์ธ ์ด์ |
|
|
| ### ๋ฉ์ปค๋์ฆ |
| ORPO์ odds ratio loss๋ ๋ค์์ ํ์ต: |
| - **chosen ์๋ต์ ์์ฑ ํ๋ฅ โ** (์ ์์ ์ด๊ณ ๋ค์ํ ์๋ต) |
| - **rejected ์๋ต์ ์์ฑ ํ๋ฅ โ** (๋ฐ๋ณต์ ์ธ ์๋ต) |
|
|
| ๋ฐ๋ณต ํดํ๋ ํน์ ํ ํฐ ์ํ์ค์ ํ๋ฅ ์ด ์๊ธฐ๊ฐํ(self-reinforcing)๋๋ฉด์ ๋ฐ์. |
| ORPO๋ ์ด ํจํด ์์ฒด๋ฅผ ์ง์ ์ ์ผ๋ก ํ๋ํฐ: |
|
|
| 1. **๋ฐ๋ณต ํจํด = rejected** โ ๋ชจ๋ธ์ด ๋ฐ๋ณต ์ํ์ค์ ๋์ ํ๋ฅ ์ ๋ถ์ฌํ๋ ๊ฒ์ ์ง์ ์ต์ |
| 2. **๋ค์ํ ์ ์ ์๋ต = chosen** โ ๋ค์ํ ํ ํฐ ๋ถํฌ๋ฅผ ์ ๋ |
| 3. **SFT loss์ ๋์ ํ์ต** โ ์ผ๋ฐ ์ฑ๋ฅ ์ ์งํ๋ฉด์ ๋ฐ๋ณต ์ต์ |
|
|
| ### ์ SFT๋ง์ผ๋ก ๋ถ์กฑํ๊ฐ |
| - SFT๋ "์ข์ ์๋ต์ ๋ฐ๋ผํ๋ผ"๋ง ํ์ต |
| - "๋์ ์๋ต์ ํผํ๋ผ"๋ ์ ํธ๊ฐ ์์ |
| - Preference optimization์ "์ด๊ฒ์ ํ์ง ๋ง๋ผ"๋ฅผ ๋ช
์์ ์ผ๋ก ํ์ต |
|
|
| ### ์์ ํจ๊ณผ |
| - 500~2000๊ฐ์ ๋ฐ๋ณต-vs-์ ์ preference ์์ผ๋ก๋ ๋ฐ๋ณต ํดํ ๋ํญ ๊ฐ์ ๊ฐ๋ฅ |
| - repetition penalty ๊ฐ์ ๋์ฝ๋ฉ ํธ๋ฆญ๋ณด๋ค ๊ทผ๋ณธ์ ํด๊ฒฐ |
| - ์ผ๋ฐ ์ฑ๋ฅ ์ ํ ์ต์ (SFT loss๊ฐ ํจ๊ป ์์ฉ) |
|
|
| --- |
|
|
| ## 7. ์คํ ๊ณํ |
|
|
| ``` |
| 1. TRL ์ค์น: pip install trl --break-system-packages (๋๋ venv) |
| 2. HF ๋ณํ: python scripts/convert_to_hf.py --checkpoint ... --output outputs/hf_for_orpo |
| 3. Preference ๋ฐ์ดํฐ ์ค๋น: |
| a. kuotient/orca-math-korean-dpo-pairs ๋ค์ด๋ก๋ (์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅ) |
| b. ์์ฒด ๋ฐ๋ณต ํดํ ๋ฐ์ดํฐ ์์ฑ (eval/generate.py ํ์ฉ) |
| 4. ORPO ํ์ต: python train/orpo.py (์๋ ์คํฌ๋ฆฝํธ) |
| 5. ํ๊ฐ: ๋ฐ๋ณต๋ฅ ์ธก์ + perplexity |
| ``` |
|
|
| ORPO ํ์ต ์คํฌ๋ฆฝํธ: `train/orpo.py` ์ฐธ์กฐ |
|
|