ການທຳຄວາມເຂົ້າໃຈ DPO (Direct Preference Optimization): ທາງເລືອກໃໝ່ແທນ RLHF ສຳລັບ LLMs
ການທຳຄວາມເຂົ້າໃຈ DPO (Direct Preference Optimization): ທາງເລືອກໃໝ່ແທນ RLHF
ສຳລັບນັກພັດທະນາ AI ແລະ ນັກວິໄຈໃນຍຸກນີ້, ຄວາມທ້າທາຍໃຫຍ່ທີ່ສຸດຢ່າງໜຶ່ງຫຼັງຈາກການຝຶກອົບຮົມ Pre-trained LLM ແມ່ນການປັບຈູນ (Alignment) ໃຫ້ໂມເດວມີຄວາມປອດໄພ, ມີປະໂຫຍດ ແລະ ຕອບສະໜອງກົງກັບຄວາມມັກຂອງມະນຸດ. ໃນອະດີດ, RLHF (Reinforcement Learning from Human Feedback) ຖືເປັນມາດຕະຖານຫຼັກ ແຕ່ກໍມາພ້ອມກັບຄວາມຊັບຊ້ອນໃນການວາງລະບົບ. ມື້ນີ້, ວົງການ AI ກຳລັງກ້າວເຂົ້າສູ່ຍຸກຂອງ DPO (Direct Preference Optimization) ເຊິ່ງເປັນເທັກນິກທີ່ລຽບງ່າຍ ແຕ່ຊົງພະລັງກວ່າ.
ໃນບົດຄວາມນີ້ ເຮົາຈະມາເຈາະເລິກເຖິງສະຖາປັດຕະຍະກຳ, ສົມຜົນຄະນິດສາດເບື້ອງຫຼັງ ແລະ ວິທີການນຳໃຊ້ DPO ເຂົ້າໃນການພັດທະນາ NLP ສຳລັບພາສາລາວ.
ບັນຫາຂອງ RLHF ແລະ ເປັນຫຍັງຈຶ່ງຕ້ອງມີ DPO?
ເຕັກນິກ RLHF ທີ່ຢູ່ເບື້ອງຫຼັງຄວາມສຳເລັດຂອງ ChatGPT ໃນຍຸກທຳອິດ ແມ່ນອາໄສຂັ້ນຕອນທີ່ຫຍຸ້ງຍາກ 3 ລະດັບ:
- SFT (Supervised Fine-Tuning): ຝຶກອົບຮົມໂມເດວພື້ນຖານດ້ວຍຂໍ້ມູນຖາມ-ຕອບ.
- Reward Modeling: ສ້າງໂມເດວອີກໂຕໜຶ່ງຂຶ້ນມາເພື່ອໃຫ້ຄະແນນ (Reward) ຄຳຕອບຂອງ LLM ຕາມຄວາມມັກຂອງມະນຸດ.
- PPO (Proximal Policy Optimization): ໃຊ້ Reinforcement Learning ເພື່ອອັບເດດໂມເດວຫຼັກໃຫ້ໄດ້ຄະແນນສູງສຸດ.
ຄວາມຊັບຊ້ອນຢູ່ບ່ອນວ່າ PPO ເປັນ Algorithm ທີ່ບໍ່ສະຖຽນ (Unstable), ກິນຊັບພະຍາກອນ (GPU Memory) ມະຫາສານ ເພາະຕ້ອງໂຫຼດຫຼາຍໂມເດວພ້ອມກັນ.
DPO (Direct Preference Optimization) ເຂົ້າມາແກ້ບັນຫານີ້ ໂດຍການຕັດຂັ້ນຕອນ Reward Model ແລະ RL ອອກໄປເລີຍ! ມັນສາມາດ Optimize Policy ໂດຍກົງຈາກຖານຂໍ້ມູນ Preference (ຂໍ້ມູນວ່າອັນໃດດີກວ່າອັນໃດ) ຜ່ານການແກ້ສົມຜົນທາງຄະນິດສາດ ປ່ຽນບັນຫາ RL ໃຫ້ກາຍເປັນບັນຫາ Classification (Cross-Entropy Loss) ທຳມະດາ.
ຄະນິດສາດເບື້ອງຫຼັງ DPO (Mathematics of DPO)
DPO ອາໄສ Bradley-Terry model ໃນການຄິດໄລ່ຄວາມໜ້າຈະເປັນທີ່ມະນຸດຈະເລືອກຄຳຕອບທີ່ດີກວ່າ ( - chosen) ທຽບກັບຄຳຕອບທີ່ບໍ່ດີ ( - rejected).
ໂດຍປົກກະຕິໃນ RLHF, ເຮົາຈະມີ Reward function . ແຕ່ໃນ DPO, ນັກວິໄຈໄດ້ພິສູດວ່າ ຖ້າເຮົາ Optimize Reward model ໃຫ້ເໝາະສົມ, ນ້ຳໜັກຂອງ Policy ທີ່ດີທີ່ສຸດ ສາມາດຂຽນສະແດງໃນຮູບແບບຂອງ Policy ປັດຈຸບັນ ແລະ Policy ອ້າງອີງ ໄດ້ດັ່ງນີ້:
ເມື່ອທົດແທນສົມຜົນນີ້ລົງໃນ Bradley-Terry model ເຮົາຈະໄດ້ DPO Loss Function ດັ່ງນີ້:
- : ປະໂຫຍກ Prompt.
- : ຄຳຕອບທີ່ຖືກເລືອກ (Win/Chosen).
- : ຄຳຕອບທີ່ຖືກປະຕິເສດ (Lose/Rejected).
- : ໂມເດວພາສາທີ່ເຮົາກຳລັງຝຶກ (Policy Model).
- : ໂມເດວພາສາຕົ້ນສະບັບກ່ອນຝຶກ (Reference Model).
- : ພາລາມິເຕີຄວບຄຸມ (Temperature parameter) ທີ່ຈັດການຄ່າ KL Divergence penalty ເພື່ອບໍ່ໃຫ້ໂມເດວໃໝ່ຕ່າງຈາກໂມເດວເກົ່າຫຼາຍເກີນໄປ.
ການປະຍຸກໃຊ້ DPO ໃນບໍລິບົດຮ່ວມກັບພາສາລາວ
ລອງນຶກພາບວ່າ ທ່ານກຳລັງສ້າງ LLM ສຳລັບບໍລິການລູກຄ້າໃຫ້ກັບທຸລະກິດ SME ຫຼື ແອັບຮຽກລົດໃນນະຄອນຫຼວງວຽງຈັນ (ເຊັ່ນ: LOCA). ທ່ານຢາກໃຫ້ໂມເດວຕອບດ້ວຍ “ພາສາລາວມາດຕະຖານທີ່ສຸພາບ” ແທນທີ່ຈະໃຊ້ພາສາທີ່ຫຍາບຄາຍ ຫຼື ມີຄຳສັບພາສາອື່ນປົນມາຫຼາຍເກີນໄປ.
ແທນທີ່ຈະສ້າງ Reward Model ແບບເກົ່າ, ທ່ານພຽງແຕ່ກຽມ Dataset ເປັນຄູ່ດັ່ງນີ້:
- Prompt (x): “ຂໍວິທີເດີນທາງໄປງານບຸນທາດຫຼວງປີນີ້ແດ່”
- Chosen (): “ສະບາຍດີ! ທ່ານສາມາດໃຊ້ບໍລິການລົດເມສາທາລະນະນະຄອນຫຼວງ ຫຼື ຮຽກລົດຜ່ານແອັບ LOCA ເພື່ອເດີນທາງໄປສະໜາມຫຼວງໄດ້ຢ່າງສະດວກສະບາຍຄຸນລູກຄ້າ.”
- Rejected (): “ໄປຊອກເອງໃນແຜນທີ່ Google Map ໂລດ ໃຜຊິໄປຮູ້.”
DPO ຈະປັບ Weights ຂອງໂມເດວ ໃຫ້ເພີ່ມ Probability ສຳລັບ ແລະ ຫຼຸດ Probability ເປັນ Penalty ໃຫ້ກັບ ໄປພ້ອມໆກັນ ໂດຍອາໄສສົມຜົນຂ້າງເທິງ.
ຕົວຢ່າງໂຄດ: ການສ້າງ DPO ດ້ວຍ trl ໂດຍ Hugging Face
ໃນການພັດທະນາຈິງ, ເຮົາສາມາດນຳໃຊ້ Library ຊື່ວ່າ trl (Transformer Reinforcement Learning) ຂອງ Hugging Face ເຊິ່ງມີ DPOTrainer ທີ່ຊ່ວຍຈັດການຄວາມຊັບຊ້ອນທັງໝົດໄດ້.
from datasets import load_dataset
from transformers import AutoModelForCausalLM, AutoTokenizer
from trl import DPOTrainer, DPOConfig
import torch
# 1. ໂຫຼດໂມເດວ ແລະ Tokenizer (ຕົວຢ່າງໂມເດວ Llama ຫຼື qwen ທີ່ຮອງຮັບພາສາລາວ)
model_id = "Qwen/Qwen1.5-7B"
tokenizer = AutoTokenizer.from_pretrained(model_id)
# ໂຫຼດວາງໂມເດວ 2 ຕົວ: Policy (ທີ່ຈະຖືກ Train) ແລະ Reference
model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype=torch.bfloat16, device_map="auto")
ref_model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype=torch.bfloat16, device_map="auto")
# 2. ໂຫຼດຖານຂໍ້ມູນ DPO (ຕ້ອງມີ column: 'prompt', 'chosen', 'rejected')
# ສົມມຸດວ່າເຮົາສ້າງ Dataset ການສົນທະນາພາສາລາວໄວ້ແລ້ວ
dataset = load_dataset("json", data_files="lao_preference_dataset.json", split="train")
# 3. ຕັ້ງຄ່າ DPO configuration
training_args = DPOConfig(
output_dir="./dpo_lao_model",
beta=0.1, # ຄ່າ Beta ສຳລັບ KL penalty
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
learning_rate=5e-6,
num_train_epochs=3,
save_steps=100,
logging_steps=10
)
# 4. ສ້າງອອບເຈັກ DPOTrainer
dpo_trainer = DPOTrainer(
model,
ref_model,
args=training_args,
train_dataset=dataset,
tokenizer=tokenizer,
)
# 5. ເລີ່ມຕົ້ນການປັບຈູນໂມເດວ!
dpo_trainer.train()
Key Takeaways
- ປະຢັດຊັບພະຍາກອນ: DPO ບໍ່ຈຳເປັນຕ້ອງໃຊ້ Reward Model ແຍກຕ່າງຫາກ ເຮັດໃຫ້ຫຼຸດຜ່ອນການໃຊ້ VRAM ຂອງ GPU ໄດ້ຫຼາຍ ເໝາະສຳລັບທີມນັກພັດທະນາໃນລາວທີ່ມີທຶນຈຳກັດ.
- ສະຖຽນລະພາບສູງ: ການປ່ຽນຈາກ RL ໄປເປັນວິທີ Classification ປົກກະຕິ ເຮັດໃຫ້ການ Train ມີຄວາມສະຖຽນຫຼາຍຂຶ້ນ ໂອກາດທີ່ໂມເດວຈະເກີດ Mode Collapse ຫຼຸດລົງ.
- ໂຄງສ້າງ Dataset ທີ່ລຽບງ່າຍ: ຕ້ອງການພຽງແຕ່ Prompt, ຄຳຕອບທີ່ມັກ, ແລະ ຄຳຕອບທີ່ບໍ່ມັກ.
ສະຫຼຸບ
DPO (Direct Preference Optimization) ຖືເປັນການປະຕິວັດວິທີການປັບຈູນ (Align) Large Language Models ຢ່າງແທ້ຈິງ. ດ້ວຍການລຶບຄວາມຊັບຊ້ອນຂອງຂັ້ນຕອນ PPO ແລະ Reward Modeling ທີ່ເຄີຍມີໃນ RLHF, ນັກພັດທະນາ ແລະ ນັກວິໄຈໃນລາວ ສາມາດນຳໃຊ້ເຕັກນິກນີ້ໃນການສ້າງ AI ທີ່ເຂົ້າໃຈວັດທະນະທຳ, ພາສາ ແລະ ບໍລິບົດການໃຫ້ບໍລິການແບບລາວໆ ໄດ້ຢ່າງວ່ອງໄວ, ປະຢັດຕົ້ນທຶນ ແລະ ມີປະສິດທິພາບສູງສຸດ. ການເຊື່ອມຕໍ່ເຕັກໂນໂລຊີລະດັບໂລກເຂົ້າກັບການໃຊ້ງານໃນລະດັບທ້ອງຖິ່ນບໍ່ແມ່ນເລື່ອງຍາກອີກຕໍ່ໄປ.