import{s as ht,n as vt,o as wt}from"../chunks/scheduler.f38f3a0e.js";import{S as Ot,i as Dt,e as s,s as i,c as D,r as zt,h as Bt,a as p,d as l,b as a,f as bt,g as m,j as z,u as Lt,k as _t,m as jt,n,o as B,t as L,p as j,q as V}from"../chunks/index.a03143fc.js";import{C as Vt}from"../chunks/CodeBlock.b5d7b6b8.js";import{C as Et}from"../chunks/CourseFloatingBanner.9d00122a.js";import{H as ot,E as Ft}from"../chunks/MermaidChart.svelte_svelte_type_style_lang.487db1bc.js";function Ht(rt){let o,H,E,R,r,Mt="<strong>直接選好最適化（DPO）</strong>",S,M,I,f,Q,U,ft="DPOは、選好の整合を人間の選好データに基づく分類問題として再定義します。従来のRLHFアプローチでは、別個の報酬モデルをトレーニングし、PPO（近接ポリシー最適化）などの複雑なアルゴリズムを使用してモデルの出力を整合させる必要があります。DPOは、好ましい出力と好ましくない出力に基づいてモデルのポリシーを直接最適化する損失関数を定義することで、このプロセスを簡素化します。",N,T,Ut="このアプローチは実際に非常に効果的であり、Llamaなどのモデルのトレーニングに使用されています。別個の報酬モデルや強化学習のステージを必要としないため、DPOは選好の整合をよりアクセスしやすく、安定したものにします。",k,d,Z,u,Tt="DPOのプロセスには、ターゲットドメインにモデルを適応させるための教師あり微調整（SFT）が必要です。これにより、標準的な指示追従データセットでトレーニングすることで、選好学習の基盤が形成されます。モデルは基本的なタスクを完了しながら、一般的な能力を維持することを学びます。",W,y,dt="次に、選好学習が行われ、モデルは好ましい出力と好ましくない出力のペアでトレーニングされます。選好ペアは、モデルがどの応答が人間の価値観や期待に最も一致するかを理解するのに役立ちます。",A,C,ut="DPOの中心的な革新は、その直接最適化アプローチにあります。別個の報酬モデルをトレーニングする代わりに、DPOはバイナリクロスエントロピー損失を使用して、選好データに基づいてモデルの重みを直接更新します。この簡素化されたプロセスにより、トレーニングがより安定し、効率的になり、従来のRLHFメソッドと同等またはそれ以上の結果が得られます。",G,J,X,$,yt="DPOのデータセットは、通常、選好または非選好として注釈された応答ペアを含むように作成されます。これは手動で行うか、自動フィルタリング技術を使用して行うことができます。以下は、単一ターンのDPO選好データセットの構造の例です：",Y,c,Ct="<thead><tr><th>プロンプト</th> <th>選好</th> <th>非選好</th></tr></thead> <tbody><tr><td>…</td> <td>…</td> <td>…</td></tr> <tr><td>…</td> <td>…</td> <td>…</td></tr> <tr><td>…</td> <td>…</td> <td>…</td></tr></tbody>",q,g,Jt="<code>Prompt</code>列には、<code>選好</code>および<code>非選好</code>の応答を生成するために使用されたプロンプトが含まれています。<code>選好</code>および<code>非選好</code>列には、それぞれ好ましい応答と好ましくない応答が含まれています。この構造にはバリエーションがあり、例えば、<code>system_prompt</code>や<code>Input</code>列に参照資料を含めることができます。<code>選好</code>および<code>非選好</code>の値は、単一ターンの会話の場合は文字列として、または会話リストとして表現されることがあります。",K,P,$t='Hugging FaceでDPOデータセットのコレクションを<a href="https://huggingface.co/collections/argilla/preference-datasets-for-dpo-656f0ce6a00ad2dc33069478" rel="nofollow">こちら</a>で見つけることができます。',tt,x,et,b,ct="Transformers Reinforcement Learning（TRL）ライブラリは、DPOの実装を容易にします。<code>DPOConfig</code>および<code>DPOTrainer</code>クラスは、<code>transformers</code>スタイルのAPIに従います。",lt,_,gt="以下は、DPOトレーニングを設定する基本的な例です：",nt,h,it,v,Pt='DPOConfigおよびDPOTrainerクラスの使用方法の詳細については、<a href="../../../notebooks/ja/2_preference_alignment/../notebooks/ja/2_preference_alignment/dpo_finetuning_example.ipynb">DPOチュートリアル</a>を試してみてください。この実践ガイドでは、データの準備からトレーニングおよび評価まで、選好整合の実装方法を説明します。',at,w,xt='⏭️ チュートリアルを完了した後、別の選好整合技術について学ぶために<a href="./orpo.md">ORPOページ</a>を探索してください。',st,O,pt,F,mt;return M=new Et({props:{chapter:10,classNames:"absolute z-10 right-0 top-0",notebooks:[{label:"Google Colab",value:"https://colab.research.google.com/github/huggingface/smol-course/blob/main/notebooks/ja/2_preference_alignment/dpo_finetuning_example.ipynb"}]}}),f=new ot({props:{title:"DPOの理解",local:"dpoの理解",headingTag:"h2"}}),d=new ot({props:{title:"DPOの仕組み",local:"dpoの仕組み",headingTag:"h2"}}),J=new ot({props:{title:"DPOのデータセット",local:"dpoのデータセット",headingTag:"h2"}}),x=new ot({props:{title:"TRLを使用した実装",local:"trlを使用した実装",headingTag:"h2"}}),h=new Vt({props:{code:"ZnJvbSUyMHRybCUyMGltcG9ydCUyMERQT0NvbmZpZyUyQyUyMERQT1RyYWluZXIlMEElMEElM0NDb3B5TExNVHh0TWVudSUyMGNvbnRhaW5lclN0eWxlJTNEJTIyZmxvYXQlM0ElMjByaWdodCUzQiUyMG1hcmdpbi1sZWZ0JTNBJTIwMTBweCUzQiUyMGRpc3BsYXklM0ElMjBpbmxpbmUtZmxleCUzQiUyMHBvc2l0aW9uJTNBJTIwcmVsYXRpdmUlM0IlMjB6LWluZGV4JTNBJTIwMTAlM0IlMjIlM0UlM0MlMkZDb3B5TExNVHh0TWVudSUzRSUwQSUwQSUyMyUyMCVFNSVCQyU5NSVFNiU5NSVCMCVFMyU4MiU5MiVFNSVBRSU5QSVFNyVCRSVBOSUwQXRyYWluaW5nX2FyZ3MlMjAlM0QlMjBEUE9Db25maWcoJTBBJTIwJTIwJTIwJTIwLi4uJTBBKSUwQSUwQSUyMyUyMCVFMyU4MyU4OCVFMyU4MyVBQyVFMyU4MyVCQyVFMyU4MyU4QSVFMyU4MyVCQyVFMyU4MiU5MiVFNSU4OCU5RCVFNiU5QyU5RiVFNSU4QyU5NiUwQXRyYWluZXIlMjAlM0QlMjBEUE9UcmFpbmVyKCUwQSUyMCUyMCUyMCUyMG1vZGVsJTJDJTBBJTIwJTIwJTIwJTIwdHJhaW5fZGF0YXNldCUzRGRhdGFzZXQlMkMlMEElMjAlMjAlMjAlMjB0b2tlbml6ZXIlM0R0b2tlbml6ZXIlMkMlMEElMjAlMjAlMjAlMjAuLi4lMEEpJTBBJTBBJTIzJTIwJUUzJTgzJUEyJUUzJTgzJTg3JUUzJTgzJUFCJUUzJTgyJTkyJUUzJTgzJTg4JUUzJTgzJUFDJUUzJTgzJUJDJUUzJTgzJThCJUUzJTgzJUIzJUUzJTgyJUIwJTBBdHJhaW5lci50cmFpbigp",highlighted:`<span class="hljs-keyword">from</span> trl <span class="hljs-keyword">import</span> DPOConfig, DPOTrainer

&lt;CopyLLMTxtMenu containerStyle=<span class="hljs-string">&quot;float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;&quot;</span>&gt;&lt;/CopyLLMTxtMenu&gt;

<span class="hljs-comment"># 引数を定義</span>
training_args = DPOConfig(
    ...
)

<span class="hljs-comment"># トレーナーを初期化</span>
trainer = DPOTrainer(
    model,
    train_dataset=dataset,
    tokenizer=tokenizer,
    ...
)

<span class="hljs-comment"># モデルをトレーニング</span>
trainer.train()`,wrap:!1}}),O=new Ft({props:{source:"https://github.com/huggingface/smol-course/blob/main/units/ja/unit2/2.md"}}),{c(){o=s("meta"),H=i(),E=s("p"),R=i(),r=s("p"),r.innerHTML=Mt,S=i(),D(M.$$.fragment),I=zt(`
    
直接選好最適化（DPO）は、言語モデルを人間の好みに合わせるための簡素化されたアプローチを提供します。従来のRLHF（人間のフィードバックを用いた強化学習）メソッドとは異なり、DPOは別個の報酬モデルや複雑な強化学習アルゴリズムを必要とせず、選好データを使用してモデルを直接最適化します。
`),D(f.$$.fragment),Q=i(),U=s("p"),U.textContent=ft,N=i(),T=s("p"),T.textContent=Ut,k=i(),D(d.$$.fragment),Z=i(),u=s("p"),u.textContent=Tt,W=i(),y=s("p"),y.textContent=dt,A=i(),C=s("p"),C.textContent=ut,G=i(),D(J.$$.fragment),X=i(),$=s("p"),$.textContent=yt,Y=i(),c=s("table"),c.innerHTML=Ct,q=i(),g=s("p"),g.innerHTML=Jt,K=i(),P=s("p"),P.innerHTML=$t,tt=i(),D(x.$$.fragment),et=i(),b=s("p"),b.innerHTML=ct,lt=i(),_=s("p"),_.textContent=gt,nt=i(),D(h.$$.fragment),it=i(),v=s("p"),v.innerHTML=Pt,at=i(),w=s("p"),w.innerHTML=xt,st=i(),D(O.$$.fragment),pt=i(),F=s("p"),this.h()},l(t){const e=Bt("svelte-u9bgzb",document.head);o=p(e,"META",{name:!0,content:!0}),e.forEach(l),H=a(t),E=p(t,"P",{}),bt(E).forEach(l),R=a(t),r=p(t,"P",{"data-svelte-h":!0}),m(r)!=="svelte-13s032y"&&(r.innerHTML=Mt),S=a(t),z(M.$$.fragment,t),I=Lt(t,`
    
直接選好最適化（DPO）は、言語モデルを人間の好みに合わせるための簡素化されたアプローチを提供します。従来のRLHF（人間のフィードバックを用いた強化学習）メソッドとは異なり、DPOは別個の報酬モデルや複雑な強化学習アルゴリズムを必要とせず、選好データを使用してモデルを直接最適化します。
`),z(f.$$.fragment,t),Q=a(t),U=p(t,"P",{"data-svelte-h":!0}),m(U)!=="svelte-ufeazw"&&(U.textContent=ft),N=a(t),T=p(t,"P",{"data-svelte-h":!0}),m(T)!=="svelte-sv87hr"&&(T.textContent=Ut),k=a(t),z(d.$$.fragment,t),Z=a(t),u=p(t,"P",{"data-svelte-h":!0}),m(u)!=="svelte-u7jw9"&&(u.textContent=Tt),W=a(t),y=p(t,"P",{"data-svelte-h":!0}),m(y)!=="svelte-9ciky2"&&(y.textContent=dt),A=a(t),C=p(t,"P",{"data-svelte-h":!0}),m(C)!=="svelte-owgdra"&&(C.textContent=ut),G=a(t),z(J.$$.fragment,t),X=a(t),$=p(t,"P",{"data-svelte-h":!0}),m($)!=="svelte-j7uihz"&&($.textContent=yt),Y=a(t),c=p(t,"TABLE",{"data-svelte-h":!0}),m(c)!=="svelte-kxaraa"&&(c.innerHTML=Ct),q=a(t),g=p(t,"P",{"data-svelte-h":!0}),m(g)!=="svelte-27vp2r"&&(g.innerHTML=Jt),K=a(t),P=p(t,"P",{"data-svelte-h":!0}),m(P)!=="svelte-1m7fubg"&&(P.innerHTML=$t),tt=a(t),z(x.$$.fragment,t),et=a(t),b=p(t,"P",{"data-svelte-h":!0}),m(b)!=="svelte-1lbpwo0"&&(b.innerHTML=ct),lt=a(t),_=p(t,"P",{"data-svelte-h":!0}),m(_)!=="svelte-te9tlj"&&(_.textContent=gt),nt=a(t),z(h.$$.fragment,t),it=a(t),v=p(t,"P",{"data-svelte-h":!0}),m(v)!=="svelte-82lh99"&&(v.innerHTML=Pt),at=a(t),w=p(t,"P",{"data-svelte-h":!0}),m(w)!=="svelte-rpibn3"&&(w.innerHTML=xt),st=a(t),z(O.$$.fragment,t),pt=a(t),F=p(t,"P",{}),bt(F).forEach(l),this.h()},h(){_t(o,"name","hf:doc:metadata"),_t(o,"content",Rt)},m(t,e){jt(document.head,o),n(t,H,e),n(t,E,e),n(t,R,e),n(t,r,e),n(t,S,e),B(M,t,e),n(t,I,e),B(f,t,e),n(t,Q,e),n(t,U,e),n(t,N,e),n(t,T,e),n(t,k,e),B(d,t,e),n(t,Z,e),n(t,u,e),n(t,W,e),n(t,y,e),n(t,A,e),n(t,C,e),n(t,G,e),B(J,t,e),n(t,X,e),n(t,$,e),n(t,Y,e),n(t,c,e),n(t,q,e),n(t,g,e),n(t,K,e),n(t,P,e),n(t,tt,e),B(x,t,e),n(t,et,e),n(t,b,e),n(t,lt,e),n(t,_,e),n(t,nt,e),B(h,t,e),n(t,it,e),n(t,v,e),n(t,at,e),n(t,w,e),n(t,st,e),B(O,t,e),n(t,pt,e),n(t,F,e),mt=!0},p:vt,i(t){mt||(L(M.$$.fragment,t),L(f.$$.fragment,t),L(d.$$.fragment,t),L(J.$$.fragment,t),L(x.$$.fragment,t),L(h.$$.fragment,t),L(O.$$.fragment,t),mt=!0)},o(t){j(M.$$.fragment,t),j(f.$$.fragment,t),j(d.$$.fragment,t),j(J.$$.fragment,t),j(x.$$.fragment,t),j(h.$$.fragment,t),j(O.$$.fragment,t),mt=!1},d(t){t&&(l(H),l(E),l(R),l(r),l(S),l(I),l(Q),l(U),l(N),l(T),l(k),l(Z),l(u),l(W),l(y),l(A),l(C),l(G),l(X),l($),l(Y),l(c),l(q),l(g),l(K),l(P),l(tt),l(et),l(b),l(lt),l(_),l(nt),l(it),l(v),l(at),l(w),l(st),l(pt),l(F)),l(o),V(M,t),V(f,t),V(d,t),V(J,t),V(x,t),V(h,t),V(O,t)}}}const Rt='{"title":"DPOの理解","local":"dpoの理解","sections":[],"depth":2}';function St(rt){return wt(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class Wt extends Ot{constructor(o){super(),Dt(this,o,St,Ht,ht,{})}}export{Wt as component};
