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": "์์ธ์ ๊ด๊ด์ง๋ก๋ ๊ฒฝ๋ณต๊ถ์ด ์์ต๋๋ค. ๊ฒฝ๋ณต๊ถ์ด ์์ต๋๋ค. ๊ฒฝ๋ณต๊ถ์ด ์์ต๋๋ค..."
}
- ํ์ฌ SFT ๋ชจ๋ธ๋ก ๋ค์ํ ํ๋กฌํํธ์ ๋ํด ์์ฑ (temperature ๋ค์ํ๊ฒ)
- ๋ฐ๋ณต์ด ๋ฐ์ํ ์๋ต โ rejected
- ์ ์ ์๋ต (๋๋ GPT-4๋ก ์์ฑ) โ chosen
- 500~2000๊ฐ๋ง์ผ๋ก๋ ํจ๊ณผ์
5. HF ๋ณํ
scripts/convert_to_hf.py ๊ฐ ์ด๋ฏธ ์กด์ฌํ๋ฉฐ LlamaForCausalLM ํฌ๋งท์ผ๋ก ๋ณํ:
- FP8 / BF16 ์ฒดํฌํฌ์ธํธ ๋ชจ๋ ์ง์
- ์ถ๋ ฅ:
config.json,model.safetensors,tokenizer.json๋ฑ
๋ณํ ๋ช ๋ น:
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๋ ์ด ํจํด ์์ฒด๋ฅผ ์ง์ ์ ์ผ๋ก ํ๋ํฐ:
- ๋ฐ๋ณต ํจํด = rejected โ ๋ชจ๋ธ์ด ๋ฐ๋ณต ์ํ์ค์ ๋์ ํ๋ฅ ์ ๋ถ์ฌํ๋ ๊ฒ์ ์ง์ ์ต์
- ๋ค์ํ ์ ์ ์๋ต = chosen โ ๋ค์ํ ํ ํฐ ๋ถํฌ๋ฅผ ์ ๋
- 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 ์ฐธ์กฐ