Model dan platform AI

Optimasi Preferensi Langsung: Panduan Lengkap

mm
Tambahkan Unite.AI ke sumber pilihan Anda di Google

Mengatur model bahasa besar (LLM) dengan nilai dan preferensi manusia adalah tantangan. Metode tradisional, seperti Reinforcement Learning from Human Feedback (RLHF), telah membuka jalan dengan mengintegrasikan input manusia untuk memperbaiki output model. Namun, RLHF dapat kompleks dan intensif sumber daya, memerlukan daya komputasi dan pengolahan data yang substansial. Optimasi Preferensi Langsung (DPO) muncul sebagai pendekatan baru dan lebih ramping, menawarkan alternatif yang efisien untuk metode tradisional ini. Dengan menyederhanakan proses optimasi, DPO tidak hanya mengurangi beban komputasi tetapi juga meningkatkan kemampuan model untuk beradaptasi cepat dengan preferensi manusia

Dalam panduan ini, kita akan menyelami DPO, menjelajahi dasar-dasarnya, implementasinya, dan aplikasi praktisnya.

Keperluan Alineasi Preferensi

Untuk memahami DPO, penting untuk memahami mengapa mengatur LLM dengan preferensi manusia sangat penting. Meskipun kemampuan mereka yang mengesankan, LLM yang dilatih pada dataset besar dapat kadang-kadang menghasilkan output yang tidak konsisten, bias, atau tidak sejalan dengan nilai manusia. Ketidaksejalan ini dapat muncul dalam berbagai cara:

  • Menghasilkan konten yang tidak aman atau berbahaya
  • Menyediakan informasi yang tidak akurat atau menyesatkan
  • Menampilkan bias yang ada dalam data pelatihan

Untuk mengatasi masalah ini, peneliti telah mengembangkan teknik untuk memperbarui LLM menggunakan umpan balik manusia. Pendekatan yang paling menonjol telah menjadi RLHF.

Memahami RLHF: Pendahulu DPO

Reinforcement Learning from Human Feedback (RLHF) telah menjadi metode utama untuk mengatur LLM dengan preferensi manusia. Mari kita pecah proses RLHF untuk memahami kompleksitasnya:

a) Supervised Fine-Tuning (SFT): Proses dimulai dengan memperbarui LLM yang sudah dilatih pada dataset respons yang berkualitas tinggi. Langkah ini membantu model menghasilkan output yang lebih relevan dan kohesif untuk tugas target.

b) Model Hadiah: Model hadiah terpisah dilatih untuk memprediksi preferensi manusia. Ini melibatkan:

  • Menghasilkan pasangan respons untuk prompt yang diberikan
  • Meminta manusia untuk menilai respons mana yang mereka prefer
  • Melatih model untuk memprediksi preferensi ini

c) Pembelajaran Penguatan: LLM yang sudah diperbarui kemudian dioptimalkan lebih lanjut menggunakan pembelajaran penguatan. Model hadiah menyediakan umpan balik, membimbing LLM untuk menghasilkan respons yang sejalan dengan preferensi manusia.

Berikut adalah pseudocode Python yang disederhanakan untuk mengilustrasikan proses RLHF:

Meskipun efektif, RLHF memiliki beberapa kelemahan:

  • Memerlukan pelatihan dan pemeliharaan beberapa model (SFT, model hadiah, dan model yang dioptimalkan dengan RL)
  • Proses RL dapat tidak stabil dan sensitif terhadap hiperparameter
  • Sangat memerlukan sumber daya komputasi, memerlukan banyak langkah maju dan mundur melalui model

Keterbatasan ini telah memotivasi pencarian alternatif yang lebih sederhana dan efisien, yang mengarah pada pengembangan DPO.

Optimasi Preferensi Langsung: Konsep Inti

Optimasi Preferensi Langsung https://arxiv.org/abs/2305.18290

Optimasi Preferensi Langsung https://arxiv.org/abs/2305.18290

