โมเดลและแพลตฟอร์ม AI
การเพิ่มประสิทธิภาพความชอบโดยตรง: คู่มือฉบับสมบูรณ์
การปรับให้เหมาะสมของโมเดลภาษาขนาดใหญ่ (LLMs) กับค่านิยมและความชอบของมนุษย์นั้นเป็นเรื่องที่ท้าทาย วิธีการแบบดั้งเดิม เช่น การเรียนรู้แบบเสริมกำลังจากข้อมูลรับจากมนุษย์ (RLHF) ได้สร้างเส้นทางโดยการรวมข้อมูลจากมนุษย์เพื่อปรับปรุงผลลัพธ์ของโมเดล อย่างไรก็ตาม RLHF สามารถซับซ้อนและต้องการทรัพยากรมาก ทำให้ต้องใช้กำลังการคำนวณและประมวลผลข้อมูลที่มาก การเพิ่มประสิทธิภาพความชอบโดยตรง (Direct Preference Optimization หรือ DPO) เป็นแนวทางใหม่ที่เป็นทางเลือกที่มีประสิทธิภาพมากกว่าวิธีการแบบดั้งเดิม โดยการทำให้กระบวนการปรับให้เหมาะสมง่ายขึ้น DPO ไม่เพียงแต่ลดภาระการคำนวณ แต่ยังเพิ่มความสามารถของโมเดลในการปรับตัวให้เข้ากับความชอบของมนุษย์ได้อย่างรวดเร็ว
ในคู่มือนี้ เราจะสำรวจ DPO อย่างลึกซึ้ง โดยดูถึงรากฐาน การใช้งาน และการประยุกต์ใช้ในทางปฏิบัติ
ความจำเป็นในการจัดแนวความชอบ
เพื่อทำความเข้าใจ DPO เราต้องเข้าใจว่าทำไมการปรับให้เหมาะสมของ LLMs กับความชอบของมนุษย์จึงมีความสำคัญ LLMs ที่ฝึกฝนจากชุดข้อมูลขนาดใหญ่อาจบางครั้งผลิตผลลัพธ์ที่ไม่สอดคล้องกัน มีอคติ หรือไม่สอดคล้องกับค่านิยมของมนุษย์ การไม่สอดคล้องนี้สามารถแสดงออกมาในหลายรูปแบบ:
- การสร้างเนื้อหาที่ไม่ปลอดภัยหรือเป็นอันตราย
- การให้ข้อมูลที่ไม่ถูกต้องหรือทำให้เข้าใจผิด
- การแสดงออกถึงอคติที่มีอยู่ในชุดข้อมูลการฝึก
เพื่อแก้ไขปัญหาเหล่านี้ นักวิจัยได้พัฒนาวิธีการเพื่อปรับให้เหมาะสมของ LLMs โดยใช้ข้อมูลรับจากมนุษย์ วิธีการที่โดดเด่นที่สุดคือ RLHF
การทำความเข้าใจ RLHF: ต้นกำเนิดของ DPO
การเรียนรู้แบบเสริมกำลังจากข้อมูลรับจากมนุษย์ (RLHF) เป็นวิธีการหลักในการปรับให้เหมาะสมของ LLMs กับความชอบของมนุษย์ มาทำความเข้าใจกระบวนการ RLHF เพื่อเห็นความซับซ้อน:
ก) การปรับให้เหมาะสมแบบดูแล (SFT): กระบวนการเริ่มต้นด้วยการปรับให้เหมาะสมของ LLM ที่ฝึกไว้แล้วบนชุดข้อมูลของคำตอบที่มีคุณภาพสูง ขั้นตอนนี้ช่วยให้โมเดลสร้างผลลัพธ์ที่เกี่ยวข้องและสอดคล้องกันมากขึ้นสำหรับงานเป้าหมาย
ข) การสร้างแบบจำลองรางวัล: โมเดลรางวัลแยกต่างหากถูกฝึกเพื่อคาดการณีความชอบของมนุษย์ ซึ่งเกี่ยวข้องกับ:
- การสร้างคู่คำตอบสำหรับคำสั่งให้ทำ
- การให้คนจัดอันดับว่าคำตอบใดที่พวกเขาชอบมากกว่า
- การฝึกโมเดลเพื่อคาดการณ์ความชอบเหล่านี้
ค) การเรียนรู้แบบเสริมกำลัง: LLM ที่ปรับให้เหมาะสมแล้วจะถูกปรับปรุงเพิ่มเติมโดยใช้การเรียนรู้แบบเสริมกำลัง โมเดลรางวัลให้ข้อมูลรับเพื่อนำโมเดลไปสู่การสร้างคำตอบที่สอดคล้องกับความชอบของมนุษย์
ที่นี่คือตัวอย่างโค้ด Python เพื่อแสดงกระบวนการ RLHF:
แม้ว่า RLHF จะมีประสิทธิภาพ แต่ก็มีข้อเสียหลายประการ:
- ต้องฝึกและดูแลโมเดลหลายแบบ (SFT, โมเดลรางวัล, และโมเดลที่ได้รับการปรับปรุงด้วย RL)
- กระบวนการ RL อาจไม่เสถียรและไวต่อพารามิเตอร์
- เป็นการใช้ทรัพยากรมาก ต้องมีการผ่านข้อมูลไปมาหลายครั้งผ่านโมเดล
ข้อจำกัดเหล่านี้ได้กระตุ้นให้มีการค้นหาวิธีการที่ง่ายกว่าและใช้ทรัพยากรน้อยกว่า ซึ่งนำไปสู่การพัฒนา DPO
การเพิ่มประสิทธิภาพความชอบโดยตรง: หลักการหลัก
รูปภาพนี้เปรียบเทียบสองแนวทางที่แตกต่างกันในการจัดแนวผลลัพธ์ของ LLMs กับความชอบของมนุษย์: การเรียนรู้แบบเสริมกำลังจากข้อมูลรับจากมนุษย์ (RLHF) และการเพิ่มประสิทธิภาพความชอบโดยตรง (DPO) RLHF พึ่งพาโมเดลรางวัลเพื่อนำนโยบายของโมเดลภาษาผ่านวงจรรับข้อมูลซ้ำๆ ในขณะที่ DPO ปรับให้เหมาะสมผลลัพธ์ของโมเดลโดยตรงเพื่อให้ตรงกับความชอบของมนุษย์โดยใช้ข้อมูลความชอบ
แนวคิดหลักของ DPO:
ก) การสร้างแบบจำลองรางวัลโดยไม่แสดงออก: DPO ลดความจำเป็นในการมีโมเดลรางวัลแยกต่างหากโดยการรับทราบโมเดลภาษาเป็นฟังก์ชันรางวัลโดยไม่แสดงออก
ข) การกำหนดรูปแบบนโยบาย: แทนที่จะปรับให้เหมาะสมฟังก์ชันรางวัล DPO ปรับให้เหมาะสมนโยบาย (โมเดลภาษา) โดยตรงเพื่อเพิ่มความน่าจะเป็นของคำตอบที่ชอบ
ค) วิธีแก้ปัญหาแบบปิด: DPO ใช้ข้อค้นพบทางคณิตศาสตร์ที่ทำให้สามารถหาวิธีแก้ปัญหาแบบปิดสำหรับนโยบายที่เหมาะสมที่สุด ซึ่งหลีกเลี่ยงการอัปเดต RL แบบซ้ำๆ
การนำ DPO ไปใช้: การเดินผ่านโค้ดในทางปฏิบัติ
รูปภาพด้านล่างแสดงโค้ดที่ใช้ในการใช้ฟังก์ชันการเสียหายของ DPO โดยใช้ PyTorch ฟังก์ชันนี้มีบทบาทสำคัญในการปรับปรุงวิธีการที่โมเดลภาษาให้ความสำคัญกับผลลัพธ์ตามความชอบของมนุษย์ มาทำความเข้าใจส่วนประกอบหลักๆ:
- ชื่อฟังก์ชัน: ฟังก์ชัน
dpo_lossรับพารามิเตอร์หลายตัว รวมถึงลอการิทึมของความน่าจะเป็นของนโยบาย (pi_logps), ลอการิทึมของความน่าจะเป็นของโมเดลอ้างอิง (ref_logps), และดัชนีที่แสดงถึงการเติมคำที่ชอบและไม่ชอบ (yw_idxs,yl_idxs) นอกจากนี้ยังมีพารามิเตอร์betaที่ควบคุมความเข้มของการลงโทษ KL - การดึงลอการิทึมของความน่าจะเป็น: โค้ดดึงลอการิทึมของความน่าจะเป็นสำหรับการเติมคำที่ชอบและไม่ชอบจากทั้งนโยบายและโมเดลอ้างอิง
- การคำนวณอัตราส่วนลอการิทึม: คำนวณความแตกต่างระหว่างลอการิทึมของความน่าจะเป็นสำหรับการเติมคำที่ชอบและไม่ชอบทั้งสำหรับนโยบายและโมเดลอ้างอิง อัตราส่วนนี้มีความสำคัญในการกำหนดทิศทางและขนาดของการปรับให้เหมาะสม
- การคำนวณการเสียหายและรางวัล: การเสียหายคำนวณโดยใช้ฟังก์ชัน
logsigmoidในขณะที่รางวัลถูกกำหนดโดยการปรับขนาดความแตกต่างระหว่างลอการิทึมของความน่าจะเป็นของนโยบายและโมเดลอ้างอิงด้วยbeta
มาทำความเข้าใจคณิตศาสตร์เบื้องหลัง DPO เพื่อเห็นถึงวิธีการที่มันบรรลุเป้าหมายนี้
คณิตศาสตร์ของ DPO
DPO เป็นการกำหนดรูปแบบใหม่ของปัญหาการเรียนรู้ความชอบ โดยมีรายละเอียดดังนี้:
ก) จุดเริ่มต้น: การเพิ่มรางวัลสูงสุดโดยมีข้อจำกัดของ KL
วัตถุประสงค์เดิมของ RLHF สามารถแสดงเป็น:
- πθ คือนโยบาย (โมเดลภาษา) ที่เรากำลังปรับให้เหมาะสม
- r(x,y) คือฟังก์ชันรางวัล
- πref คือนโยบายอ้างอิง (โดยทั่วไปเป็นโมเดล SFT เริ่มต้น)
- β ควบคุมความเข้มของข้อจำกัดการกระจายตัวของ KL
ข) รูปแบบนโยบายที่เหมาะสมที่สุด: สามารถแสดงได้ว่านโยบายที่เหมาะสมที่สุดสำหรับวัตถุประสงค์นี้มีรูปแบบ:
π_r(y|x) = 1/Z(x) * πref(y|x) * exp(1/β * r(x,y))โดยที่ Z(x) เป็นค่าคงที่การปรับมาตราส่วน
ค) ความสัมพันธ์ระหว่างรางวัลและนโยบาย: ข้อค้นพบหลักของ DPO คือการแสดงฟังก์ชันรางวัลในรูปของนโยบายที่เหมาะสมที่สุด:
r(x,y) = β * log(π_r(y|x) / πref(y|x)) + β * log(Z(x))ง) การสร้างแบบจำลองความชอบ โดยสมมติว่าความชอบเป็นไปตามแบบจำลอง Bradley-Terry สามารถแสดงความน่าจะเป็นที่ชอบ y1 มากกว่า y2 เป็น:
p*(y1 ≻ y2 | x) = σ(r*(x,y1) - r*(x,y2))โดยที่ σ คือฟังก์ชันลอจิสติก
จ) วัตถุประสงค์ของ DPO การแทนความสัมพันธ์ระหว่างรางวัลและนโยบายลงในแบบจำลองความชอบ เราจะได้วัตถุประสงค์ของ DPO:
L_DPO(πθ; πref) = -E_(x,y_w,y_l)~D [log σ(β * log(πθ(y_w|x) / πref(y_w|x)) - β * log(πθ(y_l|x) / πref(y_l|x)))]วัตถุประสงค์นี้สามารถถูกปรับให้เหมาะสมโดยใช้เทคนิคการล่องหนเชิงเส้นมาตรฐาน
การนำ DPO ไปใช้
ตอนนี้ที่เราเข้าใจทฤษฎีเบื้องหลัง DPO มาทำความเข้าใจวิธีการนำไปใช้ในทางปฏิบัติกัน โดยใช้ Python และ PyTorch เป็นตัวอย่าง:
import torch
import torch.nn.functional as F
<p>class DPOTrainer:
def __init__(self, model, ref_model, beta=0.1, lr=1e-5):
self.model = model
self.ref_model = ref_model
self.beta = beta
self.optimizer = torch.optim.AdamW(self.model.parameters(), lr=lr)</p>
<p>def compute_loss(self, pi_logps, ref_logps, yw_idxs, yl_idxs):
"""
pi_logps: ลอการิทึมของความน่าจะเป็นของนโยบาย, รูป (B,)
ref_logps: ลอการิทึมของความน่าจะเป็นของโมเดลอ้างอิง, รูป (B,)
yw_idxs: ดัชนีของการเติมคำที่ชอบ, รูป (T,)
yl_idxs: ดัชนีของการเติมคำที่ไม่ชอบ, รูป (T,)
beta: อุณหภูมิที่ควบคุมความเข้มของการลงโทษ KL</p>
<p># ดึงลอการิทึมของความน่าจะเป็นสำหรับการเติมคำที่ชอบและไม่ชอบ
pi_yw_logps, pi_yl_logps = pi_logps[yw_idxs], pi_logps[yl_idxs]
ref_yw_logps, ref_yl_logps = ref_logps[yw_idxs], ref_logps[yl_idxs]</p>
<p># คำนวณอัตราส่วนลอการิทึม
pi_logratios = pi_yw_logps - pi_yl_logps
ref_logratios = ref_yw_logps - ref_yl_logps</p>
<p># คำนวณการเสียหายของ DPO
losses = -F.logsigmoid(self.beta * (pi_logratios - ref_logratios))
rewards = self.beta * (pi_logps - ref_logps).detach()</p>
return losses.mean(), rewards
<p>def train_step(self, batch):
x, yw_idxs, yl_idxs = batch
self.optimizer.zero_grad()</p>
<p># คำนวณลอการิทึมของความน่าจะเป็นสำหรับโมเดลและโมเดลอ้างอิง
pi_logps = self.model(x).log_softmax(-1)
ref_logps = self.ref_model(x).log_softmax(-1)</p>
<p># คำนวณการเสียหาย
loss, _ = self.compute_loss(pi_logps, ref_logps, yw_idxs, yl_idxs)
loss.backward()
self.optimizer.step()</p>
return loss.item()
<p># การใช้งาน
model = YourLanguageModel() # เริ่มต้นโมเดลของคุณ
ref_model = YourLanguageModel() # โหลดโมเดลอ้างอิงที่ฝึกไว้แล้ว
trainer = DPOTrainer(model, ref_model)</p>
<p>for batch in dataloader:
loss = trainer.train_step(batch)
print(f"การเสียหาย: {loss}")
ความท้าทายและทิศทางในอนาคต
แม้ว่า DPO จะมีข้อดีหลายประการ แต่ยังคงมีความท้าทายและพื้นที่สำหรับการวิจัยต่อไป:
ก) การขยายขนาดไปยังโมเดลขนาดใหญ่:
การนำ DPO ไปใช้กับโมเดลที่มีพารามิเตอร์หลายร้อยพันล้านยังคงเป็นความท้าทายที่เปิดอยู่ นักวิจัยกำลังสำรวจเทคนิคต่างๆ เช่น:
- วิธีการปรับให้เหมาะสมที่มีประสิทธิภาพ (เช่น LoRA, prefix tuning)
- การปรับปรุงการฝึกแบบกระจาย
- การตรวจสอบเกรเดียนต์และการฝึกแบบมีประสิทธิภาพผสม
ตัวอย่างการใช้ LoRA กับ DPO:
<p>from peft import LoraConfig, get_peft_model</p> <p>class DPOTrainerWithLoRA(DPOTrainer): def __init__(self, model, ref_model, beta=0.1, lr=1e-5, lora_rank=8): lora_config = LoraConfig( r=lora_rank, lora_alpha=32, target_modules=["q_proj", "v_proj"], lora_dropout=0.05, bias="none", task_type="CAUSAL_LM" ) self.model = get_peft_model(model, lora_config) self.ref_model = ref_model self.beta = beta self.optimizer = torch.optim.AdamW(self.model.parameters(), lr=lr)</p> <p># การใช้งาน base_model = YourLargeLanguageModel() dpo_trainer = DPOTrainerWithLoRA(base_model, ref_model)
ข) การปรับให้เหมาะสมแบบหลายงานและแบบไม่ต้องฝึกมาก:
การสร้างเทคนิค DPO ที่สามารถปรับให้เหมาะสมกับงานใหม่หรือโดเมนใหม่ได้อย่างรวดเร็วโดยใช้ข้อมูลความชอบที่จำกัดเป็นเรื่องที่กำลังได้รับการวิจัยอยู่ โดยมีการสำรวจแนวทางต่างๆ เช่น:
- เฟรมเวิร์กการเรียนรู้แบบเมต้าสำหรับการปรับให้เหมาะสมอย่างรวดเร็ว
- การปรับให้เหมาะสมแบบใช้พรอมต์สำหรับ DPO
- การเรียนรู้แบบถ่ายโอนจากแบบจำลองความชอบทั่วไปไปยังโดเมนเฉพาะ
ค) การจัดการความชอบที่ไม่ชัดเจนหรือขัดแย้ง:
ข้อมูลความชอบในโลกแห่งความเป็นจริงมักจะมีความไม่ชัดเจนหรือความขัดแย้ง การปรับปรุงความทนทานของ DPO ต่อข้อมูลดังกล่าวจึงมีความสำคัญ โดยมีแนวทางที่เป็นไปได้ เช่น:
- การสร้างแบบจำลองความชอบแบบความน่าจะเป็น
- การเรียนรู้แบบแอคทีฟเพื่อแก้ไขความไม่ชัดเจน
- การรวมความชอบแบบหลายตัวแทน
ตัวอย่างการสร้างแบบจำลองความชอบแบบความน่าจะเป็น:
<p>class ProbabilisticDPOTrainer(DPOTrainer): def compute_loss(self, pi_logps, ref_logps, yw_idxs, yl_idxs, preference_prob): # คำนวณอัตราส่วนลอการิทึม pi_yw_logps, pi_yl_logps = pi_logps[yw_idx], pi_logps[yl_idxs] ref_yw_logps, ref_yl_logps = ref_logps[yw_idx], ref_logps[yl_idxs]</p> <p>log_ratio_diff = pi_yw_logps.sum(-1) - pi_yl_logps.sum(-1) loss = -(preference_prob * F.logsigmoid(self.beta * log_ratio_diff) + (1 - preference_prob) * F.logsigmoid(-self.beta * log_ratio_diff)) return loss.mean()</p> <p># การใช้งาน trainer = ProbabilisticDPOTrainer(model, ref_model) loss = trainer.compute_loss(pi_logps, ref_logps, yw_idxs, yl_idxs, preference_prob=0.8) # ความมั่นใจ 80% ในความชอบ
ง) การรวม DPO กับเทคนิคการจัดแนวอื่นๆ:
การรวม DPO กับวิธีการจัดแนวอื่นๆ อาจนำไปสู่ระบบที่มีความทนทานและสามารถใช้งานได้จริงมากขึ้น:
- หลักการ AI ที่เป็นรูปธรรมสำหรับการสร้างข้อจำกัดอย่างชัดเจน
- การถกเถียงและการสร้างแบบจำลองรางวัลแบบเรียกซ้ำสำหรับการค้นหาความชอบที่ซับซ้อน
- การเรียนรู้แบบผกผันเพื่อสร้างฟังก์ชันรางวัลที่ซ่อนอยู่
ตัวอย่างการรวม DPO กับหลักการ AI ที่เป็นรูปธรรม:
<p>class ConstitutionalDPOTrainer(DPOTrainer): def __init__(self, model, ref_model, beta=0.1, lr=1e-5, constraints=None): super().__init__(model, ref_model, beta, lr) self.constraints = constraints or []</p> <p>def compute_loss(self, pi_logps, ref_logps, yw_idxs, yl_idxs): base_loss = super().compute_loss(pi_logps, ref_logps, yw_idxs, yl_idxs)</p> <p>constraint_loss = 0 for constraint in self.constraints: constraint_loss += constraint(self.model, pi_logps, ref_logps, yw_idxs, yl_idxs)</p> return base_loss + constraint_loss <p># การใช้งาน def safety_constraint(model, pi_logps, ref_logps, yw_idxs, yl_idxs): # ต้องเขียนลอจิกการตรวจสอบความปลอดภัย unsafe_score = compute_unsafe_score(model, pi_logps, ref_logps) return torch.relu(unsafe_score - 0.5) # ลงโทษหากคะแนนความไม่ปลอดภัยมากกว่า 0.5</p> <p>constraints = [safety_constraint] trainer = ConstitutionalDPOTrainer(model, ref_model, constraints=constraints)</p>
ข้อพิจารณาในทางปฏิบัติและแนวทางที่ดีที่สุด
เมื่อนำ DPO ไปใช้ในแอปพลิเคชันจริง ควรพิจารณาเคล็ดลับต่อไปนี้:
ก) คุณภาพของข้อมูล: คุณภาพของชุดข้อมูลความชอบมีความสำคัญอย่างมาก ตรวจสอบให้แน่ใจว่าชุดข้อมูลของคุณ:
- ครอบคลุมช่วงกว้างของอินพุตและพฤติกรรมที่ต้องการ
- มีการจัดอันดับความชอบที่สอดคล้องและเชื่อถือได้
- สมดุลระหว่างประเภทความชอบต่างๆ (เช่น ความถูกต้อง, ความปลอดภัย, สไตล์)
ข) การปรับพารามิเตอร์: แม้ว่า DPO จะมีพารามิเตอร์น้อยกว่า RLHF การปรับพารามิเตอร์ยังคงมีความสำคัญ:
- β (เบต้า): ควบคุมการแลกเปลี่ยนระหว่างความพึงพอใจของความชอบและความแตกต่างจากโมเดลอ้างอิง เริ่มต้นด้วยค่าระหว่าง 0.1-0.5
- อัตราการเรียนรู้: ใช้อัตราการเรียนรู้ที่ต่ำกว่าการปรับให้เหมาะสมมาตรฐาน โดยทั่วไปอยู่ในช่วง 1e-6 ถึง 1e-5
- ขนาดแบตช์: ขนาดแบตช์ที่ใหญ่กว่า (32-128) มักจะทำงานได้ดีสำหรับการเรียนรู้ความชอบ
ค) การปรับปรุงแบบซ้ำๆ: DPO สามารถใช้ซ้ำๆ:
- ฝึกโมเดลเริ่มต้นโดยใช้ DPO
- สร้างคำตอบใหม่โดยใช้โมเดลที่ฝึกไว้
- รวบรวมข้อมูลความชอบใหม่เกี่ยวกับคำตอบเหล่านี้
- ฝึกซ้ำโดยใช้ชุดข้อมูลที่ขยาย
รูปภาพนี้แสดงผลการทำงานของ LLMs เช่น GPT-4 เมื่อเปรียบเทียบกับการตัดสินของมนุษย์ข้ามเทคนิคการฝึกต่างๆ รวมถึงการเพิ่มประสิทธิภาพความชอบโดยตรง (DPO), การปรับให้เหมาะสมแบบดูแล (SFT), และการเพิ่มประสิทธิภาพนโยบายแบบโปรกซิมอล (PPO) ตารางแสดงให้เห็นว่า GPT-4 สามารถสร้างเนื้อหาที่สอดคล้องกับความชอบของมนุษย์ โดยเฉพาะในงานสรุปผล
กรณีศึกษาและการประยุกต์ใช้
เพื่อแสดงถึงประสิทธิผลของ DPO มาทำความรู้จักกับกรณีศึกษาและรูปแบบการใช้งานจริงบางตัวอย่าง:
- การเพิ่มประสิทธิภาพความชอบโดยตรงแบบซ้ำๆ: พัฒนาโดย Snorkel (2023) รูปแบบนี้รวมการวาดตัวอย่างการปฏิเสธเข้ากับ DPO ทำให้สามารถเลือกข้อมูลฝึกที่มีคุณภาพสูงได้ดีขึ้น
- IPO (การเพิ่มประสิทธิภาพความชอบแบบซ้ำๆ): เสนอโดย Azar et al. (2023) IPO เพิ่มเทอมการปรับให้เหมาะสมเพื่อป้องกันการปรับให้เหมาะสมมากเกินไป ซึ่งเป็นปัญหาทั่วไปในการปรับให้เหมาะสมตามความชอบ
- KTO (การถ่ายโอนความรู้): รูปแบบล่าสุดจาก Ethayarajh et al. (2023) KTO ไม่ใช้ความชอบแบบทวินามอีกต่อไป แต่เน้นการถ่ายโอนความรู้จากโมเดลอ้างอิงไปยังนโยบาย
- การเพิ่มประสิทธิภาพความชอบโดยตรงแบบหลายโหมดสำหรับการเรียนรู้ข้ามโดเมน โดย Xu et al. (2024): การนำ DPO ไปใช้กับโหมดต่างๆ เช่น ข้อความ, รูปภาพ, และเสียง แสดงให้เห็นถึงความสามารถในการจัดแนวโมเดลกับความชอบของมนุษย์ข้ามข้อมูลหลายรูปแบบ
















