gyung/lfm2-1.2b-koen-mt-v8-rl-10k-adapter
217
๐ LFM2-v8-RL-10k Adapter (SOTA)
GRPO + COMET/CHrF++ ๊ฐํํ์ต์ผ๋ก ํ๋ จ๋ ํ์/์ํ ์๋ฐฉํฅ ๋ฒ์ญ LoRA Adapter
โ ๏ธ ์ด Adapter๋ ๋ฐ๋์ Base ๋ชจ๋ธ๊ณผ ํจ๊ป ์ฌ์ฉํด์ผ ํฉ๋๋ค! Base Model: gyung/lfm2-1.2b-koen-mt-v6.4-merged
๐ ํต์ฌ ์ฑ๊ณผ
- 1.2B ๋ชจ๋ธ์ด 4B ๋ชจ๋ธ์ ์๋! Gemma-3 (4B)๋ณด๋ค 1.78 CHrF++ ๋์
- ๋จ 400 Step (0.78 Epoch)๋ง์ ํ์ต์ผ๋ก SOTA ๋ฌ์ฑ
- ์กด๋๋ง ์ผ๊ด์ฑ ์๋ฒฝ: 1012๊ฐ ์ํ ์ ์ฒด์์ "~ํฉ๋๋ค" ์ด๋ฏธ ์ผ๊ด ์ ์ฉ
- Google Colab T4 ๋ฌด๋ฃ GPU๋ก ํ์ต ๊ฐ๋ฅ
๐ ์ฑ๋ฅ (Flores-200 Benchmark, 1012 Samples)
โ 1.2B ๋ชจ๋ธ๋ก 4B ๋ชจ๋ธ๋ค์ ์๋์ ์ผ๋ก ๋ฅ๊ฐ!
๐ ํ์ต ๊ณผ์ ๋ณ ์ฑ๋ฅ ํฅ์
โจ v8์ ๊ฐ์
- ์กด๋๋ง/๋ฌธ์ฒด ์ผ๊ด์ฑ: "~ํฉ๋๋ค", "~ํ์ต๋๋ค" ์ด๋ฏธ๊ฐ ์ ์ํ์ ๊ฑธ์ณ ์ผ๊ด๋๊ฒ ์ ์ฉ
- ์์ฐ์ค๋ฌ์ด ๋ฌธ์ฅ ๊ตฌ์กฐ: "ํ์ค๋ง๋์ ์ฃผ ๋ฐ๋ณธํฌํธ์ ๋ฉ์ด๋ฒ ๋ณ์ ์๊ธ์..." ๊ฐ์ ๋ณต์กํ ๋ฌธ์ฅ๋ ์์ฐ์ค๋ฝ๊ฒ ์ฒ๋ฆฌ
- ๋ฌธ๋งฅ ์ธ์ ๋ฒ์ญ: "While"์ ๋ฌธ๋งฅ์ ๋ฐ๋ผ "๋ฐ๋ฉด", "๋์" ๋ฑ์ผ๋ก ์ ์ฐํ๊ฒ ๋ฒ์ญ
- ์ ๋ฌธ ์ฉ์ด ์ฒ๋ฆฌ: "rachis"๋ฅผ "์ฐ์ถ"์ผ๋ก ์ ํํ๊ฒ ๋ฒ์ญ
โ ๏ธ ์๋ ค์ง ํ๊ณ
- ๊ณ ์ ๋ช ์ฌ ํ๊ฐ: "George W. Bush" โ "์กฐ์ง ์์ฑํด"์ผ๋ก ์๋ชป ๋ฒ์ญ (๋ฒ ์ด์ค ๋ชจ๋ธ์์ ์์๋ ํธํฅ)
- ์ผ๋ถ ์ ๋ฌธ ์ฉ์ด ์ค์ญ: ํน์ ๊ณผํ ์ฉ์ด์์ ์ค๋ฅ ๋ฐ์ ๊ฐ๋ฅ
๐ก ํด๊ฒฐ ๋ฐฉ์: DPO๋ฅผ ํตํ ํ๊ฐ ๊ต์ ์์ (v9)
๐ง ์ฌ์ฉ๋ฒ
1. Adapter ๋ก๋ (์ถ์ฒ)
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel
# Base ๋ชจ๋ธ ๋ก๋
base_model = AutoModelForCausalLM.from_pretrained(
"gyung/lfm2-1.2b-koen-mt-v6.4-merged",
device_map="auto",
torch_dtype="auto"
)
tokenizer = AutoTokenizer.from_pretrained("gyung/lfm2-1.2b-koen-mt-v6.4-merged")
# Adapter ๋ก๋ ๋ฐ ๋ณํฉ
model = PeftModel.from_pretrained(base_model, "gyung/lfm2-1.2b-koen-mt-v8-rl-10k-adapter")
model = model.merge_and_unload() # ์ถ๋ก ์๋ ํฅ์2. ๋ฒ์ญ ์คํ
# ์์ด โ ํ๊ตญ์ด
messages = [
{"role": "system", "content": "Translate to Korean."},
{"role": "user", "content": "The quick brown fox jumps over the lazy dog."}
]
# ํ๊ตญ์ด โ ์์ด
messages = [
{"role": "system", "content": "Translate to English."},
{"role": "user", "content": "๋น ๋ฅธ ๊ฐ์ ์ฌ์ฐ๊ฐ ๊ฒ์ผ๋ฅธ ๊ฐ๋ฅผ ๋ฐ์ด๋์ต๋๋ค."}
]
input_ids = tokenizer.apply_chat_template(
messages, return_tensors="pt", add_generation_prompt=True
).to(model.device)
outputs = model.generate(
input_ids,
max_new_tokens=256,
do_sample=True,
temperature=0.3,
min_p=0.15,
repetition_penalty=1.05
)
translation = tokenizer.decode(outputs[0][input_ids.shape[1]:], skip_special_tokens=True)
print(translation)๐ ํ์ต ์์ธ
๐ง ํ์ต ๋ฐฉ๋ฒ๋ก
"Data-Centric + Progressive Learning" ํ์ดํ๋ผ์ธ:
- SFT (Step 1): LFM2-1.2B ๋ฒ ์ด์ค โ 20๋ง๊ฐ + 8.8๋ง๊ฐ ๊ณ ํ์ง ๋ฒ์ญ ๋ฐ์ดํฐ ํ์ต โ v6.4
- GRPO (Step 2): v6.4 โ 10k ์๋ฐฉํฅ RL ๋ฐ์ดํฐ + COMET/CHrF++ ๋ฆฌ์๋ โ v8 (SOTA)
๐ก ํต์ฌ: ๋ฌด์์ ๋ฐ์ดํฐ๋ฅผ ๋๋ฆฌ๋ ๊ฒ ์๋๋ผ, ์ฝ์ ์ ๋ถ์ํ๊ณ ํ๊ฒํ ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ
๐ ํฅํ ๊ณํ
- ์ถ๊ฐ RL ํ์ต: 1,200+ Step๊น์ง ํ์ต ์์ (ProRL ๋ ผ๋ฌธ ๊ถ์ฅ)
- DPO๋ก ํ๊ฐ ์์ : "George W. Bush" ๋ฑ ๊ณ ์ ๋ช ์ฌ ์ค์ญ ๊ต์
- DuPO ์ ์ฉ: ์ญ๋ฒ์ญ ๊ธฐ๋ฐ ์๊ธฐ ๊ฒ์ฆ (ByteDance ๋ ผ๋ฌธ)
- LFM2-2.6B-Exp: ์๋ก์ด ๋ฒ ์ด์ค ๋ชจ๋ธ ๊ธฐ๋ฐ ํ์ต
๐ ๊ด๋ จ ๋งํฌ
- Base Model (v6.4): gyung/lfm2-1.2b-koen-mt-v6.4-merged
- Previous Adapter (v5): gyung/lfm2-1.2b-koen-mt-v5-rl-10k-adapter
- GitHub Repository: LFM2-KoEn-Tuning
- Liquid AI Official Cookbook: English-to-Korean Example
๐ Citation
@misc{lfm2-koen-v8-rl,
author = {gyung},
title = {LFM2-1.2B-KoEn-MT-v8-RL: GRPO-Enhanced Bidirectional Korean-English Translation Adapter},
year = {2024},
publisher = {Hugging Face},
url = {https://huggingface.co/gyung/lfm2-1.2b-koen-mt-v8-rl-10k-adapter}
}๐ License
This model inherits the LFM Open License v1.0 from the base LFM2 model.