Gambar ini membandingkan dua pendekatan yang berbeda untuk mengatur output LLM dengan preferensi manusia: Reinforcement Learning from Human Feedback (RLHF) dan Optimasi Preferensi Langsung (DPO). RLHF bergantung pada model hadiah untuk membimbing kebijakan model bahasa melalui loop umpan balik iteratif, sedangkan DPO secara langsung mengoptimalkan output model untuk mencocokkan respons yang dipilih manusia menggunakan data preferensi. Perbandingan ini menyoroti kekuatan dan potensi aplikasi dari masing-masing metode, memberikan wawasan tentang bagaimana LLM di masa depan mungkin dilatih untuk lebih sejalan dengan harapan manusia.

Ide Kunci di Balik DPO:

a) Model Hadiah Implisit: DPO menghilangkan kebutuhan akan model hadiah terpisah dengan menganggap model bahasa itu sendiri sebagai fungsi hadiah implisit.

b) Formulasi Berbasis Kebijakan: Sebagai gantinya untuk mengoptimalkan fungsi hadiah, DPO secara langsung mengoptimalkan kebijakan (model bahasa) untuk memaksimalkan kemungkinan respons yang dipilih.

c) Penyelesaian Bentuk Tertutup: DPO memanfaatkan wawasan matematika yang memungkinkan solusi bentuk tertutup untuk kebijakan optimal, menghindari kebutuhan akan pembaruan RL iteratif.

Implementasi DPO: Praktik Code Walkthrough

Gambar di bawah menampilkan cuplikan kode yang mengimplementasikan fungsi kerugian DPO menggunakan PyTorch. Fungsi ini memainkan peran penting dalam memperbarui cara model bahasa memprioritaskan output berdasarkan preferensi manusia. Berikut adalah breakdown dari komponen kunci:

  • Tanda Tangan Fungsi: Fungsi dpo_loss mengambil beberapa parameter, termasuk log probabilitas kebijakan (pi_logps), log probabilitas model referensi (ref_logps), dan indeks yang mewakili kompletasi yang dipilih dan tidak dipilih (yw_idxs, yl_idxs). Selain itu, parameter beta mengontrol kekuatan hukuman KL.
  • Pengambilan Log Probabilitas: Kode mengambil log probabilitas untuk kompletasi yang dipilih dan tidak dipilih dari model kebijakan dan model referensi.
  • Perhitungan Rasio Log: Perbedaan antara log probabilitas untuk kompletasi yang dipilih dan tidak dipilih dihitung untuk model kebijakan dan model referensi. Rasio ini kritis dalam menentukan arah dan besar optimasi.
  • Perhitungan Kerugian dan Hadiah: Kerugian dihitung menggunakan fungsi logsigmoid, sedangkan hadiah ditentukan dengan mengalikan perbedaan antara log probabilitas model kebijakan dan model referensi dengan beta.
Fungsi kerugian DPO menggunakan PyTorch

Fungsi kerugian DPO menggunakan PyTorch

Mari kita menyelami matematika di balik DPO untuk memahami bagaimana ia mencapai tujuan ini.

Matematika DPO

DPO adalah reformulasi yang cerdas dari masalah pembelajaran preferensi. Berikut adalah breakdown langkah demi langkah:

a) Titik Awal: Maksimalisasi Hadiah dengan Konstrain KL

Objektif RLHF asli dapat diekspresikan sebagai:

Rumus matematika yang kompleks dalam gambar berikutnya mewakili fungsi kerugian yang digunakan dalam Optimasi Preferensi Langsung (DPO), metode pelatihan mutakhir yang memperbarui cara LLM mengatur outputnya dengan preferensi manusia.

Di mana:
  • πθ adalah kebijakan (model bahasa) yang kita optimalkan
  • r(x,y) adalah fungsi hadiah
  • πref adalah kebijakan referensi (biasanya model SFT awal)
  • β mengontrol kekuatan konstrain divergensi KL

b) Bentuk Kebijakan Optimal : Dapat ditunjukkan bahwa kebijakan optimal untuk objektif ini memiliki bentuk:

π_r(y|x) = 1/Z(x) * πref(y|x) * exp(1/β * r(x,y))

Di mana Z(x) adalah konstanta normalisasi.

c) Dualitas Hadiah-Kebijakan : Wawasan kunci DPO adalah untuk mengekspresikan fungsi hadiah dalam istilah kebijakan optimal:

r(x,y) = β * log(π_r(y|x) / πref(y|x)) + β * log(Z(x))

d) Model Preferensi : Dengan menganggap preferensi mengikuti model Bradley-Terry, kita dapat mengekspresikan kemungkinan memilih y1 atas y2 sebagai:

p*(y1 ≻ y2 | x) = σ(r*(x,y1) - r*(x,y2))

Di mana σ adalah fungsi logistik.

e) Objektif DPO : Dengan menggantikan dualitas hadiah-kebijakan kita ke dalam model preferensi, kita tiba pada objektif 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)))]

Objektif ini dapat dioptimalkan menggunakan teknik gradien turun standar, tanpa kebutuhan akan algoritma RL.

Mengimplementasikan DPO

Sekarang kita memahami teori di balik DPO, mari kita lihat bagaimana mengimplementasikannya dalam praktek. Kita akan menggunakan Python dan PyTorch untuk contoh ini:

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):
&quot;&quot;&quot;
pi_logps: logprob kebijakan, bentuk (B,)
ref_logps: logprob model referensi, bentuk (B,)
yw_idxs: indeks kompletasi yang dipilih dalam [0, B-1], bentuk (T,)
yl_idxs: indeks kompletasi yang tidak dipilih dalam [0, B-1], bentuk (T,)
beta: suhu yang mengontrol kekuatan hukuman KL</p>

<p>Setiap pasangan (yw_idxs[i], yl_idxs[i]) mewakili indeks pasangan preferensi tunggal.
&quot;&quot;&quot;</p>

<p># Ekstrak log probabilitas untuk kompletasi yang dipilih dan tidak dipilih
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># Hitung rasio log
pi_logratios = pi_yw_logps - pi_yl_logps
ref_logratios = ref_yw_logps - ref_yl_logps</p>

<p># Hitung kerugian 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># Hitung log probabilitas untuk model dan model referensi
pi_logps = self.model(x).log_softmax(-1)
ref_logps = self.ref_model(x).log_softmax(-1)</p>

<p># Hitung kerugian
loss, _ = self.compute_loss(pi_logps, ref_logps, yw_idxs, yl_idxs)
loss.backward()
self.optimizer.step()</p>

return loss.item()

<p># Penggunaan
model = YourLanguageModel() # Inisialisasi model Anda
ref_model = YourLanguageModel() # Muat model referensi yang sudah dilatih
trainer = DPOTrainer(model, ref_model)</p>

<p>for batch in dataloader:
loss = trainer.train_step(batch)
print(f&quot;Kerugian: {loss}&quot;)

Tantangan dan Arah Masa Depan

Meskipun DPO menawarkan kelebihan signifikan atas pendekatan RLHF tradisional, masih ada tantangan dan area untuk penelitian lebih lanjut:

a) Skalabilitas ke Model yang Lebih Besar:

Ketika model bahasa terus tumbuh dalam ukuran, menerapkan DPO secara efisien ke model dengan ratusan miliar parameter masih menjadi tantangan terbuka. Peneliti sedang menjelajahi teknik seperti:

  • Metode pembaruan yang efisien (misalnya, LoRA, prefix tuning)
  • Optimasi pelatihan terdistribusi
  • Checkpoint gradien dan pelatihan presisi campuran

Contoh menggunakan LoRA dengan 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=[&quot;q_proj&quot;, &quot;v_proj&quot;],
lora_dropout=0.05,
bias=&quot;none&quot;,
task_type=&quot;CAUSAL_LM&quot;
)
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># Penggunaan
base_model = YourLargeLanguageModel()
dpo_trainer = DPOTrainerWithLoRA(base_model, ref_model)

b) Adaptasi Multi-Tugas dan Few-Shot:

Mengembangkan teknik DPO yang dapat beradaptasi dengan tugas baru atau domain dengan data preferensi terbatas adalah area penelitian yang aktif. Pendekatan yang sedang dijelajahi termasuk:

  • Kerangka meta-pembelajaran untuk adaptasi cepat
  • Pembaruan berbasis prompt untuk DPO
  • Pembelajaran transfer dari model preferensi umum ke domain spesifik

c) Mengatasi Preferensi yang Ambigu atau Konflik:

Data preferensi dunia nyata sering mengandung ketidakjelasan atau konflik. Meningkatkan ketahanan DPO terhadap data tersebut sangat penting. Solusi potensial termasuk:

  • Model preferensi probabilistik
  • Pembelajaran aktif untuk menyelesaikan ketidakjelasan
  • Agregasi preferensi multi-agents

Contoh model preferensi probabilistik:


<p>class ProbabilisticDPOTrainer(DPOTrainer):
def compute_loss(self, pi_logps, ref_logps, yw_idxs, yl_idxs, preference_prob):
# Hitung rasio log
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>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># Penggunaan
trainer = ProbabilisticDPOTrainer(model, ref_model)
loss = trainer.compute_loss(pi_logps, ref_logps, yw_idxs, yl_idxs, preference_prob=0.8) # 80% kepercayaan pada preferensi

d) Menggabungkan DPO dengan Teknik Alineasi Lain:

Mengintegrasikan DPO dengan pendekatan alineasi lain dapat menghasilkan sistem yang lebih kuat dan mampu:

  • Prinsip AI konstitusional untuk kepuasan konstrain eksplisit
  • Debat dan model hadiah rekursif untuk pengungkapan preferensi kompleks
  • Pembelajaran penguatan invers untuk menginfer fungsi hadiah yang mendasarinya

Contoh menggabungkan DPO dengan AI konstitusional:


<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># Penggunaan
def safety_constraint(model, pi_logps, ref_logps, yw_idxs, yl_idxs):
# Implementasi logika pemeriksaan keamanan
unsafe_score = compute_unsafe_score(model, pi_logps, ref_logps)
return torch.relu(unsafe_score - 0.5) # Hukum jika skor tidak aman &gt; 0.5</p>

<p>constraints = [safety_constraint]
trainer = ConstitutionalDPOTrainer(model, ref_model, constraints=constraints)</p>

Pertimbangan Praktis dan Saran Terbaik

Ketika mengimplementasikan DPO untuk aplikasi dunia nyata, pertimbangkan tips berikut:

a) Kualitas Data: Kualitas dataset preferensi Anda sangat penting. Pastikan dataset Anda:

  • Mencakup berbagai input dan perilaku yang diinginkan
  • Memiliki anotasi preferensi yang konsisten dan dapat diandalkan
  • Mengimbangkan berbagai jenis preferensi (misalnya, faktualitas, keamanan, gaya)

b) Pengaturan Hiperparameter: Meskipun DPO memiliki lebih sedikit hiperparameter daripada RLHF, pengaturan masih penting:

  • β (beta): Mengontrol trade-off antara kepuasan preferensi dan divergensi dari model referensi. Mulai dengan nilai sekitar 0.1-0.5.
  • Laju pembelajaran: Gunakan laju pembelajaran yang lebih rendah daripada pembaruan standar, biasanya dalam rentang 1e-6 hingga 1e-5.
  • Ukuran batch: Ukuran batch yang lebih besar (32-128) sering bekerja dengan baik untuk pembelajaran preferensi.

c) Pembaruan Iteratif: DPO dapat diterapkan secara iteratif:

  1. Latih model awal menggunakan DPO
  2. Hasilkan respons baru menggunakan model yang dilatih
  3. Kumpulkan data preferensi baru pada respons ini
  4. Latih ulang menggunakan dataset yang diperluas

 

Optimasi Preferensi Langsung

Optimasi Preferensi Langsung Kinerja

Gambar ini menunjukkan kinerja LLM seperti GPT-4 dibandingkan dengan penilaian manusia di berbagai teknik pelatihan, termasuk Optimasi Preferensi Langsung (DPO), Pembaruan Halus yang Diawasi (SFT), dan Optimasi Kebijakan Proksimal (PPO). Tabel ini mengungkapkan bahwa output GPT-4 semakin sejalan dengan preferensi manusia, terutama dalam tugas ringkasan. Tingkat kesepakatan antara GPT-4 dan peninjau manusia menunjukkan kemampuan model untuk menghasilkan konten yang sesuai dengan evaluator manusia, hampir sebaik konten yang dihasilkan manusia.

Studi Kasus dan Aplikasi

Untuk mengilustrasikan efektivitas DPO, mari kita lihat beberapa aplikasi dunia nyata dan beberapa varian:

  • DPO Iteratif: Dikembangkan oleh Snorkel (2023), varian ini menggabungkan sampling penolakan dengan DPO, memungkinkan proses pemilihan data pelatihan yang lebih halus. Dengan berulang kali melalui beberapa putaran sampling preferensi, model dapat lebih baik menggeneralisasi dan menghindari overfitting ke preferensi yang bising atau bias.
  • IPO (Optimasi Preferensi Iteratif): Diperkenalkan oleh Azar et al. (2023), IPO menambahkan suatu istilah regularisasi untuk mencegah overfitting, yang merupakan masalah umum dalam optimasi berbasis preferensi. Ekstensi ini memungkinkan model untuk mempertahankan keseimbangan antara memenuhi preferensi dan melestarikan kemampuan generalisasi.
  • KTO (Optimasi Transfer Pengetahuan): Varian lebih baru dari Ethayarajh et al. (2023), KTO menghilangkan preferensi biner sama sekali. Sebagai gantinya, fokusnya adalah pada transfer pengetahuan dari model referensi ke model kebijakan, mengoptimalkan untuk keselarasan yang lebih halus dan konsisten dengan nilai manusia.
  • DPO Multi-Modal untuk Pembelajaran Cross-Domain oleh Xu et al. (2024): Pendekatan di mana DPO diterapkan di berbagai modalitas—teks, gambar, dan audio—menunjukkan kelenturannya dalam mengatur model dengan preferensi manusia di berbagai jenis data. Penelitian ini menyoroti potensi DPO dalam menciptakan sistem AI yang lebih komprehensif yang mampu menangani tugas yang kompleks dan multi-modal.

Kesimpulan

Optimasi Preferensi Langsung mewakili kemajuan signifikan dalam mengatur model bahasa dengan preferensi manusia. Kesederhanaan, efisiensi, dan efektivitasnya membuatnya menjadi alat yang kuat bagi peneliti dan praktisi.

Dengan memanfaatkan kekuatan Optimasi Preferensi Langsung dan memperhatikan prinsip-prinsip ini, Anda dapat menciptakan model bahasa yang tidak hanya menunjukkan kemampuan yang mengesankan tetapi juga sejalan dengan nilai dan tujuan manusia.

Saya telah menghabiskan lima tahun terakhir dengan membenamkan diri dalam dunia Machine Learning dan Deep Learning yang menarik. Minat dan keahlian saya telah memimpin saya untuk berkontribusi pada lebih dari 50 proyek rekayasa perangkat lunak yang beragam, dengan fokus khusus pada AI/ML. Rasa ingin tahu saya yang terus-menerus juga telah menarik saya ke arah Natural Language Processing, sebuah bidang yang saya ingin jelajahi lebih lanjut.