確認問題と詳しい解答
この章では、本ガイド全体で扱った内容の理解を確認し、定着させるための包括的な問題を示します。各問題は、重要な概念、アルゴリズム、またはシステム設計上の判断を対象としています。これは、表面的な知識と真の専門性を分ける種類の知識です。自己評価にこの問題集を使い、詳しい解答を読む前に、まず自分で答えてみてください。問題は、基礎概念(LLMアーキテクチャ、強化学習の基礎)から中核アルゴリズム(PPO、DPO、GRPO)、さらに高度なシステム設計とエージェント型AIのトピックへと進みます。
基礎問題
Note
Q0a: デコーダーのみのTransformerにおけるアテンション機構の役割は何ですか?なぜ因果的なのですか?
解答: アテンション機構によって、各トークンは他のトークンの表現にアテンションを向け(つまり、重み付き和を計算し)、利用できます。デコーダーのみのTransformerでは、アテンションは 因果的 (自己回帰的とも呼ばれます)です。トークン \(t\) はトークン \(1, \ldots, t\) にしかアテンションを向けられず、未来のトークン \(t+1, \ldots, T\) には決して向けられません。
なぜ因果的なのか? モデルはテキストを左から右へ生成するからです。推論時には、未来のトークンは文字どおりまだ存在しません。学習中の因果マスクはこの制約をシミュレートし、モデルが左側のコンテキストだけを使って各トークンを予測するように学習させます。数学的には、アテンション行列にマスクを適用します。 \[ \text{Attention}(Q, K, V) = \text{softmax}!\left(\frac{QK^\top}{\sqrt{d_k}} + M\right) V \] ここで、\(M_{ij} = -\infty\) は \(j > i\)(未来の位置)であり、対応するアテンション重みを強制的にゼロにします。
実用上の意味: これにより、推論時のKVキャッシュ最適化が可能になります。過去のトークンのキーとバリューは変化しないため、キャッシュして再利用でき、新しいトークンごとの生成量を \(O(T^2)\) から \(O(T)\) に削減できます。
復習: 第1章(LLMのアーキテクチャと最適化手法)。
Note
Q0b: Flash Attentionを説明してください。どのような問題を、どのように解決しますか?
解答: 標準的なアテンションは完全な \(T \times T\) アテンション行列を計算するため、\(O(T^2)\) のメモリを必要とし、 メモリ帯域幅律速 になります。GPUは実際の計算ではなく、HBM(低速で大容量)とSRAM(高速で小容量)の間でデータを移動することに時間の大半を費やします。
Flash Attentionの洞察: 完全なアテンション行列をHBM上に展開しません。代わりに、計算をSRAMに収まるブロックへタイル分割し、オンラインsoftmaxアルゴリズムを使ってブロック単位でアテンションを計算し、最終出力だけをHBMへ書き込みます。
主要な技法:
タイル分割: Q、K、VをSRAMに収まるサイズ \(B_r \times B_c\) のブロックに分割する
オンラインsoftmax: 累積最大値と累積和を追跡し、行全体を保持せずにsoftmaxを逐次計算する
再計算: 逆伝播では、高コストな \(T \times T\) 行列を保存する代わりに、Q、K、Vからアテンションを再計算する(計算自体は安価)
結果: HBMメモリは \(O(T)\)(\(O(T^2)\) ではなく)となり、実時間で2–4\(\times\)高速化し、近似ではなく数値的に完全に同じ出力を得られます。
復習: 第1〜2章(LLMアーキテクチャ、システム基盤)。
Note
Q0c: SFT、RLHF、DPOの大まかな違いは何ですか?それぞれをいつ使いますか?
解答:
SFT(教師ありファインチューニング): 高品質なデモンストレーションを模倣するようにモデルを学習させます。損失は、精選データ上での次トークン予測です。形式とスタイルを教えます。
RLHF: 人間の選好から報酬モデルを学習し、それに対してRL(PPO)で方策を最適化します。モデルはデモンストレーションデータを超えて探索します。人間が何を好むかを教えます。
DPO: 報酬モデルを省略し、対照損失を使って選好ペア \((y_w, y_l)\) 上で方策を直接最適化します。目的はRLHFと同じですが、パイプラインはより単純です。
典型的なパイプライン: まずSFTでモデルに良い出発点を与え、次にRLHFまたはDPOで選好を洗練します。SFTだけでは、冗長で、過度に保険をかけた応答になりがちです。RLHF/DPOによって出力はより直接的になり、人間の意図に沿うようになります。
使い分け: 正解例となる出力があるならSFTを使います。選好ペアがあり、計算資源が限られているならDPOを使います。最高品質が必要で、インフラに投資できるならRLHF(PPO)を使います。
復習: 第5、6、10章(PPO、DPO、SFTのベストプラクティス)。
Note
Q0d: 報酬モデルとは何ですか?どのように学習し、何が問題になり得ますか?
解答: 報酬モデル(RM)は、(プロンプト、応答)ペアを受け取り、品質を表すスカラー値を出力するニューラルネットワークです。人間の選好データで学習し、ペア \((y_w, y_l)\) で \(y_w\) が好まれる場合に、RMが \(R(y_w) > R(y_l)\) を割り当てるように学習します。
学習: Bradley-Terry損失は \(\mathcal{L} = -\log\sigma(R(y_w) - R(y_l))\) です。アーキテクチャは通常、方策と同じTransformerを使い、LMヘッドをスカラー射影に置き換えます。
起こり得る問題:
報酬ハッキング: 方策がRMでは高得点になるものの、実際には品質の低い出力(過度に長い、反復的、RMが偏って好む特定のフレーズを含むなど)を見つけます。
分布シフト: RMは以前の方策の出力で学習されています。学習が進むと、現在の方策はRMが正確に採点できない分布外の出力を生成します。
ラベルノイズ: 人間のアノテーターの意見が一致しなかったり、疲れていたり、基準を一貫して適用しなかったりします。このノイズはRMの予測へ伝播します。
過信: RMが見たことのない出力に極端なスコアを割り当て、誤解を招く勾配信号を与えます。
復習: 第9章(報酬モデルの学習)。
Note
Q0e: RLにおける探索と活用のトレードオフを説明してください。LLMの学習ではどのように現れますか?
解答: RLでは、エージェントは次のバランスを取る必要があります。
活用: 高い報酬をもたらすと分かっているアクションを選ぶこと(貪欲な振る舞い)
探索: さらに高い報酬をもたらすかもしれない新しいアクションを試すこと(失敗する可能性もあります)
LLMの学習では: 方策は言語モデルです。「アクション」はトークンの選択です。「活用」とは、すでに高得点だったものに似た応答を生成することです。「探索」とは、新しい言い回し、構造、推論経路を試すことです。
どのように現れるか:
生成時の温度: 温度が高いほど探索が増えます。GRPOは温度1.0を使い、各グループ内で多様なサンプルを得ます。
KLペナルティ: 探索に対するブレーキとして働き、方策が参照モデルから離れすぎるのを防ぎます。これがないと、方策は高報酬の単一テンプレートへ崩壊する可能性があります(モード崩壊)。
GRPOのグループサンプリング: プロンプトごとに \(G\) 個の応答を生成して出力空間を明示的に探索し、その後、平均を上回る応答を強化します。
緊張関係: 探索が少なすぎる \(\rightarrow\) モデルが局所最適(いつも同じ安全な答え)に留まります。多すぎる \(\rightarrow\) 学習が不安定になり、品質が大きく変動します。
復習: 第3章と第7章(強化学習への導入、GRPO)。
中核アルゴリズムの問題
Note
Q1: PPOのクリップ付き目的関数を説明してください。なぜ通常のPGよりうまく機能するのですか?
解答: 通常の方策勾配は \(\nabla J = \mathbb{E}[\nabla\log\pi(a\vert s) \cdot \hat{A}]\) です。問題は、たった1つの幸運な、または不運なサンプルが巨大な勾配を生み \(\rightarrow\) 方策が悪い領域へ飛び \(\rightarrow\) 役に立たない出力を生成し \(\rightarrow\) 次の勾配がさらに悪化させる \(\rightarrow\) 回復不能な「死のスパイラル」に陥ることです。
PPOの解決策: 確率比 \(r = \pi_\text{new}/\pi_\text{old}\) を \([0.8, 1.2]\) にクリップします。
仕組み: 良いアクション(\(\hat{A}>0\))では、目的関数は \(\min(r\hat{A}, 1.2\hat{A})\) です。\(r\) が1.2を超えると、それ以上の利得はなくなり、方策が1つの例に過度に固執するのを止めます。悪いアクション(\(\hat{A}<0\))では、目的関数は \(\min(r\hat{A}, 0.8\hat{A})\) です。\(r\) が0.8を下回るとペナルティの増加が止まり、壊滅的忘却を防ぎます。
重要な洞察: これはTRPOのKL制約の一次近似ですが、高コストな二次最適化を必要としません。各更新で方策が変化するのは最大でも \(\pm\)20%です。
特にLLMでは: トークンレベルの比 \(r_t = \pi_\theta(y_t\vert y_{<t})/\pi_\text{old}(y_t\vert y_{<t})\) により、単一トークンの確率が大きく変わりすぎるのを防ぎ、一貫した生成を維持します。
復習: 第5章(PPO)。
Note
Q2: 第一原理からDPOを導出してください。どのような仮定を置きますか?
解答: RLHFの目的関数から始めます。\(\max_\pi \mathbb{E}[r(x,y)] - \beta D_\text{KL}[\pi\\vert \pi_\text{ref}]\) です。
ステップ1: KKT条件を書きます。最適方策は閉形式 \(\pi^*(y\vert x) \propto \pi_\text{ref}(y\vert x)\exp(r(x,y)/\beta)\) を持ちます。
ステップ2: 逆変換して報酬を表します。\(r(x,y) = \beta\log(\pi^*/\pi_\text{ref}) + \beta\log Z(x)\) です。
ステップ3: Bradley-Terryモデル \(P(y_w \succ y_l) = \sigma(r(y_w) - r(y_l))\) に代入します。同じプロンプトなので分配関数 \(Z(x)\) は相殺されます。
ステップ4: \(\pi^*\) を \(\pi_\theta\)(学習対象のパラメータ化された方策)に置き換えます。\(\mathcal{L} = -\mathbb{E}[\log\sigma(\beta\log\frac{\pi_\theta(y_w)}{\pi_\text{ref}(y_w)} - \beta\log\frac{\pi_\theta(y_l)}{\pi_\text{ref}(y_l)})]\) です。
仮定:
Bradley-Terry選好モデル(ペア比較、引き分けなし、推移的)
\(\pi_\theta\) によって最適方策を実現できる(十分な容量がある)
選好は学習データと同じ分布から生成される(分布シフトがない)
参照モデルは固定されており、妥当である
仮定が崩れる場合: 現実の選好は推移的でなく、学習中にデータがシフトし、ラベルにもノイズがあります \(\rightarrow\) そのためOnline DPOやIPOが存在します。
復習: 第6章(DPO)。
Note
Q3: GRPOとPPOはどのように比較され、どちらをいつ選びますか?トレードオフは何ですか?
解答:
GRPOの利点:
価値関数が不要: 1モデル分のメモリと複雑さを節約できる
より単純: ハイパーパラメータが少なく、直感的(平均より上=良い、平均より下=悪い)
検証可能な報酬に適する: 数学やコードでは \(r \in \{0, 1\}\) が明確な信号を与える
DeepSeek-R1は、二値報酬だけで創発的な推論を教えられることを示した
PPOの利点:
トークンごとの信用割当: 価値関数が系列全体だけでなく各トークンに報酬を割り当てる
サンプル効率が高い: GAEは価値予測を使ってアドバンテージを推定するため、\(G\) 個のサンプルを生成しなくてよい
微妙な差を含む報酬に適する: 報酬が連続値で、トークン間の変化が大きい場合
より成熟している: OpenAI、Anthropicなどで実運用に耐えることが検証されている
目安: 報酬が検証可能(正解/不正解)なら \(\rightarrow\) GRPO。報酬が微妙な差を含み(RMスコア)、最高品質が必要なら \(\rightarrow\) PPO。計算資源が限られるなら \(\rightarrow\) GRPO(クリティックの学習が不要)です。
計算量の比較: GRPOはプロンプトごとに \(G\) 個の応答を生成するため生成量は8\(\times\)になりますが、価値関数の学習を省略します。合計の計算量は近くても、配分が異なります(生成が多く、学習が少ない)。
復習: 第5章と第7章(PPO、GRPO)。
Note
Q4: GAEはどのように機能しますか?LLMの具体例を順に説明してください。
解答: GAEは \(n\) ステップTD誤差の加重和です。\(\hat{A}_t = \sum_{l=0}^{T-t} (\gamma\lambda)^l \delta_{t+l}\) で表されます。
具体例: 応答は5トークンで、報酬は最後だけにあります(\(r_5 = 0.8\))。価値予測は \(V_1=0.5, V_2=0.55, V_3=0.6, V_4=0.65, V_5=0.7\) です。
TD誤差(\(\gamma=1\))は、\(\delta_1 = 0 + V_2 - V_1 = 0.05\)、\(\delta_2 = 0 + V_3 - V_2 = 0.05\)、...、\(\delta_5 = 0.8 + 0 - 0.7 = 0.1\) です。
\(\lambda = 0.95\) のとき、\(\hat{A}_5 = 0.1\)(最後のTD誤差そのもの)、\(\hat{A}_4 = 0.05 + 0.95 \times 0.1 = 0.145\)、\(\hat{A}_3 = 0.05 + 0.95 \times 0.145 = 0.188\) などとなります。
解釈: トークン3のアドバンテージが0.188になるのは、期待より高い報酬を得た系列に貢献したからです。前のトークンにも、指数減衰を通じてクレジットが伝わります。
LLMでは: \(\gamma=1.0\) です(すべてのトークンが重要で、有限ホライズン)。トークン \(t\) のアドバンテージは、「このトークンの後に続いたものを考えると、このトークンの選択は期待より良かったか、悪かったか?」に答えます。
復習: 第5章(PPO)。
Note
Q5: 報酬ハッキングをどう防ぎますか?多層防御戦略を示してください。
解答: 検出シグナル: RMスコアは上がっているのに勝率が横ばい、または低下する。応答長が単調に伸びる。KLダイバージェンスが \(>\) 15になる。多様性(一意なn-gram)が低下する。高報酬の出力を読むと、悪用の仕組みが見つかる。
多層防御(優先順位順):
KLペナルティ (第一優先): 適応制御器はKL \(\approx\) 6を目標にする。KLが上がると \(\beta\) が自動的に増え、参照モデルから離れすぎるのを防ぐ。
報酬モデルアンサンブル (3〜5モデル): スコアの最小値または平均値を使う。モデルごとに盲点が異なるため、1つを欺く悪用がすべてを欺くことはめったにない。
長さのペナルティ: \(r' = r - c \cdot \max(0, \text{length} - L_\text{target})\)。 「長く生成するだけで高スコアになる」という悪用を防ぐ。
定期的なRM更新: 2000ステップごとに現在の方策からデータを生成し、再ラベル付けしてRMの学習セットに加える。モデルが悪用を見つけると、その穴を塞ぐ。
勝率に基づく停止: SFTベースラインに対する勝率を追跡する。RMスコアが上がっているのに勝率が200ステップ以上停滞したら学習を止める。モデルは改善ではなく悪用をしている。
検出後の回復: 最後の「クリーンな」チェックポイントにロールバックする。\(\beta\) を2\(\times\)増やす。発見した悪用をRMの負例に加える。
復習: 第9章と第11章(報酬モデルの学習、システムアーキテクチャ)。
システム設計の問題
Note
Q6: 70Bモデルを学習するRLHFシステムを設計してください。すべてのコンポーネントを順に説明してください。
解答: A100-80GB GPU 72基上に、3クラスタの分離アーキテクチャを構成します。
クラスタ1 — 生成(32 GPU):
vLLMインスタンスを8つ、各TP=4で配置する。PagedAttentionと投機的デコーディング(1Bドラフトモデル)を使う。
連続バッチ処理で、処理中の系列は最大256個。帯域幅のため重みはINT8にする。
出力は(プロンプト、応答、トークンごとの対数確率)。スループットは毎分 \(\sim\)500応答。
ステートレスで、共有ストアから最新の重みを読み込むだけなので、容易に復旧できる。
クラスタ2 — スコアリング(8 GPU):
報酬モデル(70B、INT8 = 70GB)を4 GPU(TP=4)に配置する。
参照モデル(70B、INT8)を4 GPU(TP=4)に配置し、KL用のトークンごとの対数確率を計算する。
出力は報酬スコアとトークンごとのKL。軽量なバッチ推論を行う。
クラスタ3 — 学習(32 GPU):
FSDP(ZeRO-3)による方策モデル。Flash Attention 2と勾配チェックポイントを使う。
バッファからスコア付き経験を消費する。PPO更新は、ミニバッチ16で4エポック行う。
更新済み重みを50ステップごとに共有ストアへ送る(非同期のバックグラウンド転送)。
100ステップごとに非同期チェックポイントを作る(NVMeへのノンブロッキング書き込みとS3バックアップ)。
接続基盤:
生成 \(\rightarrow\) スコア: Ray/Redisキュー(バッチあたり \(\sim\)10 MB、トークンIDと対数確率)
スコア \(\rightarrow\) 学習: 経験バッファ(循環バッファで、直近500ステップを保持)
学習 \(\rightarrow\) 生成: 共有並列FS(Lustre/GPFS)上の重みストア。140GBを50ステップごとに非同期で送る。
オーバーラップ: 学習がステップ \(N\) を処理している間に、生成はすでにステップ \(N+1\) のデータを作っている。これにより生成レイテンシを隠し、モノリシック構成に対して1.3〜1.5\(\times\)のスループットを達成する。
復習: 第11章(システムアーキテクチャと大規模インフラ)。
Note
Q7: 生成ボトルネックにどう対処しますか?解決策を定量化してください。
解答: 生成はRLHFの実時間全体の60〜70%を占めます。根本原因は、自己回帰デコーディングがメモリ帯域幅律速であることです(演算強度は \(\approx 1\) FLOP/byteで、A100のルーフラインは156 FLOP/byte)。
効果の大きい順に並べた解決策:
1. 生成と学習を分離 (エンドツーエンドで1.3〜1.5\(\times\)): 別ハードウェアで生成を実行し、学習と重ねる。アーキテクチャ上の効果が最も大きい。
2. PagedAttention付きvLLM (2〜4\(\times\)): 内部フラグメンテーションによるKVキャッシュのメモリ浪費60〜80%をなくす。3〜4\(\times\)大きなバッチが可能になり、帯域幅利用率が向上する。
3. 連続バッチ処理 (1.5〜2\(\times\)): 最長系列の完了を待たず、空いたスロットですぐに新しい系列を開始する。GPUを稼働し続けられる。
4. 投機的デコーディング (2〜3\(\times\)): 1Bドラフトモデルが5トークンを提案し、70Bモデルが1回のフォワードパスで5つすべてを並列検証する。平均3〜4個を受け入れる \(\rightarrow\) 1回のフォワードパスで1個ではなく3〜4トークン生成できる。
5. 生成重みにINT8/FP8を使う (2\(\times\)): トークンごとに読み込む140GBの重みを半減する。そもそも温度付きサンプリングを行い、INT8を使うのは生成だけで学習はBF16のままなので、品質低下は最小限である。
6. CUDAグラフとカーネル融合 (1.1〜1.3\(\times\)): Python/CUDAの起動オーバーヘッドをなくし、layernorm+attention+MLPを少数のカーネルに融合する。
組み合わせた場合: 素朴な実装に対して \(1.5 \times 3 \times 1.5 \times 2.5 \times 2 \times 1.2 = 40\times\) となる。実際には収穫逓減により、素朴な実装に対する合計効果は \(\sim\)10〜20\(\times\)に制限される。
復習: 第2章と第11章(システム基盤、システムアーキテクチャ)。
Note
Q8: 分離システムにおける重みの同期を説明してください。どの程度の古さまで許容できますか?
解答:
問題: 生成クラスタは方策の重みを使って応答を生成し、学習クラスタはその重みを更新します。両者は異なるハードウェア上にあります。どう同期を保つべきでしょうか?
完全同期が無駄な理由: 70B BF16の完全同期は140GBです。InfiniBand 400Gb/s(50GB/s)なら、1回の同期に2.8秒かかります。毎ステップ(50〜90秒ごと)に同期すると、時間の3〜5%を重み転送に使うことになります。許容範囲ですが、不要です。
古さの許容度の分析:
ステップごとの方策変化: \(\sim\)0.1%(パラメータ差分の平均で測定)
50ステップ: 累積ドリフトは \(\sim\)5%
PPOのクリップ範囲: 確率比の最大20%のずれに対応
経験的結果: 50ステップ古くても \(\rightarrow\) 品質低下は \(<\)2%(勝率で測定)
本番戦略:
学習50ステップごとに、完全なBF16チェックポイントを共有ストアへ送る(転送2.8秒)
生成クラスタでは、バッチ間にノンブロッキングで重みを再読み込みする
差分圧縮(任意): 変更されたパラメータだけを送り(INT8差分は \(\approx\) 5GB)、オフセットとして適用する。帯域幅を10\(\times\)削減できる。
非常に大規模(256 GPU以上)の場合はストリーミング同期を使い、バックグラウンドで小さなチャンクを継続的に送る。平均の古さは5〜10ステップ。
重要な注意点: 生成中に計算する対数確率は古い重みを使います。PPO比 \(\pi_\text{new}/\pi_\text{old}\) は、これらの古い対数確率を使って \(\pi_\text{old}\) を計算します。PPOはオフポリシー補正を想定して設計されているため、これは問題ありません。
復習: 第11章(システムアーキテクチャと大規模インフラ)。
Note
Q9: 512 GPUでこのシステムをフォールトトレラントにするにはどうしますか?
解答: 512 GPUではMTBFが4〜8時間です。5日間の学習実行では15〜30回の障害が発生します。
アーキテクチャレベルの耐障害性:
生成クラスタはステートレス。失敗したインスタンスは \(<\)60秒未満で再起動できる(重みを読み込むだけで、状態がない)。
学習クラスタはステートフル。チェックポイントに基づく復旧が必要。
スコアリングクラスタはステートレス。生成クラスタと同じ。
チェックポイント戦略:
頻度: 50〜100ステップごと(学習5〜10分ごと)。
方法: 非同期(ノンブロッキング)。次のステップを進める間にバックグラウンドスレッドが書き込む。FSDPの分散保存を使い、各ランクが自分のシャードを並列に保存する。
内容: モデル重み、オプティマイザー状態(Adamのm/v)、LRスケジューラー、RNG状態、KL適応係数、グローバルステップカウンター、リプレイバッファポインター。
保存先: ローカルNVMe(高速で70Bなら30秒)と、S3/共有FSへの非同期コピー(耐久性)。
保持: 最新のチェックポイント3つを残し、古いものは自動削除する。
検出と復旧の流れ:
NCCL集合通信のタイムアウト(60秒)またはハートビート欠落(10秒) \(\rightarrow\) 障害を検出する。
NVMLヘルスチェックで失敗したノードを特定する。
選択肢A(高速、\(<\)2分): Torch Elasticでワールドサイズを縮小し、シャードを再配分して \(N-1\) ノードで続行する。バックグラウンドで交換ノードを要求する。
選択肢B(クリーン、\(\sim\)5分): 交換ノードを起動し、プロセスグループを再構築し、最後のチェックポイントを読み込んで再開する。
経験バッファは永続化されているため、再生成は不要。
予防: 事前のストレステスト(GEMM、メモリ、NVLink)。ECCエラーの監視(エラーが急増したら予防的に移行)。ホットスペアノード(環境を事前ロード済み)。ネットワーク冗長性のためのデュアルレールInfiniBand。
復習: 第11章(システムアーキテクチャと大規模インフラ)。
Note
Q10: 7Bから70B、405Bへどのようにスケールさせますか?各規模で何が変わりますか?
解答:
7B(8 GPUの単一ノード、数時間):
アーキテクチャ: モノリシック(TRLのデフォルト)。すべてのモデルを同じGPUに置く。
メモリ: LoRAとINT8の参照モデル/RMは8\(\times\)80GBに容易に収まる。
並列性: DP=8またはノード内FSDP。ネットワーク通信はない。
ハイパーパラメータ: LR=\(5\times10^{-6}\)、大きめの \(\beta\)=0.02、50K〜100Kステップ。
時間: 1回の実行に4〜12時間。高速に反復できる。
70B(32〜64 GPU、2〜5日):
アーキテクチャ: 半分離。vLLMによる生成とFSDPによる学習。
メモリ: ZeRO-3が必須。勾配チェックポイント。参照モデル/RMはINT8。
並列性: ノード内の生成はTP=8、ノード間の学習はFSDP。
ハイパーパラメータ: LR=\(1.5\times10^{-6}\)、中程度の \(\beta\)=0.05、10K〜30Kステップ。
フォールトトレランス: 非同期チェックポイントと監視を使うが、手動でも管理できる。
405B(256〜512 GPU、1〜3週間):
アーキテクチャ: 完全分離。クラスタを分け、重みストアとキューを使う。
メモリ: 学習はZeRO-3 + TP=8 + PP=2。生成はINT4。
並列性: 3D並列(TP\(\times\)PP\(\times\)DP = 8\(\times\)2\(\times\)16 = 学習256 GPU)。
ハイパーパラメータ: LR=\(5\times10^{-7}\)、非常に保守的な \(\beta\)=0.1、2K〜5Kステップ。
フォールトトレランス: 必須。エラスティック学習、冗長チェックポイント、ホットスペアを使う。
大きな変化: 必要なRL学習量は大幅に少ない(事前学習ですでに非常に高い能力を持つため)。しかし1ステップが50\(\times\)高価なので、不安定性は致命的になる。
逆説: 大きなモデルほど、実は1ステップ単位ではRL学習しやすい(より安定し、損失地形も滑らか)です。しかし不安定性のコストはモデルサイズに比例し、405Bでの失敗した実行は10万ドル以上の計算資源を無駄にします。
復習: 第11章(システムアーキテクチャと大規模インフラ)。
実践とデバッグの問題
Note
Q11: 報酬スコアは上がっているのにモデル品質が低下しています。診断して修正してください。
解答: 典型的な 報酬ハッキング/グッドハートの法則 です。
診断手順:
応答長を確認: 学習中の平均長をプロットする。単調に増えているなら、長さの悪用(RMが長い応答に高いスコアを与える)です。
KLダイバージェンスを確認: \(>\)15なら、方策が参照モデルから離れすぎ、能力を失っています。
多様性を確認: 応答ごとの一意なトライグラムを調べる。低下しているなら、モード崩壊(同じ高報酬パターンの反復)です。
手動検査: 報酬が最も高い応答を20個読む。共通するパターンは何か(例: すべて「良い質問です!」で始まる、すべて箇条書きを使う、過度に留保する)。
勝率: 取り置きプロンプトでSFTベースラインと比較する。RMが上がる一方で横ばいまたは低下していれば、悪用が確定です。
即時の修正:
勝率が改善していた最後のチェックポイントへロールバックする
\(\beta\) を2〜3\(\times\)増やす(KLペナルティを強める)
明示的な長さペナルティを追加する: \(r' = r - 0.001 \cdot \max(0, \text{len} - 500)\)
構造的な修正(再発防止):
RMアンサンブル: 異なるデータ分割で3〜5個のRMを学習し、最小値または平均値を使う。悪用はモデル固有である。
RM更新: 2000ステップごとに現在の方策から生成し、人間のラベルを得てRMを再学習する。
多目的報酬: 別々のRMによる有用性+無害性+簡潔性を組み合わせる。
RMスコアではなく勝率で早期停止する。最適化する指標は学習信号と異なるべきである。
復習: 第9章と第11章(報酬モデルの学習、システムアーキテクチャ)。
Note
Q12: RL学習用のプロンプト分布をどう決めますか?
解答: プロンプトの品質は、RLHFで最も過小評価されている要因です。悪いプロンプトは、学習信号がないことを意味します。
構成(デフォルトの配分):
40% 実ユーザーのトラフィック(実際のユースケースを表す)
30% 合成データ(LLM生成で、まれなトピックやエッジケースなどカバレッジの穴を埋める)
20% カリキュラム(段階的な難易度。易しい問題から始め、モデルの改善に合わせて複雑さを上げる)
10% 敵対的データ(レッドチームのプロンプト、脱獄の試み、曖昧な指示)
重要: ゴルディロックスフィルター:
各候補プロンプトについて、現在のモデルで4〜8個の応答を生成する。
RMで採点し、合格率(しきい値を上回る割合)を計算する。
合格率が20〜80%のプロンプトだけを残す。
\(<\)20%: 難しすぎる。モデルがほぼ必ず失敗する \(\rightarrow\) すべてのアドバンテージが負になる \(\rightarrow\) 有用な勾配がない。
\(>\)80%: 易しすぎる。モデルがほぼ必ず成功する \(\rightarrow\) すべてのアドバンテージが正になる \(\rightarrow\) コントラストがない。
20〜80%: ちょうどよい。成功と失敗が混ざり \(\rightarrow\) 何が有効かについて明確な信号が得られる。
500学習ステップごとに再フィルタリングする(モデルが改善し、難易度分布が変化するため)。
トピックの多様性: 1つのトピックが支配しないようにする(カテゴリごとに \(<\)10%)。埋め込みクラスタリングでカバレッジを確認する。そうしないとモデルは支配的なトピックに対して過剰最適化する。
復習: 第7章と第9章(GRPO、報酬モデルの学習)。
Note
Q13: RLHFにおけるLoRAと完全ファインチューニングを比較してください。それぞれをいつ使いますか?
解答:
LoRA (低ランク適応、\(r\)=64、\(\alpha\)=16):
学習可能なパラメータ: モデルの \(\sim\)0.2%(70Bでは2億)
メモリ節約: 別の参照モデルが不要(ベースモデル=参照モデル)で、140GBを節約できる。
安定性: 本質的により安定している(低ランク制約が方策のドリフトを制限する)
速度: 更新するパラメータが少ないため1ステップは速いが、より多くのステップが必要になる場合がある
品質の上限: 通常、完全FTの品質の90〜95%
完全ファインチューニング:
すべてのパラメータを更新する。表現力が最大。
別の参照モデルコピーが必要(70Bで140GB)。または「アンカー」として非常に頻繁なチェックポイント作成が必要。
壊滅的忘却のリスクが高い。より低いLR(LoRAの \(3\times\)低い値)と、より強い \(\beta\) が必要。
適する場合: 大きな分布シフトが必要(新しい言語、非常に異なるスタイル)で、LoRAが容量限界に達したとき。
判断の枠組み:
LoRA(\(r\)=64)から始める。3\(\times\)安価で、より安定している。
LoRA行列の勾配ノルムを監視する。一貫して \(>\)1.0(パラメータ数に対して高い)なら、LoRAは容量制限を受けている。
勝率が頭打ちになり、かつ勾配分析が容量制限を示す場合にだけ完全FTへ切り替える。
完全FTでは \(\text{LR}/3\)、\(\beta \times 2\)、より頻繁なチェックポイント作成、勝率に基づく早期停止を使う。
ハイブリッド: アラインメント/安全性にはLoRA(小さな振る舞いの変化)を、能力/推論には完全FT(大きな変化が必要)を使う。
復習: 第1章と第10章(LLMアーキテクチャ、SFTのベストプラクティス)。
Note
Q14: プロセス報酬モデル(PRM)と結果報酬モデル(ORM)を比較してください。PRMシステムを設計してください。
解答:
ORM: 最終解答だけを採点する。「応答全体は良いか?」を問う。単純だが、推論のどこが間違ったかは特定できない。
PRM: 中間ステップをそれぞれ採点する。「この導出のステップ3は正しいか?」を問う。はるかに情報量が多いが、学習は難しい。
推論におけるPRMの利点:
推論が失敗した場所を正確に特定できる(ステップレベルの信用割当)
木探索が可能になる: ステップスコアの高い枝だけを展開する
報酬ハッキングが少ない: 間違ったステップと幸運な最終解答で高スコアを得ることができない
MATHベンチマークでは、PRM+best-of-NがORM+best-of-Nを10〜20%上回る
PRMの学習:
データ収集 (モンテカルロ方式):
各問題について、推論トレースをステップごとに生成する
各ステップ \(k\) で、その地点から解答を \(M\) 回(\(M=32\))完成させる
ステップスコア=正解に到達した完成例の割合
スコアが大きく低下するステップが「間違い」のステップ
ラベル付け: 完成率が \(>\)50%なら「正しい」、\(<\)20%なら「誤り」とする。
モデル: ベースモデルと同じアーキテクチャに、トークン位置ごとの分類ヘッドを追加する。ステップラベルに対する二値交差エントロピーで学習する。
推論: 各ステップを採点する。いずれかのステップが \(<\)0.3なら、そのトレースを不備ありとしてフラグ付けする。
RLHFでPRMを使う: PRMのトークンごとの報酬を直接GAEへ入力する。系列の最後だけでなく、各トークンが即時フィードバックを得るため、長い推論チェーンの信用割当が大幅に改善する。
復習: 第9章と第13章(報酬モデルの学習、大規模推論モデルのためのRL)。
Note
Q15: RLが実際にモデルを改善したかどうかをどう評価しますか?
解答: 多面的に評価します(「品質」を単一の指標で捉えることはできません)。
1. 勝率 (最も重要で、最も信頼できる):
多様なプロンプトを500個以上用意する。LLMジャッジ(GPT-4またはClaude)が、SFTベースラインとのブラインドA/B比較で勝者を選ぶ。
目標: 勝率 \(>\)55%は意味のある改善、\(>\)65%は大きな改善。
位置バイアスを除去する(A/Bの順序を入れ替えて平均する)。信頼区間を報告する。
2. 能力ベンチマーク (退行の検出):
MMLU(知識)、HumanEval(コード)、MATH(推論)、MT-Bench(マルチターン)。
\(>\)2%の低下は、懸念すべきアラインメント税である。どのカテゴリが劣化したか調べる。
3. カテゴリ別評価:
安全性: 有害なプロンプトに対する拒否率(上がるべき)
真実性: TruthfulQAスコア(上がるか、少なくとも横ばいであるべき)
有用性: 指示追従ベンチマークでのタスク完了率
4. 分布指標:
応答長の分布(大きく変化すべきではない)
語彙の多様性(応答ごとの一意なトークン)
形式への準拠(特定の形式向けに学習した場合)
5. 人手評価 (ゴールドスタンダードで高コスト):
例ごとに3人以上の熟練アノテーターでブラインドA/Bを行う。アノテーター間一致率は \(>\)70%。
学習中ではなく、最終モデルの選択だけに使う(遅すぎて高コストなため)。
危険信号: RMスコアが上がり勝率が横ばいなら、真の改善ではなく報酬ハッキング。勝率が上がりベンチマークが下がるなら、アラインメント税が高すぎるためRLの強度を下げる。
復習: 第14章(LLM評価)。
Note
Q16: 報酬モデルの学習パイプラインを端から端まで説明してください。
解答:
フェーズ1 — データ生成:
多様なプロンプトを50K〜100K件集める(実トラフィック+合成データ)
プロンプトごとに、異なる温度(0.3、0.7、1.0)と複数モデルから4〜8個の応答を生成する(多様性が重要で、すべての応答が似ていると選好情報が役に立たない)。
合計: 200K〜800K件の候補応答
フェーズ2 — 選好収集:
選択肢A(高コストで最高品質): 人間のアノテーターがペアを比較する。1ペアにつき3人。費用は比較1回あたり2〜5ドル。
選択肢B(安価で、人間との一致率85〜90%): LLMジャッジ(GPT-4/Claude)。10\(\times\)安価で、大規模化に向く。
形式: (プロンプト、選択された応答、拒否された応答)。アノテーターの一致率が \(<\)70%のペアは破棄する。
最終データセット: 100K〜500Kペア
フェーズ3 — 学習:
アーキテクチャ: ベースLLMと同じものにスカラー・ヘッドを追加する(系列ごとに1つの回帰出力)。
Loss: \(\mathcal{L} = -\mathbb{E}[\log\sigma(r(x,y_w) - r(x,y_l))]\) (Bradley-Terry).
学習: 1エポックだけ! RMは極めて速く過学習する。検証精度68〜75%は良好で、それ以上はアノテーションのアーティファクトへの過学習を意味することが多い。
工夫: 報酬を0の周りに中心化する(移動平均を引く)。長さバイアスを確認し、長さとスコアの相関が \(>\)0.3なら学習に長さペナルティを加える。
フェーズ4 — 検証:
ホールドアウト選好ペア: 精度は68〜75%であるべき。
新規データでの人間との一致率: \(>\)80%。
長さバイアスの確認: 応答長とRMスコアの相関は \(<\)0.2であるべき。
一貫性の確認: 同じプロンプトの言い換え応答には、似たスコアが付くべき。
復習: 第9章(報酬モデルの学習)。
Note
Q17: KLダイバージェンスが爆発すると何が起きますか?根本原因と修正方法を示してください。
解答:
KLが測るもの: 現在の方策と参照モデルの平均対数比です。\(D_\text{KL} = \mathbb{E}_{y\sim\pi_\theta}[\log(\pi_\theta(y\vert x)/\pi_\text{ref}(y\vert x))]\)。KL=0は参照モデルと同一、KL=10は方策が好む出力に10ナット多く確率を置くことを意味します。
健全な範囲: 学習中は3〜10。ゆっくり増えるのは問題ないが、突然の急上昇は問題です。
KL爆発の根本原因:
学習率が高すぎる: 方策が大きく更新され、参照モデルから発散する。修正: LRを2〜5\(\times\)下げる。
報酬ハッキング: 参照モデルの振る舞いから遠く離れた高報酬の悪用を見つけた。修正: \(\beta\) を増やし、RMアンサンブルを加える。
モード崩壊: 方策が1つの応答テンプレートに集中する。そのテンプレートではKLが高く、他では低い。修正: エントロピーボーナスと温度を上げる。
悪いバッチ: 極端なアドバンテージを持つ不運なバッチが方策を押し動かした。修正: 勾配クリッピングとミニバッチサイズの削減。
価値関数の発散: 間違ったアドバンテージ推定が誤った更新を引き起こした。修正: 価値関数のLRを下げるか、GRPO(価値関数なし)へ切り替える。
復旧手順:
検出: KLが50ステップ以上 \(>\)15、または1ステップでKLが \(>\)5急上昇した場合。
即時対応: 最後のクリーンなチェックポイントを読み込む(KL \(<\)10)。
調整: LRを50%下げる。\(\beta\) を2\(\times\)増やす。クリップ範囲を0.1に下げる。
再開: 最初の200ステップを注意深く監視する。
復習: 第5章と第7章(PPO、GRPO)。
Note
Q18: モノリシックなRLHFアーキテクチャと分離RLHFアーキテクチャを比較してください。それぞれはいつ適切ですか?
解答:
モノリシック (TRLのデフォルト: 単一プロセスで、すべてのモデルを同じGPUに置く):
利点: コードが単純。分散システムの複雑さがなく、デバッグしやすい。
欠点: GPUが時間の60%アイドルになる(生成中は計算資源が、学習中は帯域幅がアイドル)。\(\sim\)16 GPUを超えると効率よくスケールしない。すべてのモデルが同じメモリを奪い合う。
適する場合: モデルが \(\leq\)13B、単一ノード、研究/プロトタイピング。
半分離 (vLLM生成+FSDP学習、同一クラスタ):
利点: 利用率が高い(生成と学習を部分的に重ねられる)。64 GPUまでスケールする。
欠点: 依然としてハードウェアを共有するため独立最適化できない。モノリシックより複雑。
適する場合: 13B〜70B、2〜8ノード、本番実験。
完全分離 (キューで接続した別クラスタ):
利点: 各クラスタをワークロード向けに最適化できる。生成を学習から独立してスケールできる。生成クラスタはステートレスで、フォールトトレランスが容易。数百GPUまでスケールする。
欠点: 分散システムの複雑さ、重みの古さ、キュー管理、ネットワークオーバーヘッド。
適する場合: \(\geq\)70Bの本番学習。スケール、フォールトトレランス、高利用率が必要な場合。
重要な洞察: 生成は帯域幅律速で、学習は計算律速です。同じハードウェアを両方に最適化することはできません。分離すれば生成ノードには高いメモリ帯域幅、INT8重み、大きなバッチを、学習ノードには完全なBF16精度、Flash Attention、FSDPシャーディングを持たせられます。
復習: 第11章(システムアーキテクチャと大規模インフラ)。
Note
Q19: RL学習向けのカリキュラム学習をどう設定しますか?
解答: カリキュラムとは、モデルが段階的に学べるよう難易度を徐々に上げることです。
重要な理由: 弱いモデルに最難関のプロンプトを与えると、すべて負の報酬になり \(\rightarrow\) 学習信号がなくなります(すべて同じように悪い)。易しい問題から始めれば、モデルは基礎能力を身につけ、その上に能力を積み上げられます。
実装:
難易度の採点: 現在のモデルの合格率(ゴルディロックスフィルタリングから得る)で各プロンプトを評価する。易しい=合格率 \(>\)80%、中=30〜80%、難しい= \(<\)30%。
スケジュール: ステップ0〜1000は易70%、中20%、難10%。1000〜5000は易30%、中50%、難20%。5000以降は易10%、中40%、難50%。
動的調整: 500ステップごとに難易度分布を再評価する。モデルが「習得した」プロンプト(合格率 \(>\)95%)は引退させ、新しいより難しいプロンプトを導入する。
特にGRPOの場合: カリキュラムにより、グループ内に常に成功と失敗が混在する。カリキュラムがないと、難しいプロンプトはすべてゼロのグループを生み、役に立たない。
根拠: DeepSeek-R1は暗黙のカリキュラムを使った。易しい数学/コード問題から始め、モデルは基礎推論を発達させ、明示的なスケジュールなしに徐々に難しい問題を解いた。
復習: 第7章と第12章(GRPO、LLMエージェント学習)。
Note
Q20: A100-80GB GPU 64基の予算で70BモデルをRL学習する必要があります。割り当てを設計してください。
解答: 8ノード \(\times\) 8 GPU = 合計64基です。生成、スコアリング、学習に分割します。
割り当て例:
生成: 24 GPU(3ノード)。TP=4のvLLMを6インスタンス。INT8重みはモデルあたり70GBで、KVキャッシュの余地が残る。連続バッチ処理で、合計バッチは \(\approx\)128。
スコアリング: 8 GPU(1ノード)。同じノードにRM(INT8、TP=4)と参照モデル(INT8、TP=4)を置く。または4 GPUをTP=4で共有し、RMと参照モデルを交互に実行する。
学習: 32 GPU(4ノード)。32基すべてでFSDPを使う。各GPUは \(\sim\)70B/32 = 2.2GBのパラメータとオプティマイザーの一部を保持し、アクティベーションにも十分な余裕がある。安全のため勾配チェックポイントを使う。
期待スループット:
生成: 6インスタンス \(\times\) 毎分 \(\sim\)80応答 = 毎分480応答
学習: バッチ128で、1ステップ \(\sim\)15秒(学習だけで、生成待ちなし)
オーバーラップ: 学習がステップ \(N\)(15秒)を処理する間に、生成は \(\sim\)120個の応答をステップ \(N+1\) 用に生成する。理想的なパイプラインになる。
ボトルネック分析: 128応答の生成に \(\sim\)45秒、学習に \(\sim\)15秒、スコアリングに \(\sim\)5秒かかる。ボトルネックは生成である。学習から8 GPUを生成へ移して(生成40、学習24)均衡させることもできるが、今度は学習がボトルネックになる。現在の割り当てはほぼ最適である。
メモリが厳しい場合の代替案: スコアリングを学習ノードへ移す(時間共有し、生成中に採点し、学習中に学習する)。8 GPUを節約できる。パイプラインはやや悪化するが機能する。
復習: 第2章と第11章(システム基盤、システムアーキテクチャ)。
GRPOの派生手法と高度なRLの問題
Note
Q21: DAPOとは何ですか?標準GRPOよりどう改善されていますか?
解答: DAPO(Dynamic Adaptive Policy Optimization、動的適応方策最適化)は、5つの重要な変更を導入します。
1. Clip-Higher(非対称クリッピング): 標準PPO/GRPOは \(\epsilon=0.2\) で両方向を同じようにクリップします。DAPOは \(\epsilon_\text{low}=0.2\)、\(\epsilon_\text{high}=0.28\) を使います。これにより、悪いアクションをどれだけ抑えるかは制限しつつ、良いアクションの確率をより積極的に増やせます。直感的には、活用より探索に大きな余地が必要です。
2. 長すぎる応答のフィルタリング: 応答が最大長に達した場合(切り詰められ、EOSトークンがない場合)、損失から完全にマスクする。理由は、切り詰められた応答には自然な停止信号がなく、それで学習すると「文の途中で止まってよい」とモデルに教えてしまうためです。
3. トークンレベル損失: 損失を系列数ではなく、全系列の総トークン数で正規化する。これにより長い系列が勾配を支配するのを防ぐ。
4. ソフトな長さ超過ペナルティ: 二値の切り詰めフィルタリングではなく、応答が最大長に近づくにつれて段階的なペナルティを適用する。\(r_\text{soft} = -c \cdot \max(0, \text{len} - L_\text{soft})/(L_\text{max} - L_\text{soft})\)。
5. 動的サンプリング: 学習中にプロンプトを再サンプリングし、各バッチに成功と失敗が混在するようにする(TRLにはまだない)。
使う場面: 最大限の探索と長い完了(32K以上のトークン)が必要な大規模推論RL。特に非対称クリッピングが有用です。
復習: 第7章と第8章(GRPO、選好最適化の派生手法)。
Note
Q22: vLLMの学習と推論の不一致を説明してください。なぜ起き、TIS/MISはどう修正しますか?
解答: 問題: 生成にvLLM、更新に学習フレームワーク(DeepSpeed/FSDP)を使うと、同じ重みの同じモデルが異なるトークン確率を出力します。原因は次のとおりです。
数値カーネルが異なる(vLLMはスループット向けに最適化したカスタムCUDAカーネルを使う)
アテンション実装が異なる(学習はFlash Attention、vLLMはPagedAttention)
精度の扱いが異なる(vLLMはFP8/INT8、学習はBF16)
バッチ処理の違いがレイヤー正規化の数値に影響する
これはPPOのオンポリシー仮定を暗黙に壊します。比 \(\pi_\theta/\pi_\text{old}\) を、vLLMの \(\pi_\text{old}\) と学習フレームワークの \(\pi_\theta\) で計算するため、最初のステップから比が間違っています。
TIS(切り詰め重要度サンプリング): 勾配に \(\min(\pi_\text{train}/\pi_\text{inference}, C)\) を掛けて補正する。\(\min\) と上限 \(C\) により、極端な補正で学習が不安定になるのを防ぐ。典型的には \(C=2.0\)。
MIS(マスク付き重要度サンプリング): より積極的で、\(\pi_\text{train}/\pi_\text{inference} > C\) となるトークンを単純に捨てる。勾配への寄与はゼロで、推定の悪いトークンが更新に影響するのを防ぐ。
系列レベルとトークンレベル: 系列レベルISは理論的に正しい(不偏)一方、トークンレベルISはバイアスがあるが分散が低い。実際には、切り詰めを伴う系列レベルが最もうまく機能する。
復習: 第7章と第11章(GRPO、システムアーキテクチャ)。
Note
Q23: GSPOとGRPOの根本的な違いは何で、いつ重要になりますか?
解答: GRPO: 重要度比をトークンごとに計算します。\(w_{i,t} = \pi_\theta(o_{i,t}\vert q, o_{i,<t}) / \pi_\text{old}(o_{i,t}\vert q, o_{i,<t})\) とし、各トークンを独立にクリップします。
GSPO: 重要度比を系列レベルで計算します。\(s_i(\theta) = (\pi_\theta(o_i\vert q)/\pi_\text{old}(o_i\vert q))^{1/\vert o_i\vert }\) で、トークン確率の幾何平均です。この単一の系列レベル比をクリップします。
重要な理由: GRPOのトークンごとのクリッピングは各トークンを独立に扱いますが、言語ではトークンは強く相関しています。系列の早い位置での小さなトークン単位の変化が、多数のトークンにわたって指数的に累積します。GSPOは完全な系列確率を見ることでこれを捉えます。
長さの正規化: \(1/\vert o_i\vert\) の指数によって、異なる長さの系列を公平に比較できます。これがないと、長い系列は常に確率比が低くなります。
GSPOを使う場面: 学習がオフポリシーになる場合(
steps_per_generation > 1またはnum_iterations > 1)。完全にオンポリシー(比が \(\approx 1\))なら、GRPOとGSPOは同等です。復習: 第7章と第8章(GRPO、選好最適化の派生手法)。
Note
Q24: 論文「It Takes Two」はG=2がG=16に匹敵すると示しています。なぜ可能なのですか?
解答: 重要な洞察は、GRPOの有効性が正確なアドバンテージ推定(大きな \(G\) が必要)からではなく、 暗黙の対照目的 から来ることです。
\(G=2\) で二値報酬(1つが正解、1つが不正解)の場合、\(\hat{A}_\text{correct} = +1\)、\(\hat{A}_\text{wrong} = -1\)(正規化後)です。損失は、正しい応答の確率を増やし、間違った応答の確率を下げるものになります。これは本質的にDPO型の対照損失です。
大きな \(G\) があまり役立たない理由: 正規化アドバンテージ \(\hat{A}_i = (r_i - \mu)/\sigma\) はすでに良いものと悪いもののコントラストを作ります。サンプルを増やすと \(\mu\) の推定は良くなりますが、勾配の方向は平均精度ではなく、最良と最悪のコントラストに支配されます。
計算量の節約: \(G=2\) なら生成計算量は8\(\times\)少なくなります(\(G=16\) の場合と比べて)。生成は学習時間の60%を占めるため、学習は \(\sim\)4\(\times\)高速になります。
注意: 合格率が30〜70%のときに最もよく機能します。合格率が非常に低い(\(<\)10%)と、\(G=2\) では2つとも失敗して信号がないことが多い。難しい問題にはより大きな \(G\) が必要です。
復習: 第7章(GRPO)。
Note
Q25: SAPOとは何ですか?ソフトゲーティングはハードクリッピングとどう異なりますか?
解答: 標準PPO/GRPOはハードクリッピング \(\text{clip}(r, 1-\epsilon, 1+\epsilon)\) を使います。境界では勾配が突然ゼロになります。これにより、モデルが学習信号を受け取らない「デッドゾーン」が生まれます。
SAPO はこれを滑らかなシグモイドゲートに置き換えます。比が1から離れるにつれて勾配を徐々に減衰させ、突然ゼロにはしません。非対称な温度を使います。
正のアドバンテージでは \(\tau_+ = 1.0\)(標準的な減衰)
負のアドバンテージでは \(\tau_- = 1.05\)(抑制をやや強く減衰)
利点: (1) 勾配地形に「崖」がない。(2) クリップ範囲を少し外れたトークンも寄与する(減衰するがゼロにはならない)。(3) 最適化の軌跡がより安定する。(4) 系列と整合的で、完全な系列コンテキストを考慮する。
トレードオフ: ハードクリッピングより信頼領域の制約がやや弱いため、温度の慎重な調整が必要です。ただし全体としてハイパーパラメータの選択に対してより頑健です。
復習: 第7章と第8章(GRPO、選好最適化の派生手法)。
DPO拡張の問題
Note
Q26: f-DPOのダイバージェンスの選択肢を比較してください。forward KL、JS、reverse KLをいつ使いますか?
解答: 標準DPOは暗黙にreverse KL(\(D_\text{KL}[\pi_\theta \\vert \pi_\text{ref}]\))を使います。
reverse KL (デフォルト): モード追求型。参照モデルの確率が高い場所に方策の確率を集中させる。参照モデルが生成しないテキストを避け、安全性に適する(保守的)。
forward KL: 質量カバー型。低確率のものも含め、参照モデルのすべてのモードを覆おうとする。多様性に適するが、低品質の出力を生成する可能性がある。
Jensen-Shannon: forwardとreverseの対称的な妥協。モードのカバレッジとモード追求のバランスが取れる。一般的なアラインメントに最適なことが多い。
アルファダイバージェンス (\(\alpha=0.5\)): forward(\(\alpha=0\))とreverse(\(\alpha=1\))の間を補間する。調整可能。
実践的な推奨: reverse KL(標準DPO)から始める。モデルが保守的すぎる(創造的な解決策を試さない)ならJSダイバージェンスに切り替える。多様性が重要(創作、ブレインストーミング)ならforward KLを試す。
復習: 第6章と第8章(DPO、選好最適化の派生手法)。
Note
Q27: DPOの選好データに15%のラベルノイズがあります。どうしますか?
解答: 洗練度の順に3つの選択肢があります。
1. Robust DPO (ノイズ率が既知の場合に最適): 損失を解析的にデバイアスする。\(\mathcal{L}_\text{robust} = \frac{(1-\varepsilon)\mathcal{L}_\text{DPO}(y_w, y_l) - \varepsilon \mathcal{L}_\text{DPO}(y_l, y_w)}{1 - 2\varepsilon}\)。\(\varepsilon = 0.15\) とする。期待値の下でクリーンなDPO目的を復元できることが保証される。TRLでは
loss_type="robust", label_smoothing=0.15。2. IPO (ノイズ率が不明な場合に最適): 目標マージン付き二乗損失。誤ラベルのペアの影響が有界になる(平方損失は発散しない)。\(\varepsilon\) を知らなくても任意のノイズパターンに対して頑健。TRLでは
loss_type="ipo"。3. TR-DPO (分布シフトに最適): 学習中にEMAで参照モデルを更新する。初期データにノイズがあっても、変化する参照モデルが自己修正を助ける。TRLでは
sync_ref_model=True, ref_model_mixup_alpha=0.6。データ側の修正: (1) アノテーター間一致率が \(<\)70%のペアを除外する。(2) RMでペアを採点し、RMとラベルが一致しないものを捨てる。(3) アクティブラーニングで、最も不確かなペアを再ラベル付けする。
復習: 第6章と第8章(DPO、選好最適化の派生手法)。
Note
Q28: SimPOとは何ですか?参照モデルを使わないことの利点は何ですか?
解答: SimPOは応答の平均対数確率を暗黙の報酬信号として使います。\(r(x,y) = \frac{1}{\vert y\vert }\sum_t \log \pi_\theta(y_t\vert x, y_{<t})\) で、参照モデルは不要です。
損失には目標マージン \(\gamma\) を加え、選択された応答の平均対数確率が、拒否された応答より少なくとも \(\gamma\) 高くなるようにします。
参照モデルを使わないことが重要な理由:
メモリ: 参照モデルがないため、70Bモデルで70〜140GB節約できる。同じハードウェアでより大きなモデルを学習できる。
単純さ: 2つ目のモデルコピーを管理、ロード、提供する必要がない。
古い参照がない: DPOの参照モデルは学習が進むほど無関係になる。SimPOにはこの問題がない。
長さの正規化が組み込み: \(1/\vert y\vert\) により長さバイアスを自然に防ぐ(DPOでは明示的な処理が必要)。
トレードオフ: 参照アンカーがないため、モデルは崩壊やドリフトを起こす自由度が高い。\(\gamma\) マージンと長さの正規化が一部緩和するが、強い学習ではSimPOはDPOより不安定になり得る。
復習: 第8章(選好最適化の派生手法)。
Note
Q29: Iterative RPOを説明してください。推論でDPOとNLL損失を組み合わせるのはなぜですか?
解答: 推論に標準DPOを使うと、微妙な失敗モードがあります。識別(正しいトレースに高い暗黙報酬を割り当てること)は学習しますが、必ずしもそれらを生成することは学習しません。
理由: DPOの勾配は選択応答の確率を上げ、拒否応答の確率を下げます。しかし選択応答がモデルの生成するものと大きく異なると、その確率を上げても、似た推論パターンをどう生成するかは教えられません。
RPOの修正: 選択応答に対する負の対数尤度(NLL/SFT)損失を加えます。\(\mathcal{L} = \mathcal{L}_\text{DPO} + \alpha \cdot \mathcal{L}_\text{NLL}(y_w)\) です。
NLL項は、勝利した応答をステップごとに生成するよう明示的に学習させます。DPO項は、敗北した応答を避けることも学習させます。組み合わせることで、モデルは「正しく推論する方法」(NLL)と「避けるべきもの」(DPO)の両方を学びます。
反復: 応答を生成 \(\rightarrow\) 正しさを確認 \(\rightarrow\) ペアを作成 \(\rightarrow\) RPOで学習 \(\rightarrow\) 繰り返す。反復ごとにモデルは正しい推論の生成が上達し、次のラウンド用により高品質な学習データを作ります。
TRL:
loss_type=["sigmoid", "sft"], loss_weights=[1.0, 1.0]復習: 第8章と第13章(選好最適化の派生手法、大規模推論モデルのためのRL)。
GPUアーキテクチャとハードウェアの問題
Note
Q30: GPUメモリ階層を説明してください。LLM推論でなぜ重要ですか?
解答: 速い順に並べると次のとおりです。
レジスタ: スレッドごとに \(\sim\)256 KB/SM。即時アクセス(レイテンシ0サイクル)。
SRAM(共有メモリ): SMごとに \(\sim\)192〜228 KB/SM(A100は164 KBに設定可能)。帯域幅は合計 \(\sim\)19 TB/s、レイテンシは \(\sim\)20サイクル。
L2キャッシュ: GPU全体で共有し、40〜60 MB(H100は50 MB)。帯域幅 \(\sim\)5 TB/s、レイテンシ \(\sim\)200サイクル。
HBM: GPUの主メモリで80 GB(A100)。帯域幅2〜3.35 TB/s、レイテンシ \(\sim\)400サイクル。
CPU DRAM: PCIe経由で512 GB以上。帯域幅32〜64 GB/s、レイテンシ \(\sim\)10Kサイクル。
LLMで重要な理由: 自己回帰生成では、1トークンごとにモデル重み全体(70Bで \(\sim\)140 GB)を読み込む。HBM帯域幅が2 TB/sでも、重みをストリームするだけで70msかかる。実際の計算(行列ベクトル積1回)はわずか0.5msで、GPUは99%の時間データを待つ。
Flash Attentionはこれを利用する: 中間結果(QKスコア、softmax)をHBM(2 TB/s)に書き込まずSRAM(19 TB/s)に保持することで、アテンションのメモリトラフィックの90%をなくす。計算量は同じだが、HBMの読み書きは10\(\times\)減る。
復習: 第2章(LLMのシステム基盤)。
Note
Q31: Flash Attentionはどのように機能しますか?オンラインsoftmaxのトリックとは何ですか?
解答: 問題: 標準アテンションは \(n \times n\) 行列をHBMに展開する。\(n=8192\) では、ヘッドあたり \(8192^2 \times 2 = 134\) MB、ヘッド数32なら層あたり4.3 GBになる。HBMへ書き込み、softmaxと乗算のために読み戻す必要があり、HBMを3回完全に往復する。
Flash Attentionの解決策: 完全な \(n \times n\) 行列を保存せず、SRAMに収まるタイル単位で処理する。
アルゴリズム:
\(Q\) を \(B_r\) 行のブロックに、\(K/V\) を \(B_c\) 行のブロックに分割する。
各 \(Q\) ブロックについて、すべての \(K\) ブロックを反復し、部分的なアテンションスコアを計算する。
オンラインsoftmaxのトリック: softmaxの正規化用に累積最大値 \(m\) と累積和 \(\ell\) を保持する。新しい \(K\) ブロックを処理するとき、\(m_\text{new} = \max(m_\text{old}, \max(\text{scores}))\) と更新し、以前の累積値を \(e^{m_\text{old} - m_\text{new}}\) で再スケールして、新しい寄与を加える。
出力を逐次累積するため、完全な \(n \times n\) 行列は決して必要ない。
重要な洞察: softmaxは通常、全要素に対する \(\max\) と \(\sum\) を取るグローバルな演算です。オンラインのトリックは、補正係数を伴う局所更新に分解します。数学的に厳密で、近似ではありません。
結果: メモリは \(O(n)\)(\(O(n^2)\) ではなく)。速度は2〜4\(\times\)向上する(HBMアクセスが減り、SRAMで過ごす時間が増える)。
Flash Attention 2: warp間の作業分割を改善し、行列乗算以外のFLOPを2\(\times\)削減する。
Flash Attention 3 (H100/Hopper): 非同期ロードにTensor Memory Accelerator(TMA)を使い、warp特化(プロデューサー/コンシューマーwarp)とFP8をサポートする。
復習: 第1章と第2章(LLMアーキテクチャ、システム基盤)。
Note
Q32: PagedAttentionを説明してください。KVキャッシュの問題をどう解決しますか?
解答: 問題: 生成中、各系列はKVキャッシュ(過去の全トークンのKとVテンソルを保存する)を必要とする。70Bモデルでは、1トークンに \(2 \times n_\text{layers} \times d_\text{model} \times 2\) バイト = \(2 \times 80 \times 8192 \times 2 \approx 2.5\) MBが必要で、2048トークン系列ではKVキャッシュが \(\sim\)5 GBになる。
従来の割り当て: アクティブな各系列にmax_sequence_lengthを事前割り当てする。最大2048で平均500なら、割り当てたメモリの75%を浪費する。同時に50系列あれば、数百GBが無駄になる。
PagedAttention: OSの仮想メモリに着想を得ている。
KVキャッシュを固定サイズのブロック(ページ)に分け、各ブロックが16トークン分のKVを保持する。
ブロックテーブル(ページテーブルに相当)が論理トークン位置を物理メモリブロックへ対応付ける。
系列の成長に応じてブロックをオンデマンドで割り当てる。事前割り当てによる浪費がない。
系列が終わると、解放されたブロックはすぐにプールへ戻る。
追加の利点:
プレフィックス共有: 同じシステムプロンプトを持つ複数系列がKVキャッシュブロックを共有する(コピーオンライト)。チャットアプリではメモリを30〜50%節約できる。
プリエンプション: 低優先度系列のブロックをCPUへ「スワップアウト」し、高優先度リクエスト用にGPUメモリを解放できる。
ほぼゼロのフラグメンテーション: 内部フラグメンテーションは最後のブロック(\(<\)16トークン)に限られる。外部フラグメンテーションはなく、空きブロックをどこでも使える。
結果: 同じメモリで同時系列数を3〜5\(\times\)にでき、\(\rightarrow\) 提供時のスループットも3〜5\(\times\)になる。
復習: 第2章(LLMのシステム基盤)。
Note
Q33: NVLinkとInfiniBandを比較してください。RLHF学習ではそれぞれをいつ使いますか?
解答:
NVLink (ノード内、GPU間):
帯域幅: 600 GB/s(A100)、900 GB/s(H100)—双方向合計
レイテンシ: \(\sim\)1 \(\mu\)s
範囲: 1つの物理ノード内(8 GPUをNVSwitchで接続)
用途: テンソル並列 (TP=8)。各層の行列乗算をGPU間で分割し、各層の後にAllReduceが必要になる。超高帯域幅と低レイテンシが必要。
InfiniBand NDR (ノード間):
帯域幅: 400 Gb/s = ポートあたり50 GB/s。8ポート(GPUDirect RDMA)でノードあたり合計400 GB/s。
レイテンシ: \(\sim\)1〜5 \(\mu\)s(RDMA)
範囲: クラスタ内のノード間。スイッチ(ファットツリー型トポロジ)が必要。
用途: データ並列/FSDP の勾配同期。勾配のAllReduceは層ごとではなく学習ステップごとに1回なので、レイテンシの許容度が高い。
特にRLHFでは:
生成: ノード内のNVLink上でTP=8。ノード間の複数vLLMインスタンスは通信しない(完全に並列化しやすい)。
学習: ノード内はNVLink上のTP=8、ノード間はInfiniBand上のFSDP。完全な逆伝播の後に勾配を同期する。
重み同期: 学習 \(\to\) 生成にはInfiniBandを使う(140 GB転送を非同期で行い、50 GB/sなら \(\sim\)3秒)。
復習: 第2章と第11章(システム基盤、システムアーキテクチャ)。
最適化と学習の問題
Note
Q34: AdamとAdamWを説明してください。なぜその違いがLLMで重要ですか?
解答: L2正則化付きAdam: \(\theta_{t+1} = \theta_t - \alpha \cdot (\hat{m}_t / (\sqrt{\hat{v}_t} + \epsilon) + \lambda\theta_t)\)。重み減衰項 \(\lambda\theta_t\) は適応的スケーリングの内側にある。勾配が大きいパラメータ(\(v_t\) が大きい)は、\(\sqrt{v_t}\) で割られるため小さい重み減衰を受ける。これは真の重み減衰ではなく、スケール依存です。
AdamW(分離された重み減衰): \(\theta_{t+1} = (1 - \alpha\lambda)\theta_t - \alpha \cdot \hat{m}_t / (\sqrt{\hat{v}_t} + \epsilon)\)。重み減衰を適応更新の外側かつ前に適用する。勾配履歴に関係なく、すべてのパラメータが同じ比例減衰を受ける。
LLMで重要な理由:
LLMのパラメータは何桁もの大きさにまたがる(埋め込み層、アテンション、FFN)。Adamの結合L2は大きな勾配のパラメータより小さな勾配のパラメータを強く罰するため、望ましくない。
分離WDは全層に一様な正則化を与え、一部の層が際限なく大きくなり、他の層が縮みすぎるのを防ぐ。
経験的には、同じ実効正則化なら、長い事前学習でAdamWはAdam+L2よりパープレキシティが2〜5%良い。
特にRLでは: \(\lambda = 0\)(重み減衰なし)を使うことが多い。KLペナルティが正則化を与える。ただしSFTではAdamWと \(\lambda = 0.01\)〜\(0.1\) が標準です。
復習: 第1章(LLMのアーキテクチャと最適化手法)。
Note
Q35: 学習率ウォームアップはなぜ必要ですか?ないと何が起きますか?
解答: 問題: Adamの二次モーメント推定 \(v_t = \beta_2 v_{t-1} + (1-\beta_2)g_t^2\) は \(v_0 = 0\) から始まる。バイアス補正 \(\hat{v}_t = v_t/(1-\beta_2^t)\) は数学的には補償するが、実際には次の問題がある。
最初の数ステップでは、\(v_t\) は1〜5個の勾配サンプルに基づくため、真の分散の推定が非常に不正確。
初期に小さい勾配を受けたパラメータでは、\(v_t\) が極小 \(\rightarrow\) 実効LRが巨大 \(\rightarrow\) 壊滅的更新となる。
バイアス補正が初期更新を増幅する。ステップ1では \(\hat{v}_1 = v_1/(1-0.999) = 1000 \cdot v_1\)。
ウォームアップがない場合: 最初の10〜100ステップで勾配が急上昇し、モデルに恒久的な損傷を与えることが多い。オプティマイザーが安定する前に初期表現が壊れる。
ウォームアップによる修正: LRを \(\approx 0\) から始め、\(W\) ステップで目標値まで線形に増やす(通常は学習の3〜10%)。LRが最大値に達する頃には、\(v_t\) に十分なサンプルが蓄積されて正確になる。
典型的な設定:
事前学習: 2000ステップのウォームアップ(200Kステップの \(\sim\)1%)
SFT: 100ステップのウォームアップ(2000ステップの \(\sim\)5%)
RL(PPO/GRPO): 20〜50ステップのウォームアップ(短く、モデルはSFTですでに安定している)
復習: 第1章と第10章(LLMアーキテクチャ、SFTのベストプラクティス)。
Note
Q36: 学習率スケジュールを比較してください。RLファインチューニングにはどれを選びますか?
解答:
コサイン減衰: \(\eta_t = \eta_\text{min} + \frac{1}{2}(\eta_\text{max} - \eta_\text{min})(1 + \cos(\pi t/T))\)。事前学習とSFTの標準。滑らかに減衰し、ほとんどの時間を中程度のLRで過ごす。
線形減衰: \(\eta_t = \eta_\text{max}(1 - t/T)\)。より単純で、短い実行ではコサインと似た結果になる。
WSD(Warmup-Stable-Decay): ウォームアップ \(\rightarrow\) 80%はLR一定 \(\rightarrow\) 最後の20%で急速に減衰。事前学習の新しい標準。「安定」期が一貫した学習をもたらし、最後の減衰で残りの改善を絞り出す。
一定: 減衰なし。ウォームアップ後は \(\eta_t = \eta_\text{max}\)。
RLファインチューニング(PPO/GRPO)には、短いウォームアップ付きの一定値を選ぶ 。理由は次のとおりです。
RLの学習長は予測しにくい(エポックではなく勝率に基づいて停止する)。
コサイン/線形減衰は総ステップ数を事前に知っていることを仮定する。
LRはすでに非常に低く(\(10^{-6}\))、さらに減衰させると更新が見えなくなる。
PPOの適応KL制御器がすでに実効ステップサイズを調整している。
減衰が必要なら、余裕のある予算で線形減衰を使い、指標が頭打ちになったら早期停止する。
復習: 第1章と第5章(LLMアーキテクチャ、PPO)。
Note
Q37: なぜ勾配クリッピングはRL学習で重要で、SFTではそれほど重要でないのですか?
解答: SFT: 教師あり損失は滑らかで、よく振る舞う。勾配ノルムはバッチ間で一貫している(通常0.1〜1.0)。1.0でのクリッピングが発動することはまれで、安全網として働く。
RL(PPO/GRPO): 勾配ノルムが大きく変動する。理由は次のとおりです。
報酬分散: あるバッチは高報酬の応答ばかりで、次は低報酬ばかりかもしれない。アドバンテージ \(\hat{A}\) が大きく揺れる。
比の爆発: まれなトークンの確率が大きく変わると、\(r_t = \pi_\text{new}/\pi_\text{old}\) が非常に大きくなり \(\rightarrow\) クリッピングが働く前に大きな勾配になる。
疎な報酬: 二値報酬のGRPOでは、全正解(アドバンテージ \(\approx 0\))になるプロンプトがある一方、突然、難しいプロンプトが極端なアドバンテージを与える。
KL項: 方策が発散するとKLペナルティの勾配が急上昇する。
クリッピングがない場合: 1つの悪いバッチが通常の100\(\times\)の勾配を生み \(\rightarrow\) 1ステップでモデルを破壊する。回復は不可能(事前学習をすべて壊滅的に忘却する)。
典型的な設定:
max_grad_norm=1.0。RL学習初期の安全性を高めるため0.5を使う場合もある。ノルムは層ごとではなく、全パラメータでグローバルに計算する。監視: クリッピングがステップの20%を超えて発動するなら、LRが高すぎるか、バッチサイズが小さすぎる可能性が高い。
復習: 第5章と第7章(PPO、GRPO)。
Note
Q38: 学習におけるBF16とFP16を比較してください。選択が重要になるのはいつですか?
解答:
FP16: 符号1+指数5+仮数10ビット。範囲は \(\pm 65504\)、精度は \(\sim\)3.3桁。
BF16: 符号1+指数8+仮数7ビット。範囲は \(\pm 3.4 \times 10^{38}\)(FP32と同じ!)、精度は \(\sim\)2.4桁。
LLMでBF16が優れる理由:
損失スケーリングが不要: FP16の狭い範囲(\(\pm\)65K)では勾配やアクティベーションが頻繁にオーバーフロー/アンダーフローするため、動的損失スケーリング(損失を1024倍し、勾配を戻す)が必要。BF16はFP32の範囲を持つため、オーバーフローはほぼ起きない。
コードが単純: 損失スケーラー、inf/nanチェック、動的スケール調整が不要。
RLに重要: RLの勾配はSFTよりノイズが多く急峻。FP16の損失スケーリングは誤ったスケールを選んでNaNを起こしやすいが、BF16は「そのまま動く」。
FP16が良い場合: 最大精度が必要な場合(科学計算など)で、損失スケーリングを管理できるとき。FP16は仮数ビットが3つ多く、結果がわずかに正確になる。
FP32マスター重み: BF16でフォワード/バックワードを行っても、何千回もの小さなステップで丸め誤差が累積しないよう、勾配更新はFP32で累積する。すべてのLLM学習での標準的な実践です。
復習: 第2章(LLMのシステム基盤)。
報酬モデルとSFTの問題
Note
Q39: Bradley-Terry報酬モデルの損失を導出してください。限界は何ですか?
解答: Bradley-Terryモデル: 2つの応答について、より良い方(\(y_w\))が好まれる確率は \(P(y_w \succ y_l \vert x) = \sigma(r(x, y_w) - r(x, y_l))\) で、\(\sigma\) はシグモイドです。
MLEの導出: \(N\) 個の選好ペアについて尤度 \(\prod_i P(y_w^i \succ y_l^i)\) を最大化する。負の対数を取ると、\(\mathcal{L} = -\sum_i \log\sigma(r(x_i, y_w^i) - r(x_i, y_l^i))\) となる。
限界:
引き分けなし: BTは「同程度に良い」をモデル化できず、厳密な選好を強制する。
推移性: A\(>\)BかつB\(>\)CならA\(>\)Cと仮定する。人間の選好は推移的ではない。
コンテキスト非依存: どんな代替案があったかにかかわらず同じ報酬になる。
スカラーへの縮約: すべての品質軸を1つの数値に圧縮する。応答は安全でも役に立たないことがあり、RMはトレードオフを取る必要がある。
長さバイアス: 長い応答ほど高スコアになる(情報が多いほどアノテーターが望んだものを含みやすい)。明示的に無相関化する必要がある。
緩和策: マージン損失(最小差 \(\delta\) を要求)、報酬の中心化(移動平均を引く)、学習中の長さペナルティ、マルチヘッドRM(有用性/安全性/正確性を別々に採点)。
復習: 第9章(報酬モデルの学習)。
Note
Q40: SFTにおける系列パッキングとは何で、なぜ重要ですか?
解答: 問題: 学習例の長さは可変です。標準バッチ処理ではすべてをmax_lengthまでパディングします。最大4096で平均500なら、勾配に寄与しないパディングトークンに計算の88%を浪費します。
パッキングによる解決: 複数の短い例を1つのmax_length系列に連結する。EOSトークンで分離し、すべての例を同時に学習する。
例: 4系列を4096までパディングする(16Kトークン、14Kがパディング)のではなく、4例を端から端まで4096の1系列に詰める(実トークン4096、パディング0)。 4\(\times\)効率的 です。
重要な詳細 — ブロック対角アテンションマスク: 特別な処理がないと、例2が例1のトークンにアテンションを向けてしまう(交差汚染)。各例が自分のトークンだけを参照するよう制限するブロック対角マスクが必要です。
TRLでは:
SFTConfig(packing=True, max_seq_length=4096)。マスクを自動的に処理します。注意点: (1) 長い例は依然として独自のバッチ項目が必要(系列途中で分割できない)。(2) 位置埋め込みの実装が少し複雑(例ごとにリセット)。(3) パッキングで実効バッチサイズが変わる(1ステップの例が増える)ため、それに応じてLRを調整する。
復習: 第10章(SFTのベストプラクティスと技法)。
Note
Q41: SFTの完了部分のみのマスキングを説明してください。使わないと何が起きますか?
解答: チャット形式のSFTデータは
[system] + [user message] + [assistant response]です。標準NLL損失はシステムプロンプトとユーザーメッセージを含む全トークンで損失を計算します。マスキングしない問題: モデルはユーザーメッセージの予測を学ぶために容量を浪費します(推論時に生成する必要はない)。さらに、学習データのユーザーメッセージが多様だと「誰の番か」が混乱します。
完了部分のみのマスキング: プロンプト(システム+ユーザー)の全トークンの損失重みを0にし、アシスタント応答のトークンだけで損失を計算します。
TRL:
DataCollatorForCompletionOnlyLM(response_template="<|assistant|>")効果: 指示追従ベンチマークで通常5〜15%改善する。収束も速い(勾配信号が有用なトークンに集中する)。計算コストは変わらない。
注意点: 応答テンプレートのトークンは損失に含める必要がある(応答を開始することを教えるため)。ただし、それより前はすべて除外する。
復習: 第10章(SFTのベストプラクティスと技法)。
Note
Q42: SFT品質はRLの上限にどう影響しますか?pass@k診断とは何ですか?
解答: 上限定理(非形式的): RLは、モデルがすでに無視できない確率で生成できる振る舞いしか強化できない。SFTモデルが正解を生成する確率が0%なら、RLがそれを見つけることはない。
理由: GRPO/PPOは現在の方策からサンプリングし、良いサンプルを強化する。分布内に良いサンプルがなければ、強化するものがない。RLの探索はベース方策のサポートに制限される。
pass@k診断: プロンプトごとに \(k\) 個の応答を生成し、どれかが正しいか確認する。
pass@1: モデルの典型的な性能(貪欲/低温)。
pass@8: \(G=8\) のGRPOが達成できる上限。
pass@64: 積極的なBest-of-Nの上限。
pass@256: RL改善のおおよその上限。
解釈:
pass@1=20%、pass@64=80%: 良い状態。RLの余地が4\(\times\)あり、大きな改善が期待できる。
pass@1=20%、pass@64=25%: 余地がほとんどない。RLはあまり役立たず、まずSFTを改善する必要がある。
pass@1=5%、pass@64=60%: モデルは解けるが、めったに解かない。RLに最適なケース(まれな成功を強化する)。
ルール: pass@64が \(<\)1.5\(\times\) pass@1なら、RLを始める前により良いSFTデータへ投資する。
復習: 第7章と第10章(GRPO、SFTのベストプラクティス)。
Note
Q43: チャットモデル向けの多目的報酬システムを設計してください。有用性と安全性のバランスをどう取りますか?
解答: アーキテクチャ: 目的ごとに別々の報酬モデルを用意します。
\(r_\text{helpful}\): 有用性の選好(品質、正確性、完全性)で学習する
\(r_\text{safe}\): 安全性の選好(拒否、無害性、ハルシネーションなし)で学習する
\(r_\text{format}\): ルールベース(指示への従属、適切な形式、適切な長さ)
組み合わせ戦略:
重み付き和 (最も単純): \(r = w_1 r_\text{helpful} + w_2 r_\text{safe} + w_3 r_\text{format}\)。問題は、有用性が安全性を上回り得ること。
制約付き (より安全): \(r_\text{helpful}\) を \(r_\text{safe} > \tau\) の条件で最大化する。\(r = r_\text{helpful} - \lambda \cdot \max(0, \tau - r_\text{safe})\) で実装し、大きな \(\lambda\) を使う。
GDPO正規化 (GRPOに最適): グループ内で各報酬を独立に正規化し、\(\hat{A} = w_1 \hat{A}_\text{helpful} + w_2 \hat{A}_\text{safe}\) として組み合わせる。スケール差によって1つの報酬が支配するのを防ぐ。
辞書式: 安全性をハード制約(必ず合格)とし、その後に有用性を最適化する。安全性のアラインメントを先に行い、次に有用性を学習する。
実践的な重み: \(w_\text{safe}=2.0, w_\text{helpful}=1.0, w_\text{format}=0.5\) から始める。安全性に2\(\times\)の重みを与えるのは、失敗モード(有害コンテンツ)が有用性の失敗(平凡な回答)よりはるかに悪いためです。
復習: 第9章と第12章(報酬モデルの学習、LLMエージェント学習)。
システムアーキテクチャ拡張の問題
Note
Q44: 投機的デコーディングはどのように機能しますか?RLHFでいつ役立ちますか?
解答: 問題: 大きなモデルは1回のフォワードパスで1トークンを生成する(70Bで \(\sim\)70ms)。遅い。
投機的デコーディング:
ドラフト: 小さなモデル(1〜7B)が \(k\) 個の候補トークンを高速に生成する(\(\sim\)5msで \(k\) 個すべて)。
検証: 大きなモデルが1回のフォワードパスで \(k\) 個すべてを並列採点する。\(p_\text{large}(t_i) \geq p_\text{draft}(t_i)\) のトークンは必ず受け入れ、それ以外も確率的に受け入れる。
結果: 検証ステップごとに平均3〜4トークンを受け入れる。高速化は2〜3\(\times\)。
重要な性質: 出力分布は大きなモデルだけからサンプリングした場合と同一です。品質低下はない。ドラフトモデルは速度だけに影響し、出力には影響しない。
特にRLHFでは: 生成は計算量の60%を占める。生成を2〜3\(\times\)高速化すると、エンドツーエンドで1.5〜2\(\times\)高速化する。vLLM+INT8と組み合わせると、生成はボトルネックではなくなり学習と同程度になる。
限界: (1) ドラフトモデルとトークナイザーを共有する必要がある。(2) 高温では効果が低い(ドラフトモデルの精度が下がる)。(3) ドラフトモデル用の追加GPUメモリが必要。(4) \(k=5\) を超えると収穫逓減する(受入率が下がる)。
復習: 第2章と第11章(システム基盤、システムアーキテクチャ)。
Note
Q45: ルーフラインモデルを説明してください。カーネルが計算律速かメモリ律速かをどう判定しますか?
解答: ルーフラインモデルは、演算強度(メモリトラフィック1バイトあたりのFLOPS)の関数として、達成可能な性能(FLOPS)をプロットします。
2つの領域:
メモリ律速 (クロスオーバーの左): 計算ユニットへデータを供給する速度で性能が制限される。実FLOPS=帯域幅 \(\times\) 演算強度。GPU利用率は \(<\)100%。
計算律速 (クロスオーバーの右): ピークFLOPSで性能が制限される。メモリは十分に高速で、GPU利用率は最大になる。
クロスオーバー点: ピークFLOPS/ピーク帯域幅。A100では312 TF/2 TB/s = 156 FLOP/byte。
LLMの演算:
自己回帰生成 (batch=1): 140GBの重みを読み、140G FLOPを行う=1 FLOP/byte。クロスオーバーより156\(\times\)低く、極端なメモリ律速。GPU利用率はわずか0.6%。
学習のフォワードパス (batch=128、seq=2048): 演算強度は \(\approx 200\)+ FLOP/byte。計算律速で、ピーク利用率に近い。
アテンション (長系列): \(O(n^2 d)\) FLOP/\(O(n^2 + nd)\) バイト。\(n\) が長ければ計算律速、\(n\) が短ければメモリ律速。Flash AttentionはどちらでもSRAMに保持する。
実用: カーネルがメモリ律速ならメモリトラフィックを減らす(量子化、キャッシュ、タイル分割)。計算律速ならFLOPを減らす(プルーニング、蒸留、低精度化)。
復習: 第2章(LLMのシステム基盤)。
Note
Q46: 連続バッチ処理はどう機能し、なぜRLHF生成に不可欠ですか?
解答: 静的バッチ処理: \(B\) 系列を開始し、すべてが終わるまで待つ。1系列が500トークン、別の系列が50トークンを生成すると、50トークンの系列のGPUスロットは450トークン分アイドルになる。
連続バッチ処理 (反復レベルのスケジューリング): 生成ステップごとに完了した系列を確認し、空いたスロットへすぐ新しい系列を入れる。GPUスロットがアイドルにならない。
RLHFに不可欠な理由:
RLHFは多様な出力を生成する(高温)。長さのばらつきが大きく、50トークンの応答もあれば2000以上の応答もある。
連続バッチ処理がない場合、最も遅い系列を待つため平均利用率は \(\sim\)40〜50%。
連続バッチ処理があれば利用率は \(>\)90%、スループットは2〜3\(\times\)高い。
RLHFには大きなバッチ(1ステップあたり128以上の応答)が必要。静的バッチ処理で128応答を生成するとmax_tokens \(\times\)128回の逐次ステップが必要だが、連続バッチ処理はこれを償却する。
実装: vLLMのスケジューラーはデコードステップごとに確認する。プリエンプションでは、高優先度リクエストが来てメモリが満杯なら、低優先度系列のKVキャッシュをCPUへスワップアウトし、後で再開できる。
復習: 第2章と第11章(システム基盤、システムアーキテクチャ)。
Transformerアーキテクチャの問題
Note
Q: なぜ現代のLLMでは、学習済み絶対位置埋め込みよりRoPEが主流なのですか?
解答: RoPEは回転行列により、Q/Kの内積へ相対位置を直接エンコードします。主な利点は次のとおりです。
アテンションスコアは絶対位置ではなく相対距離 \(i-j\) だけに依存し、未知の系列長へよりよく一般化する。
周波数スケーリング(NTK-aware、YaRN)により、再学習せず学習長を超えて拡張できる。
追加パラメータがない(回転は位置インデックスから決定論的に定まる)。
学習済み絶対位置埋め込みは学習長に固定され外挿できない。4Kコンテキストで学習したモデルは8Kで失敗する。
復習: 第1章(LLMのアーキテクチャと最適化手法)。
Note
Q: SwiGLUを説明してください。なぜ現代のTransformerでReLUに取って代わったのですか?
解答: SwiGLUは \(\text{FFN}(x) = W_2 (\text{Swish}(W_1 x) \odot W_3 x)\) で、\(\text{Swish}(x) = x \cdot \sigma(x)\) です。
優れている理由:
ゲーティング機構(\(\odot W_3 x\))により、ネットワークは次元を選択的に抑制・増幅でき、点ごとのReLUより表現力が高い。
Swishは滑らかで、ReLUの勾配ゼロ領域のような死んだニューロンがない。
経験的には、同じFLOP数で言語モデリングベンチマークが1〜2%改善する。
トレードオフ: 重み行列が2つでなく3つ必要(隠れ次元を \(4d\) から \(8d/3\) に減らして解決する)。
復習: 第1章(LLMのアーキテクチャと最適化手法)。
Note
Q: Grouped Query Attention(GQA)とは何で、なぜLlama-3は使うのですか?
解答: 標準MHAはクエリヘッド \(H\)、キーヘッド \(H\)、バリューヘッド \(H\)。GQAはクエリヘッド \(H\) に対し、キ/バリューヘッドは \(G < H\) だけで、クエリグループ間で共有します。
Llama-3 70Bはクエリヘッド64、KVヘッド8(各KVヘッドを8クエリヘッドで共有)です。
利点:
KVキャッシュサイズが \(H/G = 8\times\)削減される。長系列ではKVキャッシュが支配的なメモリコストなので、推論に重要です。
ヘッド間のKVパターンは強く相関するため、品質低下は最小(ベンチマークで \(<\)0.5%)。
推論スループットはKVキャッシュ削減に比例して増える(メモリに収まる系列が増え、バッチサイズが上がる)。
復習: 第1章(LLMのアーキテクチャと最適化手法)。
Note
Q: なぜLLMではエンコーダー・デコーダーよりデコーダーのみのアーキテクチャが勝ったのですか?
解答:
統一された目的: 事前学習=ファインチューニング=推論のすべてが次トークン予測を使い、アーキテクチャの不一致がない。
パラメータ効率: すべてのパラメータが生成に寄与する。エンコーダー・デコーダーでは純粋な生成タスクでエンコーダーパラメータが「無駄」になる。
スケールが単純: モデル1つ、損失関数1つ、調整するハイパーパラメータの組1つ。
KVキャッシュ効率: デコーダーのみはKVキャッシュが1つ、エンコーダー・デコーダーは2つ(エンコーダー+デコーダーのクロスアテンション)。
創発的なfew-shot: デコーダーのみはコンテキスト内学習を自然にサポートする(プロンプトの前に例を付ける)。
エンコーダー・デコーダーは入力長が固定されたseq2seqタスク(翻訳)では依然優れるが、LLMのユースケースに占める割合は減っている。
復習: 第1章(LLMのアーキテクチャと最適化手法)。
Flash Attentionの問題
Note
Q: Flash Attentionは標準アテンションと同じ結果を計算するのに2--4$\times$高速です。同じFLOP数なのになぜ可能ですか?
解答: Flash Attentionが速いのはFLOPではなくHBMメモリトラフィックを減らすからです。標準アテンションは \(n \times n\) 行列をHBMに展開し、softmaxのため読み戻し、\(PV\) 乗算のため再び読むため、\(O(n^2)\) データをHBMで4往復します。
Flash Attentionは計算をタイル分割し、\(n \times n\) 行列をSRAM(高速、19 TB/s)内だけで計算・消費し、HBM(2 TB/s)へ書き込みません。「オンラインsoftmax」のトリックが累積統計を保持してこれを可能にします。
結果: HBMトラフィックは \(O(n^2 d)\) から \(O(n^2 d / M)\) へ減る(\(M\) はSRAMサイズ)。同じFLOP数でメモリトラフィックが10〜50\(\times\)減り \(\to\) 実時間で2〜4\(\times\)高速化する。
復習: 第1章と第2章(LLMアーキテクチャ、システム基盤)。
Note
Q: なぜFlash AttentionはFFN層を助けないのですか?
解答: FFN層はメモリ律速ではなく計算律速です。演算強度(大バッチGEMMで \(I \approx 300\) FLOP/byte)は、すでにルーフラインの稜線点(A100で156 FLOP/byte)を上回っています。
Flash Attentionがアテンションを助けるのは、アテンションが強いメモリ律速(\(I \approx 1\)〜\(60\) FLOP/byte)だからです。データをSRAMに保持してメモリボトルネックを除きます。
FFNではボトルネックがすでにTensor Core(メモリ帯域幅ではない)なので、メモリトラフィックを減らしても効果がない。代わりに量子化(重みサイズを減らし \(\to\) 演算強度を高める)と大きなバッチサイズが有効です。
復習: 第1章と第2章(LLMアーキテクチャ、システム基盤)。
Note
Q: オンラインsoftmaxのトリックと、Flash Attentionに不可欠な理由を説明してください。
解答: 標準softmaxは出力計算前にグローバル最大値 \(m = \max_j x_j\) を必要とする。先に全 \(n\) アテンションスコアを見る必要があり、完全な \(n \times n\) 行列の展開を強制する。
オンラインsoftmaxのトリックはブロックを逐次処理し、累積状態 \((m, \ell, O)\) を保持する。
新しいブロックを処理 \(\to\) 累積最大値を更新: \(m_{\text{new}} = \max(m_{\text{old}}, \max(s_{\text{new}}))\)
古い和を再スケール: \(\ell_{\text{new}} = e^{m_{\text{old}} - m_{\text{new}}} \cdot \ell_{\text{old}} + \text{new terms}\)
出力を再スケール: \(O_{\text{new}} = \text{rescaled}(O_{\text{old}}) + \text{new contribution}\)
これは数学的に厳密で、近似ではない。各ブロックをSRAMに収めてブロック単位で処理でき、完全な \(n \times n\) 行列をメモリに置く必要がなくなります。
復習: 第1章と第2章(LLMアーキテクチャ、システム基盤)。
LoRAとPEFTの問題
Note
Q: LoRAはなぜ機能しますか?低ランク更新を正当化する理論的洞察は何ですか?
解答: Aghajanyanら(Aghajanyan et al. 2021)は、ファインチューニングが非常に低い内在次元で動作することを示しました。つまり、タスクに有効なパラメータ空間はモデルの総パラメータ数よりはるかに小さい。175Bモデルでも、タスクによっては内在次元が \(<\)10,000になり得ます。
LoRAはこれを直接利用します。更新をランク \(r\)(\(W' = W + BA\)、\(B \in \mathbb{R}^{d \times r}\))に制約し、重み行列ごとの \(r\) 次元部分空間に学習を限定します。真のタスク部分空間が低次元なので、ほとんど失わずに学習可能パラメータを100〜1000\(\times\)削減できます。
直感: ファインチューニングはモデルが「知っていること」を変えず(フルランクの \(W\) は凍結)、新しいタスクのため既存知識をどう組み合わせるかだけを調整する。これは低ランク摂動です。
復習: 第1章(LLMのアーキテクチャと最適化手法)。
Note
Q: 70BモデルでQLoRA、完全LoRA、完全ファインチューニングを比較してください。それぞれをいつ選びますか?
解答:
Method Memory GPUs Quality Use When Full fine-tune 560+ GB 8+ A100 Best Unlimited budget; pre-training continuation LoRA (\(r=16\)) 145 GB 2 A100 95–98% Good budget; general fine-tuning QLoRA (\(r=16\)) 44 GB 1\(\times\)48GB 93–96% Single-GPU; prototyping; constrained resources 判断木: (1) 深い知識変更が必要 \(\to\) 完全FT。(2) 新しいスタイル/形式への適応 \(\to\) LoRA。(3) メモリ制約または高速反復 \(\to\) QLoRA。(4) ランクが重要なら \(r=16\) から始め、学習損失が完全FTの水準より上で停滞したら増やす。
復習: 第1章と第10章(LLMアーキテクチャ、SFTのベストプラクティス)。
Note
Q: DoRAとは何で、なぜ標準LoRAを上回るのですか?
解答: DoRA(Weight-Decomposed Low-Rank Adaptation、重み分解低ランク適応)は \(W\) を大きさ \(\\vert W\\vert\) と方向 \(W/\\vert W\\vert\) に分解し、LoRAを方向成分だけに適用します。 \[ W' = m \odot \frac{W + BA}{|W + BA|} \] ここで \(m\)(大きさ)も学習可能ですが、出力ニューロンごとの単純なスカラーです。
有効な理由: 完全FTは大きさと方向を独立に更新します。標準LoRAは両者を結合する(低ランク更新が制約付きで両方を同時に変える)。DoRAは分離し、LoRAに完全FTと同じ「自由度」の構造を与える。結果として推論時の追加計算なし(アダプターをマージ)で推論タスクが1〜3%改善します。
復習: 第1章(LLMのアーキテクチャと最適化手法)。
モデル圧縮の問題
Note
Q: AWQを説明してください。なぜ重みの1%を保護すると品質の99%を維持できるのですか?
解答: AWQ(Activation-Aware Weight Quantization、アクティベーションを考慮した重み量子化)は、重みの重要度が一様でないことに注目します。大きなアクティベーションを乗算する重みは、出力に不釣り合いに大きく寄与します。
重要な洞察は、\(\\vert W \cdot X\\vert\) が \(W\) と \(X\) の両方に依存することです。大きなアクティベーションを掛けた小さな重みの方が、ほぼゼロのアクティベーションを掛けた大きな重みより重要になります。
AWQは「顕著な」チャネル(キャリブレーションデータ全体でアクティベーションの大きさが一貫して大きいもの)の上位1%を特定し、スケーリングで保護します。量子化前に顕著なチャネルを \(s > 1\) 倍し、アクティベーション側で \(s\) で割る。これにより重要チャネルの相対量子化誤差を減らします。
結果: 70Bモデルで品質低下 \(<\)1%の4ビット量子化を実現する。顕著でない99%の重みは強い量子化に耐えられるためです。
復習: 第1章と第2章(LLMアーキテクチャ、システム基盤)。
Note
Q: FP8、4ビット量子化、BF16はいつ使うべきですか?
解答:
BF16: 精度が重要な学習(RLHFの方策モデル)。勾配で更新するモデルのデフォルト。
FP8(E4M3): Transformer Engineを使うH100学習(スループット2\(\times\)、品質低下 \(<\)0.5%)。最大スループットが必要なH100推論にも使う。
INT8/FP8推論: RLHFの凍結モデル(参照モデル、報酬モデル)。学習しないため低精度でも安全。
4ビット(AWQ/GPTQ): 大規模な推論提供。デプロイ時のメモリ/品質のトレードオフが最良。QLoRAのベースモデルにも使う。
2ビット: 実験的。メモリが極端に制約されるエッジデプロイ向け。品質低下は5〜10%。
ルール: 推論では可能な限り強く量子化し、学習ではBF16(H100ならFP8)を維持する。
復習: 第2章(LLMのシステム基盤)。
Note
Q: NVIDIAの2:4構造化スパース性を説明してください。高速化と制約は何ですか?
解答: 2:4スパース性とは、4つ連続する要素の各グループで、ちょうど2つをゼロにすることです。重みレベルで強制します。
ハードウェア対応: A100/H100のTensor Coreにはゼロ要素を飛ばす2:4スパースGEMM命令があり、ソフトウェアオーバーヘッドなしで 2\(\times\)のスループット を達成します。
制約: この特定のパターンで正確に50%のスパース性にする必要があります。30%や70%、任意のパターンは使えない。プルーニングは4要素グループ構造に従う必要があります。
達成方法: 学習後(またはファインチューニング中)、4重みごとに大きさが小さい2つをゼロにする。その後数百ステップFTして品質を回復する。大モデル(70B以上)の品質低下は通常 \(<\)1%。
復習: 第2章(LLMのシステム基盤)。
Mixture of Expertsの問題
Note
Q: Mixtral 8x7Bは総パラメータ47Bですが、トークンごとにアクティブなのは13Bだけです。仕組みと効率の理由を説明してください。
解答: Mixtralは各FFN層を8つの並列エキスパートFFN(FFN部分が各 \(\sim\)7Bパラメータ)に置き換えます。ルーターネットワークがトークンごとにTop-2エキスパートを選びます。
総計47Bの理由: アテンション層は共有され(複製されず)\(\sim\)5B。FFNエキスパートは8 \(\times\) \(\sim\)5.25B = 42B。合計 \(\sim\)47B。
アクティブが13Bの理由: 1トークンでは2エキスパートだけが発火する。アクティブパラメータ=アテンション(\(\sim\)5B)+2 FFNエキスパート(\(\sim\)2 \(\times\)5.25B)\(\approx\)13B。
効率的な理由: 計算コストはアクティブパラメータ(13B)に比例し、13B密モデルと同等。一方、容量(保存知識)は総パラメータ(47B)に比例し、はるかに大きなモデルに匹敵する。その結果、Mixtralは13Bの計算コストでLlama-2 70Bの品質に匹敵します。
メモリコスト: すべてのエキスパートをロードするため47B全パラメータをメモリに置く必要があり、メモリは47Bモデル相当だが、計算は13Bモデル相当です。
復習: 第1章(LLMのアーキテクチャと最適化手法)。
Note
Q: MoEの負荷分散問題とは何で、どう解決しますか?
解答: 制約がないと、ルーターは大半のトークンを1〜2個の「人気」エキスパートへ送りがちです(富める者がますます富む力学)。その結果:
容量浪費: 8エキスパートのうち6つが未使用になり、モデルは実質2エキスパート規模に縮む。
計算の不均衡: 各エキスパートを別GPUに置くと、人気エキスパートがボトルネックになり、他はアイドルになる。
解決策: 補助負荷分散損失 \(\mathcal{L}_{\text{bal}} = \alpha \cdot N \sum_{i=1}^N f_i \cdot p_i\) を使う。ここで \(f_i\) はエキスパート \(i\) に送られたトークンの割合、\(p_i\) はエキスパート \(i\) のルーター確率平均。不均一な分布を罰する。
代替策: エキスパート容量係数。バッチごとのエキスパート最大トークン数に上限を設け、あふれたトークンを破棄または再ルーティングする。
典型的な \(\alpha\): 0.01〜0.1(主損失を損なわない程度に小さく、崩壊を防ぐには十分に大きい)。
復習: 第1章(LLMのアーキテクチャと最適化手法)。
学習における多様性の問題
Note
Q: GRPOグループ内のN個の応答がすべて同一だと何が起きますか?
解答: \(N\) 個の応答がすべて同一なら、全報酬 \(r_i\) が等しく、\(\sigma_G = 0\) となり、アドバンテージ \(\hat{A}_i = (r_i - \mu_G)/\sigma_G\) は未定義(ゼロ除算)です。実装では通常すべてを \(\hat{A}_i = 0\) とし、 学習信号がゼロ になるため、そのステップは無駄になります。
予防:
温度: 生成時に \(\tau = 0.7\)〜\(1.0\)を使う(貪欲にしない)。
大きな \(N\): \(N=8\)〜\(16\)にすると多様な応答の確率が上がる。
重複拒否: DAPO方式で、重複応答を拒否して再サンプリングする。
頻度ペナルティ: 生成中に反復n-gramを罰する。
監視: グループごとの一意応答率を追跡する。\(<\)50%なら温度を上げる。
復習: 第7章(GRPO)。
Note
Q: RLHFにおける多様性と品質のトレードオフを説明してください。モード崩壊をどう検出しますか?
解答: トレードオフ: 多様性が高い(エントロピー/温度が高い)=多様だがランダム/低品質になり得る応答。多様性が低い=一貫しているが反復的で報酬ハッキングされた応答。
モード崩壊の検出 (すべて学習中に監視する):
応答エントロピー: トークンごとのエントロピー \(H = -\sum p_i \log p_i\) を計算する。急低下なら \(\to\) 崩壊。
一意n-gram率: 同じプロンプトへの応答全体で一意な4-gramの割合。健全な値は \(>\)0.6。
報酬分布の幅: \(\sigma(\text{rewards})\) がほぼゼロへ縮むなら \(\to\) すべて同じ品質 \(\to\) 同一である可能性が高い。
KLダイバージェンス: \(D_\text{KL}[\pi_\theta \\vert \pi_\text{ref}]\) が急増するなら、方策が参照から遠ざかり \(\to\) 狭いモードへ向かっていることが多い。
長さのヒストグラム: すべての応答が同じ長さに収束するなら \(\to\) テンプレート的な振る舞い。
修正: KL係数 \(\beta\)、エントロピーボーナス、サンプリング温度を上げるか、以前のチェックポイントへロールバックする。
復習: 第7章と第9章(GRPO、報酬モデルの学習)。
投機的デコーディングの問題
Note
Q: 投機的デコーディングは「品質低下なし」と主張します。異なる方法でトークンを生成して同じ出力分布になるのはなぜですか?
解答: 受入/拒否方式が分布の同値性を保証します。
各ドラフトトークン \(\hat{x}\) について、ドラフト確率 \(q(\hat{x})\) と対象確率 \(p(\hat{x})\) を持つ:
\(\min(1, p(\hat{x})/q(\hat{x}))\) の確率で受け入れる
拒否時は残差分布 \(\propto \max(0, p(x) - q(x))\) からサンプリングする
これは \(p\)(対象モデル)から直接サンプリングするのと数学的に同値です。概略は、トークン \(x\) の出力確率が \(q(x) \cdot \min(1, p(x)/q(x)) + P(\text{reject}) \cdot \frac{\max(0, p(x)-q(x))}{\sum_y \max(0, p(y)-q(y))} = p(x)\) となることです。
高速化は償却から生まれます。ドラフトが良い(受入率が高い)と、1回の対象モデルのフォワードパスで複数トークンを確定できます。保証はドラフト品質に関係なく成立し、悪いドラフトは品質を下げず高速化を下げる(拒否が増える)だけです。
復習: 第2章(LLMのシステム基盤)。
Note
Q: 投機的デコーディングにおけるMedusaとEagleを比較してください。それぞれをいつ選びますか?
解答:
Medusa: 対象モデルに \(k\) 個の並列予測ヘッドを追加し、各ヘッドが位置 \(t+i\) のトークンを独立に予測する。利点: 別モデル不要で、メモリオーバーヘッド \(<\)1%。欠点: ヘッドが独立予測するため、\(t+2\) は \(t+1\) の予測を条件にできない。受入率60〜80%。
Eagle: 対象モデルの隠れ状態上に軽量自己回帰デコーダーを置く。ドラフトトークンは自己回帰的に生成する(各トークンが前のトークンを条件とする)。利点: トークン間依存を捉え \(\to\) 受入率85〜95%。欠点: 追加メモリ(小型デコーダー)と逐次ドラフト生成が必要。
Medusaを選ぶ場面: メモリが極端に厳しく、統合が単純で、中程度の高速化(2〜2.5\(\times\))で十分な場合。
Eagleを選ぶ場面: 最大高速化(3〜4\(\times\))が必要で、小型追加モデルを置け、レイテンシ重視の単一ストリーム生成を行う場合。
N-gramを選ぶ場面: 出力が反復的(コード、構造化データ)で、コストゼロ・学習不要が必要な場合。
復習: 第2章(LLMのシステム基盤)。
Note
Q: なぜ投機的デコーディングは大きなバッチサイズで役立たないのですか?
解答: 大きなバッチサイズ(\(\geq\)64)では、自己回帰生成はすでに計算効率が高い。重み読み込みコストが多くの系列にわたって償却され、演算強度がルーフラインの稜線点に近づくためです。
投機的デコーディングはオーバーヘッドを加えます。
ドラフト生成コスト(小型モデルでも大バッチでは無料ではない)
検証フォワードパスが系列ごとに \(k\) 個の追加トークンを処理する(バッチ \(\times\) \(k\) トークン)
ドラフトモデルまたはMedusaヘッドのメモリ
拒否トークンが計算を浪費する
batch=1(レイテンシ律速、メモリ律速)では、投機により1ステップ1トークンが3〜4トークンになり、大きな効果があります。
batch=128(すでに計算効率が高い)では、GPUがほぼ飽和しているため投機の追加トークンはスループットにほぼ寄与しない。オーバーヘッドでスループットが下がることさえあります。
ルール: 投機的デコーディングはレイテンシ(小バッチ)向け、バッチ処理はスループット(大バッチ)向け。組み合わせない。
復習: 第2章(LLMのシステム基盤)。
エージェント型RLの問題
Note
Q: なぜ標準RLHF(単一ターンPPO/DPO)はマルチステップエージェントで失敗するのですか?
解答: 標準RLHFは単一ターン品質を最適化します。プロンプトに対して1つの良い応答を生成する方式です。マルチステップエージェントは根本的に異なる課題に直面します。
信用割当: 50ステップの軌跡で、どのステップが失敗を引き起こしたか。単一ターン報酬は応答全体に一様に寄与を割り当てるが、マルチステップにはステップごとの寄与評価が必要。
疎な報酬: 成功/失敗が軌跡の最後にしかない。PPOのGAEは中間報酬を仮定するため、ない場合はアドバンテージ推定がノイジーになる。
アクション空間: アクションは単なるトークン系列ではなく構造化ツール呼び出し(JSON)。モデルは構文、意味、戦略を同時に学ぶ必要がある。
非定常性: アクションごとに環境が変わる(ツール出力が状態を変更する)。入力が固定された単一ターンと違い、ステップごとに「プロンプト」が異なる。
探索: エージェントは文章の言い換えではなく、新しいツール利用戦略を発見しなければならない。
解決策: 軌跡レベルGRPO(完全な軌跡を順位付け)、プロセス報酬モデル(ステップごとのフィードバック)、または成功軌跡に対するフィルタ済みSFTを使う。
復習: 第12章(LLMエージェント学習)。
Note
Q: GRPOをエージェント学習にどう適応しますか?単一ターンGRPOとの主な違いは何ですか?
解答: 単一ターンGRPOは、プロンプトへの \(N\) 個の応答を生成し、報酬で順位付けしてアドバンテージを計算します。
エージェント型GRPOとの違い:
生成単位: 単一応答ではなく完全な軌跡(10〜100ステップ)。各軌跡がグループ内の1「サンプル」になる。
報酬: 終端(タスク成功/失敗)または軌跡レベル(ステップ報酬の和)。トークン単位ではない。
マスキング: 方策損失はエージェントの出力(推論+ツール呼び出し)だけで計算する。ツール出力(環境応答)は勾配計算からマスクする。
グループサイズ: 軌跡は高コスト(軌跡ごとに多数のフォワードパス)なので、通常は小さい(\(N=4\)〜8)。
KLペナルティ: 各判断点でSFT方策からドリフトしないようステップごとに適用する。
長さの正規化: 入念な推論を罰しないよう、トークン数ではなくエージェントのアクション数で正規化する。
復習: 第7章と第12章(GRPO、LLMエージェント学習)。
Note
Q: エージェントにおけるSTaR、Reflexion、ReActを比較してください。
解答:
STaR(Self-Taught Reasoner): 推論チェーンを生成 \(\to\) 正しさでフィルタ \(\to\) 正しいものをFTする。使う場面: 検証可能なタスク(数学、コード)があり、RLなしでベースモデルから推論をブートストラップしたい場合。
Reflexion: 失敗後に言語フィードバック(「何が悪かったか?」)を生成 \(\to\) コンテキスト内の内省とともに再試行する。重み更新はない。使う場面: 推論時改善、学習計算が限られる場合、自己診断可能なタスク。
ReAct: 推論(考える)と行動(ツール利用)を構造化ループで交互に行う。使う場面: マルチステップのツール利用、透明性が必要(推論トレースを解釈できる)、エージェントが思考と行動を選ぶ必要がある場合。
主な違い:
復習: 第12章と第18章(LLMエージェント学習、エージェント設計パターン)。
Note
Q: なぜ研究エージェントではPPOよりGRPOが好まれるのですか?
解答: 20〜100ステップの軌跡を持つ研究エージェントでは:
PPOには価値モデルが必要: \(V(s_t)\) が現在状態からの期待総報酬を予測する必要がある。研究では状態が論文、コード、結果を含む128Kトークンのコンテキストであり、「3本の論文を読み、コードを一部書いた」価値の正確な予測は極めて難しい。
GRPOは価値推定を完全に避ける: 研究質問ごとに \(N\) 個の完全な軌跡を生成し、グループ内順位をアドバンテージとして使う。中間価値を予測せず、結果を比較するだけです。
その他の理由:
研究品質は二値に近い(良いレポートか悪いレポートか)ため、順位付けが自然。
軌跡は長く高コスト。GRPOの \(N=4\) は管理可能だが、PPOは安定した価値推定のため多数のロールアウトが必要。
終端報酬は疎であり、疎な報酬のGAEはどうせステップごとのアドバンテージがノイジーになる。
復習: 第7章と第12章(GRPO、LLMエージェント学習)。
Note
Q: コーディングエージェントの報酬関数を設計してください。どのような報酬ハッキングのリスクがありますか?
解答: 報酬設計: \[ R = 0.5 \cdot R_{\text{tests}} + 0.2 \cdot R_{\text{quality}} + 0.2 \cdot R_{\text{efficiency}} + 0.1 \cdot R_{\text{safety}} \]
\(R_{\text{tests}}\): 合格した単体テストの割合(0〜1)。正解を検証可能。
\(R_{\text{quality}}\): コードスタイル、ドキュメント、保守性をLLMジャッジで評価。
\(R_{\text{efficiency}}\): \(\max(0, 1 - \text{steps}/30)\)。早く終えるほどボーナス。
\(R_{\text{safety}}\): 危険な操作をしない(rm -rf、サンドボックス外のネットワークアクセス)。
報酬ハッキングのリスク:
ハードコード出力: 計算せず期待されるテスト出力を直接表示するよう学習する。修正: テスト入力をランダム化し、取り置きケースでテストする。
テスト削除: 失敗したテストを変更/削除する。修正: サンドボックス内のテストを読み取り専用にする。
自明な解法: テストは通るが一般化しない最小コードを書く。修正: 大規模で多様なテストスイートとプロパティベーステスト。
効率性の悪用: 効率ボーナスを最大化するため推論ステップを省く。修正: 効率ボーナスの前に最低品質しきい値を要求する。
復習: 第9、12、19章(報酬モデルの学習、LLMエージェント学習、エージェント型環境)。
リストワイズ報酬と高度なRMの問題
Note
Q: Plackett-Luceモデルを説明してください。Bradley-Terryをどう一般化しますか?
解答: Bradley-Terryはペアワイズ選好 \(P(y_1 \succ y_2) = \sigma(r(y_1) - r(y_2))\) をモデル化します。
Plackett-Luceは \(K\) 個のアイテムの完全な順位を逐次選択としてモデル化します。 \[ P(\pi) = \prod_{i=1}^K \frac{e^{r(y_{\pi(i)})}}{\sum_{j=i}^K e^{r(y_{\pi(j)})}} \] 解釈: 残りの中から最良のアイテムを順に選ぶ。1位は全 \(K\) のsoftmax、2位は残り \(K-1\) のsoftmax、以下同様です。
一般化: \(K=2\) ではPLはBTに正確に還元されます。\(P(y_1 \succ y_2) = \frac{e^{r(y_1)}}{e^{r(y_1)} + e^{r(y_2)}} = \sigma(r(y_1) - r(y_2))\)。
利点: \(K=8\) アイテムの順位は \(\binom{8}{2} = 28\) 個の暗黙のペア比較と相対マージン情報を与え、単一ペアよりはるかに豊かな学習信号になる。
復習: 第9章(報酬モデルの学習)。
Note
Q: プロセス報酬モデル(PRM)とは何で、結果報酬モデル(ORM)より優れるのはいつですか?
解答: ORM: 最終出力だけを採点する。\(r(x, y_{\text{final}})\) は完全な応答に対する1つのスカラー。
PRM: 推論の各ステップを採点する。\(r(x, y_{\text{step } t})\) は中間ステップごとのスカラー。
PRMが優れる場合:
長い推論チェーン: 10ステップ以上の数学問題。ORMはどのステップが間違ったか分からないが、PRMはステップごとのクレジットを与える。
探索/検証: PRMにより木探索が可能(推論ステップのビーム探索、ステップ報酬の低い枝の剪定)。
学習信号密度: PRMは軌跡ごとに \(T\) 個の報酬(ステップごと)を与え、ORMの単一報酬 \(\to\) アドバンテージ推定の分散が低い。
ORMが優れる場合: タスクが短い(単一ターン)、ステップ境界が不明確、ステップごとのラベル付けコストが高すぎる場合。
PRMのアノテーション: 「Math-Shepherd」方式で自動化できる。各ステップから解答を複数回完成させる。ステップ \(t\) からは成功するが \(t+1\) からは失敗するなら、\(t+1\) は誤りの可能性が高い。
復習: 第9章と第13章(報酬モデルの学習、大規模推論モデルのためのRL)。
大規模推論モデルのためのRLの問題
Note
Q: DeepSeek-R1は長い推論チェーンで学習するのに、なぜプロセス報酬モデルを使わないのですか?
解答: DeepSeek-R1が 結果ベースの報酬 (正確性+形式)だけを使う理由は次のとおりです。
検証可能なタスク: 数学とコードには決定論的な正解がある。二値の正確性報酬は長いチェーンでも十分な信号を与える。
PRMの失敗モード: ステップレベル報酬モデルは独自の報酬ハッキングを生む。モデルは実際には正しくなくても、PRMに「正しく見える」ステップを生成するよう学習できる。
GRPOのグループ正規化: プロンプトごとに \(G\) 個の完了をサンプリングし、グループ内でアドバンテージを正規化することで、ステップ報酬なしでもどの推論戦略が有効かという相対信号を自然に与える。
創発的な自己修正: 結果のみの報酬で、モデルはチェーン内で自己修正すること(「アハ体験」)を学ぶ。ステップ報酬が推論過程を細かく管理すると、これは創発しない。
重要な洞察: PRMを不要にするのはタスク領域の検証可能性です。主観的なタスク(創作)では結果のみの報酬では足りない可能性があります。
復習: 第13章(大規模推論モデルのためのRL)。
Note
Q: テスト時計算量スケーリング則と、モデルデプロイへの意味を説明してください。
解答: テスト時計算量スケーリング則は次のように表されます。 \[ \text{Accuracy}(C_{\text{train}}, C_{\text{test}}) \approx f(\alpha \log C_{\text{train}} + \beta \log C_{\text{test}}) \]
意味:
計算量の同等性: 推論トークンを64\(\times\)多く使う7Bモデルが、推論タスクでトークン1\(\times\)の70Bモデルに匹敵できる。
適応的割り当て: 易しい質問には短いチェーン(安価)、難しい質問には長いチェーン(高価)を割り当てる。常に大モデルを使うより平均コストが低い。
デプロイの柔軟性: 大モデル1つではなく小さな推論モデルをデプロイし、難易度に応じてクエリごとに推論計算量を増減する。
収穫逓減: 対数関係なので、テスト時計算量を2倍にしても精度の改善は逓減する。学習と推論の計算量には最適な配分がある。
「考えすぎ」の失敗: 非常に長いチェーンは、誤差の累積とアテンションの希薄化により精度を下げることがある。最適なチェーン長は問題の難易度に依存する。
復習: 第13章(大規模推論モデルのためのRL)。
Note
Q: MCTS(モンテカルロ木探索)はLLM推論にどう適用されますか?
解答: 推論のMCTSでは、部分解をそれぞれ木のノードとして扱います。
反復ごとの4段階:
選択: UCBを使って根から移動する: \(\text{UCB}(s) = Q(s) + c\sqrt{\frac{\ln N(\text{parent})}{N(s)}}\)
展開: LLMから新しい推論ステップ(子ノード)を生成する
シミュレーション: 新しいノードから解答を完成させる(ロールアウト)
逆伝播: 最終的な正しさに基づいて経路上のQ値を更新する
ゲームMCTSとの主な違い:
分岐係数: 推論の分岐係数は巨大(次の文は何でも可能)。実装ではLLMのtop-k出力を使って枝を制限する。
価値関数: 学習済みPRMが部分解の品質を推定し、ランダムロールアウトを置き換える。
ステップ粒度: 各「ステップ」は1文、1式、1つの論理推論など。粒度の選択が重要。
利用例: AlphaProof(数学オリンピック)。OpenAI o1/o3の隠れた推論にも使われると仮定されています。
復習: 第13章(大規模推論モデルのためのRL)。
Note
Q: 小さな推論モデルの作成における蒸留と直接RLを比較してください。
解答:
蒸留 (DeepSeek-R1-Distill方式):
大モデル(R1-671B)から推論チェーンを生成する
そのチェーンで小モデルをSFTする
結果: 小モデルが大モデルの推論形式を模倣する
利点: 安価(SFTだけ)。欠点: 真の推論ではなく表面的なパターンを学ぶ可能性。
小モデルへの直接RL:
検証可能な報酬に対してGRPO/PPOで小モデルを学習する
モデルが独自の推論戦略を発見する
利点: 本物の能力。欠点: 計算量がはるかに多く、非常に小さいモデルでは収束しない可能性。
経験的知見: R1-Distill-7B(蒸留)はほとんどのベンチマークでdirect-RL-7Bを上回る。大モデルの推論チェーンが強い教師信号なので、SFTだけでも競争力がある。ただし蒸留モデルは本当に新しい問題種別への一般化が弱い。
ベストプラクティス: まず蒸留して安価なベースラインを作り、その後必要なら蒸留モデルにRLを行ってさらに改善する(Qwenが使う「蒸留+RL」)。
復習: 第13章(大規模推論モデルのためのRL)。
LLM評価の問題
Note
Q: ELOレーティング更新則を導出し、Chatbot Arenaが使う理由を説明してください。
解答: ELOの導出:
AがBに対して得る期待スコアは \(E_A = \frac{1}{1 + 10^{(R_B - R_A)/400}}\)(ロジスティックモデル)。
実スコア \(S_A \in \{0, 0.5, 1\}\) の試合後は、\(R_A' = R_A + K(S_A - E_A)\)。
\(K\)係数が更新量を制御する(\(K\) が高いほど最近の結果に敏感)。
Chatbot ArenaがELOを使う理由:
推移性: AがBに勝ち、BがCに勝てば、ELOはAがCに勝つと予測する。ペア比較から全順序を得られる。
オンライン更新: すべてのペアを再評価せず新モデルを追加できる。新しい比較ごとにレーティングを逐次更新する。
信頼度: \(N\) 回の比較後、レーティングの不確実性は \(O(1/\sqrt{N})\) で縮む。標準誤差は \(\text{SE} \approx \frac{400}{\sqrt{N}}\)。
人間の選好を捉える: 実ユーザーは基準を言語化せず正直な選好を示し、集約結果が真のモデル品質を明らかにする。
Chatbot Arenaの詳細: ブートストラップ信頼区間付きBradley-Terry MLE(収束時にELOと同等)を使う。スタイル制御ELOで長さ/形式バイアスを除く。
復習: 第14章(LLM評価)。
Note
Q: コード生成のpass@k指標とは何で、なぜ不偏推定量が重要ですか?
解答: pass@k=生成した \(k\) サンプルの少なくとも1つが全テストケースに合格する確率。
素朴な(偏った)推定量: \(k\) サンプルを生成し、合格があるか確認する。分散が高く、問題ごとに多くの試行が必要で高コスト。
不偏推定量 (Chenら、2021): \(n \geq k\) サンプルを生成し、合格数 \(c\) を数える。 \[ \text{pass@}k = 1 - \frac{\binom{n-c}{k}}{\binom{n}{k}} \]
不偏性が重要な理由:
\(n\) サンプル(例: \(n=200\))を一度生成し、同じサンプルからpass@1、pass@10、pass@100を計算できる。
評価全体を \(k\) 回繰り返す必要がない。
統計的に厳密(正しいサンプルを含まない \(k\) 部分集合の割合という組合せ論的根拠)。
log空間で数値的に安定して計算できる: \(\text{pass@}k = 1 - \exp\left(\sum_{i=0}^{k-1} \log(n-c-i) - \log(n-i)\right)\)
直感: 200サンプル中50個が合格(\(c=50\)、\(n=200\))なら、pass@1 \(\approx 0.25\)、pass@10 \(\approx 0.94\)。推定量は、\(k\) 個の抽出に少なくとも1つ成功が含まれる割合を数える。
復習: 第14章と第19章(LLM評価、エージェント型環境)。
Note
Q: ベンチマーク汚染をどう検出・緩和しますか?
解答: 汚染: 学習データにベンチマークのテスト例(または近い言い換え)が含まれ、スコアが水増しされる。
検出方法:
N-gram重複: 学習データにテスト項目との完全一致または近似一致があるか確認する。8-gramカバレッジ \(>\)80%は疑わしい。
カナリア文字列: テストセットに一意な識別子を入れ、モデルが再現できるか確認する。
言い換えベンチマーク: 意味は同じで文面が異なる版を作る。精度が大きく下がれば記憶が疑われる。
時間分析: 事前学習カットオフ前後のテスト項目で性能を比較する。古い項目だけ異常に高性能なら汚染を示唆する。
メンバーシップ推論: 特定例が学習データにあったかを統計的に検定する。
緩和策:
動的ベンチマーク: 新しいテスト項目を定期生成する(LiveCodeBench、Chatbot Arena)。
非公開テストセット: テスト項目を秘密にする(LMSYS)。
学習中の除染: 検出した重複を学習データから削除する。
汚染分析を報告: ベンチマークスコアとともに重複指標を開示する。
復習: 第14章(LLM評価)。
Note
Q: LLM-as-Judgeの位置バイアスと、その緩和方法を説明してください。
解答: 位置バイアス: LLMで2つの応答(A対B)を判定すると、品質にかかわらず特定位置(通常は最初または最後)の応答を系統的に好む。
経験的な大きさ: GPT-4は10〜15%、Claudeは5〜10%の位置バイアスを示す。小さいモデルほど大きい。
緩和戦略:
位置交換: 各ペアをA-BとB-Aの2回判定する。最終決定は多数決で、食い違えば「引き分け」とする。系統バイアスを除けるがコストは2倍。
複数ジャッジ: 3つ以上の異なるモデルを判定者にする。多数決で個別モデルのバイアスを減らす。
参照誘導: 評価基準または参照解答を与える。各応答を基準に対して独立採点し、スコアを比較する(ペア比較自体をなくす)。
較正済みプロンプト: 「提示順はランダムで、判定に影響させてはいけない」と明示する。
その他のバイアス: 冗長性バイアス(長い応答を好む)、自己高揚バイアス(モデル自身の出力を好む)、権威バイアス(出典を引用する応答に従う)。
復習: 第14章(LLM評価)。
エージェント型メモリの問題
Note
Q: エージェント型メモリの4種類を比較し、それぞれが重要になる場面を説明してください。
解答:
種類 保存するもの アクセスパターン 重要な場面 ワーキング 現在のコンテキスト/スクラッチパッド 常にコンテキスト内 複雑なマルチステップ推論 エピソード 過去の経験 類似性で検索 過去の失敗から学ぶ セマンティック 事実と知識 概念で検索 ドメイン固有タスク 手続き スキルとパターン タスク種別で起動 ツール利用の反復 重要な洞察: これらは独立ではなく相互作用する。エピソード記憶がセマンティック記憶へ情報を供給し(エピソードから事実へ一般化)、手続き記憶はエピソードのフィードバックで洗練される(有効なツール系列を学ぶ)。ワーキングメモリが他の種類からの検索を調整する。
MemGPTの類推: ワーキング=ホット(コンテキスト内)、エピソード/セマンティック=ウォーム(ベクトルストア)、手続き=コールド(アーカイブ済み方策)。エージェント自身が情報をページイン/アウトするタイミングを決める。
復習: 第16章(エージェント型メモリシステム)。
Note
Q: メモリ検索における時間減衰はどう機能し、なぜ重要ですか?
解答: 時間減衰 は検索時に古いメモリの重みを下げます。 \[ \text{score}(m) = \alpha \cdot \text{similarity}(q, m) + (1 - \alpha) \cdot \text{recency}(m) \] ここで \(\text{recency}(m) = e^{-\lambda \cdot \Delta t}\)、\(\Delta t\) は最後のアクセスからの時間です。
重要な理由:
関連性の減衰: ユーザーの選好は変化する。6か月前の選好は古い可能性がある。
矛盾解消: 古い情報と新しい情報が衝突すると、最近性バイアスが現在の真実を自然に優先する。
検索効率: 減衰がないとメモリは無制限に増え、検索が無関係な古い項目を返すようになる。
認知的妥当性: 人間も忘れるため、最近の出来事ほどアクセスしやすい。間隔効果を反映する。
アクセスに基づく更新: メモリを検索して使うとタイムスタンプを更新する(LRUキャッシュに似る)。頻繁にアクセスされるメモリは作成日に関係なく「新鮮」に保たれる。
減衰率の調整: \(\lambda\) は領域に依存する。カスタマーサービスは高減衰、法律/医療は低減衰。RLで学習できる。
復習: 第16章(エージェント型メモリシステム)。
Note
Q: RLを使ってメモリ操作をどう学習できますか?
解答: メモリ操作(write/read/update/delete)はエージェントのMDPにおけるアクションにできます。
定式化:
状態: 現在のコンテキスト+メモリ状態
アクション: 標準アクション+
memory_write(key/value)、memory_read(query)、memory_delete(key)報酬: タスク成功(メモリが役立ったか)+メモリ効率ペナルティ(読み取りが少ないほど良い)
RLが学ぶもの:
何を保存するか: 重要情報(APIキー/ユーザー選好)と一時的な詳細の区別
いつ検索するか: ドメイン質問への回答前か、一般チャット中か
圧縮方針: 古いメモリを要約するか、そのまま保持するか
忘却: 古い情報が陳腐化し、削除すべきタイミング
学習信号: 反実仮想。「このメモリを保存/検索しなかったとしてもエージェントは成功したか?」軌跡比較で実装し、メモリをうまく使った軌跡に高い報酬を与える。
課題: 遅延報酬。今保存した情報が100ステップ後にしか役立たないことがある。長期ホライズンの信用割当(高い \(\lambda\) のGAE)が必要です。
復習: 第12章と第16章(LLMエージェント学習、エージェント型メモリシステム)。
エージェントオーケストレーションの問題
Note
Q: コンテキスト予算問題と、動的割り当てによる解決方法を説明してください。
解答: 問題: エージェントのコンテキストウィンドウは \(L\) トークンだが、次のための領域が必要です。 \[ C = S + M + T + H + R \leq L \] ここで \(S\) はシステムプロンプト、\(M\) はメモリ/検索コンテキスト、\(T\) はツール説明、\(H\) は会話履歴、\(R\) は応答用の予約領域です。
会話が増えると \(H\) が増え、他の要素を押し出します。
動的割り当て戦略:
固定最小値: \(S_{\min}\)、\(R_{\min}\) は譲れない。
適応的履歴: \(H > H_{\max}\) になったら古いターンを要約する。最後の \(k\) ターンはそのまま、残りを要約する。
オンデマンドツール: 現在のクエリに関係するツール説明だけを含める(50個すべてではない)。分類器または埋め込み類似度で上位 \(k\) ツールを選ぶ。
遅延メモリ: 事前ロードせず、クエリを分析して必要なときだけメモリを検索する。
オーバーフロー処理: 圧縮しても合計が \(L\) を超える場合:
重要度の低いツール説明を捨てる
履歴を1ターン1文まで積極的に要約する
メモリスロットを減らす
それでも超えるなら、ユーザーへの警告付きで切り詰める
事前チェック: LLMを呼び出す前に必ずトークン数を数える。推論時にオーバーフローを発見してはいけない。
復習: 第17章(エージェントハーネス — コンテキスト管理とオーケストレーション)。
Note
Q: ReActとPlan-and-Executeのオーケストレーションパターンを比較してください。
解答:
ReAct (Reason + Act):
ループ: 思考 \(\to\) アクション \(\to\) 観察 \(\to\) 思考 \(\to\) …
各ステップで、これまでのすべての観察に基づいて次のアクションを決める
利点: 適応的で、ツール出力に基づいて方向を変えられる
欠点: 近視眼的で事前計画がない。ループに陥る可能性があり、各LLM呼び出しが全履歴を見るため高コスト。
Plan-and-Execute:
フェーズ1: 完全な計画(ステップ一覧)を生成
フェーズ2: ステップを逐次実行(より単純な実行器、場合によっては安価なモデル)
フェーズ3: 実行に失敗したら再計画
利点: 効率的(毎ステップ推論するより一度の計画が安い)。独立ステップを並列化できる。
欠点: 計画が脆い。初期ステップが失敗すると計画が無効になり得る。再計画はレイテンシを加える。
使い分け:
ReAct: 探索的タスク、未知の環境、各ステップの結果が次を決めるタスク
Plan-and-Execute: 明確なタスク、既知のツールセット、並列化可能なサブタスク、コスト重視のデプロイ
ハイブリッド: 高レベルで計画し、各計画ステップ内ではReActを使う(LangGraph推奨パターン)。
復習: 第17章と第18章(エージェントハーネス、エージェント設計パターン)。
Note
Q: エージェント実行の無限ループをどう検出・防止しますか?
解答: エージェントは、異なる結果を期待して同じアクションを繰り返すと無限ループに入ります。
検出方法:
最大反復ガード: 固い上限(例: 25ステップ)。単純だが、本当に長いタスクの作業を失う。
アクションハッシュ窓: 直近 \(k\) 個の(アクション/観察)ペアをハッシュ化する。現在のハッシュが直近 \(w\) ステップのものと一致すればループと検出する。
意味的類似度: 最近のアクションを埋め込む。連続アクションのコサイン類似度がしきい値(\(>\)0.95)を超えれば、行き詰まりの可能性が高い。
進捗監視: タスク固有の進捗指標を定義し、\(N\) ステップ進捗がなければ介入する。
回復戦略:
ヒント注入: 「アクションを繰り返しているようです。別の方法を試してください」というシステムメッセージを加える。
別アクションを強制: 次のステップでは繰り返したアクションをアクション空間からマスクする。
エスカレーション: 部分結果とともにユーザーへ返し、指示を求める。
バックトラック: ループ開始前のチェックポイントへ戻り、別経路を試す。
ベストプラクティス: 最大反復(安全網)+ハッシュ検出(早期介入)+適切なエスカレーション(ユーザーの信頼を維持)を組み合わせる。
復習: 第17章と第18章(エージェントハーネス、エージェント設計パターン)。
MCPプロトコルの問題
Note
Q: MCPのN+Mアーキテクチャと、エージェントエコシステムで重要な理由を説明してください。
解答: N\(\times\)M問題: MCPがなければ、\(N\) 個のエージェントフレームワークがそれぞれ \(M\) 個のツールと統合する必要があり、統合は合計 \(N \times M\) 個。新しいツール1つに \(N\) 実装が必要です。
MCPのN+M解決策: インターフェースを標準化する。各エージェントはMCPクライアントを1つ(合計 \(N\))、各ツールはMCPサーバーを1つ(合計 \(M\))実装する。統合は合計 \(N + M\) です。
具体例: MCPなしでは5フレームワーク(LangChain/AutoGen/CrewAI/Claude/独自)\(\times\)20ツール(GitHub/Slack/DB/ファイルシステムなど)=100統合。MCPなら5クライアント+20サーバー=25実装です。
重要な理由:
ツール再利用: ツールサーバーを一度作れば、MCP対応エージェントから利用できる。
エージェント可搬性: ツール統合を書き直さずClaudeから独自エージェントへ移行できる。
エコシステム成長: 新しいツール追加の障壁が下がり、コミュニティの開発を促す。
構成可能性: 実行時に複数サーバーを1つのエージェントへ動的接続できる。
類推: USBは周辺機器接続を標準化した。USB以前は機器ごとに独自コネクタが必要だったが、USB後は1ポートですべてに対応する。MCPはエージェントとツールの接続で同じことをする。
復習: 第20章(Model Context Protocol)。
Note
Q: MCPの4つの中核プリミティブとは何で、それぞれをいつ使いますか?
解答:
プリミティブ 方向 目的 例 ツール クライアント \(\to\) サーバー アクション実行 create_issue;query_dbリソース クライアント \(\to\) サーバー データ読み取り ファイル内容、DBレコード プロンプト クライアント \(\to\) サーバー テンプレート取得 「このPRを要約」テンプレート サンプリング サーバー \(\to\) クライアント LLM生成を要求 サーバーがLLMに分類を依頼 主な違い:
ツールとリソース: ツールには副作用(作成/変更/削除)があり、リソースは読み取り専用。安全性上、エージェントはリソースを自由に読めるが、ツールには承認が必要です。
サンプリング は方向を逆にする。通常はクライアント(エージェント)がサーバー(ツール)を呼ぶが、サンプリングではサーバーがクライアントのLLMに助けを求める。コード分析サーバーがコード片の解釈をLLMに依頼する場合など。
プロンプト は実行ではなくメタデータ(再利用可能なテンプレート)。エージェントがより良いツール呼び出しを作るのに役立つ。
復習: 第20章(Model Context Protocol)。
エージェント間通信(A2A)の問題
Note
Q: GoogleのA2AプロトコルはMCPとどう異なり、両方が必要なのはいつですか?
解答: 中核的な違い:
MCP: エージェント \(\leftrightarrow\) ツール(定義済みスキーマによる構造化関数呼び出し)
A2A: エージェント \(\leftrightarrow\) エージェント(不透明なタスク委譲。相手の動作方法は知らない)
A2Aの主要概念:
エージェントカード: エージェントの能力を記述するJSON(履歴書のようなもの)。発見機構。
不透明な実行: 依頼側は委譲先の内部推論を見ず、タスクを送り結果を受け取るだけ。
タスクライフサイクル: 送信 \(\to\) 実行中 \(\to\) 完了/失敗(SSEによるストリーミング更新付き)
両方が必要な場合:
オーケストレーターエージェントが A2A で「このトピックを調査して」と研究エージェントへ委譲する。
研究エージェントが MCP でウェブ検索、ファイル読み取り、データベースツールを呼ぶ。
結果がA2Aでオーケストレーターへ戻る。
アーキテクチャ: A2Aはエージェント間層、MCPはエージェントとツール層に位置する。完全なシステムは、エージェント間の調整にA2A、各エージェントのツールアクセスにMCPを使う。
復習: 第20章と第22章(MCP、エージェント間通信)。
Note
Q: Contract Net Protocolとは何で、LLMエージェントにどう適用しますか?
解答: Contract Net Protocol (CNP)は分散AIのタスク割り当て機構です。
手順:
告知: マネージャーが利用可能な全エージェントへタスク説明をブロードキャストする。
入札: エージェントが能力を評価し、入札(確信度、推定コスト、推定時間)を提出する。
落札: マネージャーが能力/コスト/可用性の基準で最良の入札を選ぶ。
実行: 落札エージェントがタスクを実行する。
報告: エージェントが結果をマネージャーへ返す。
LLMエージェントでは:
入札=自己評価: 各エージェントLLMが「このタスクをうまくできるか」を評価し、確信度を出す。較正された自己知識が必要。
専門化が創発: コードエージェントはコードタスク、研究エージェントは研究タスクに高く入札する。中央ルーティングロジックは不要。
負荷分散: あるエージェントが多忙(推定時間が長い)なら他が契約を得る。
障害処理: 落札エージェントが失敗したら残りへ再告知する(自動フェイルオーバー)。
LLMの限界: LLMは能力を過大評価しがち(確信度をハルシネーションする)。入札には自己申告の確信度だけでなく、類似タスクの過去成功率を含めるべきです。
復習: 第22章と第23章(A2A、マルチエージェントシステム)。
マルチエージェントシステムの問題
Note
Q: LLMの集中型と分散型マルチエージェントアーキテクチャを比較してください。
解答:
集中型(スーパーバイザー):
1つのオーケストレーターLLMが専門ワーカーへタスクをルーティングする。
制御フローが明確で、スーパーバイザーの判断を調べられるためデバッグしやすい。
単一障害点があり、スーパーバイザーがトークンのボトルネックになる。
適する場面: 明確なワークフロー、小規模なエージェントチーム(3〜5)。
分散型(ピアツーピア):
エージェントが直接通信し、中央コーディネーターがない。
耐障害性があり、水平スケールする。
創発的振る舞いのためデバッグが難しく、競合やデッドロックの可能性がある。
構造がなければ通信は \(O(n^2)\) で増える。
適する場面: 耐障害システム、大規模なエージェント集団、創発的振る舞いを望む創造的タスク。
ハイブリッド(階層型): サブマネージャーを持つ木構造。グループ内の局所自律性と上位の全体調整を両立し、通信は \(O(n \log n)\) で増える。
判断の枠組み: 予測可能性と監査可能性が必要なら集中型、耐障害性と創造性が必要なら分散型、大規模(\(>\)10エージェント)なら階層型を使う。
復習: 第23章(マルチエージェントシステム)。
Note
Q: CTDEとは何で、マルチエージェントLLMシステムの学習でなぜ重要ですか?
解答: CTDE=集中学習、分散実行です。
問題: マルチエージェントRLでは各エージェントの環境が非定常(他エージェントが同時に方策を変える)で、独立学習が不安定になる。
CTDEの解決策:
学習中: 集中クリティックが全エージェントの観察とアクションにアクセスする: \(V(s_1, s_2, \ldots, s_n, a_1, a_2, \ldots, a_n)\)。価値関数から非定常性を除き、学習を安定させる。
実行中: 各エージェントは自分の観察だけに基づき行動する: \(a_i = \pi_i(o_i)\)。推論時の通信オーバーヘッドがない。
LLMエージェントでは: 集中クリティックは全エージェントの合同出力を評価する報酬モデルにできる(例: チームが正しいソフトウェアシステムを作ったか)。各エージェントは反実仮想信用割当でチーム報酬への貢献を最大化するよう学習する。
実務上の課題: 完全なCTDEでは共有状態で全エージェントを同時学習するため、LLMでは高コスト。近似として、ラウンドごとにエージェントを学習(他を凍結)するか、定期同期付きの集団ベース学習を使う。
復習: 第23章(マルチエージェントシステム)。
エージェント開発フレームワークの問題
Note
Q: マルチエージェントシステム構築におけるLangGraph、AutoGen、CrewAIを比較してください。
解答:
観点 LangGraph AutoGen / CrewAI オーケストレーション 明示的状態グラフ(ノード+エッジ) 暗黙的(会話/役割ベース) 状態管理 TypedDictスキーマ、チェックポイント 会話履歴を状態にする マルチエージェント 条件ルーティング付きグラフ GroupChat/Crew デバッグ グラフ可視化、ステップ再生 チャットログ HITL 第一級(割り込みノード) 承認ツール経由 本番 LangGraph Cloud、永続化 限定的(AutoGen)、拡大中(CrewAI) 学習曲線 高い(グラフ概念) 低い(AutoGen)、非常に低い(CrewAI) LangGraphを選ぶ場面: 細粒度の制御、複雑な条件フロー、永続化とHuman-in-the-Loopを備えた本番デプロイが必要な場合。
AutoGenを選ぶ場面: マルチエージェント会話の高速プロトタイピング、コード実行エージェント、研究実験。
CrewAIを選ぶ場面: 単純な役割ベースチーム、逐次タスク実行、短時間のデモ、最小コード。
どれも選ばず独自実装する場面: 最大性能/制御が必要、フレームワークへのロックインを避けたい、または標準外のオーケストレーションパターンを使う場合。
復習: 第24章(エージェント開発フレームワーク)。
Note
Q: 本番のエージェントシステムをどうテスト・評価しますか?
解答: エージェントのテストは テストピラミッド に従います。
レベル1 — 単体テスト (高速、多数):
個別ツールを分離してテストする(LLMをモックし、ツールロジックを検証)
プロンプトテンプレートをテストする(コンテキストを与え、正しい構築を検証)
パーサーをテストする(LLM出力を与え、正しい抽出を検証)
レベル2 — 統合テスト (中速):
決定論的入力で完全なエージェントループをテストする
「ゴールデン軌跡」テスト: 再現できなければならない既知の正常実行トレース
ツールチェーンテスト: 複数ツールの系列が端から端まで機能することを検証
レベル3 — 振る舞いテスト (低速、少数):
エージェントは安全制約に従うか(敵対的入力)
適切な場合に明確化を求めるか
トークン/コスト予算内に収まるか
本番評価:
A/Bテスト: トラフィックの5%を新しいエージェント版へ送る
シャドーモード: 新旧エージェントを並行実行し、提供せず出力を比較する
LLM-as-judge: エージェント応答を自動品質採点する
ユーザー満足度: 高評価/低評価、タスク完了率、解決までの時間
主要指標: タスク成功率 (TSR)—人間の介入なしにエージェントが正しく完了したタスクの割合。
復習: 第14章と第24章(LLM評価、エージェント開発フレームワーク)。
エージェント型環境の問題
Note
Q: ウェブ閲覧エージェント環境の報酬関数を設計してください。
解答: WebArena型タスク(例: 「12月15日にNYCからSFへの最安航空便を探す」)では:
疎な報酬 (単純だが学習しにくい): \[ r = \begin{cases} 1 & \text{if final page/state matches ground truth} \\ 0 & \text{otherwise} \end{cases} \]
密な報酬 (学習には良いが設計が難しい):
進捗報酬: 目標に近づく各ページに \(+0.1\)(目標状態とのテキスト類似度で測定)
効率ペナルティ: アクションごとに \(-0.01\)(短い軌跡を促す)
マイルストーン報酬: 中間目標到達で \(+0.3\)(例: 航空便検索ページへ移動)
無効アクションペナルティ: エラーを起こすアクションに \(-0.05\)(404、フォーム検証失敗)
ポテンシャルベースのシェーピング (最適方策を維持): \[ r_{\text{shaped}}(s, a, s') = r(s, a, s') + \gamma \Phi(s') - \Phi(s) \] ここで \(\Phi(s) = -\text{min_steps_to_goal}(s)\)(ヒューリスティックまたは学習済み価値関数で推定)。
課題: 部分観測性(目標に近づいたか常に分かるわけではない)、確率的環境(ページ内容が変わる)、報酬ハッキング(報酬は満たすがユーザー意図を満たさない近道を見つける)。
復習: 第12章と第19章(LLMエージェント学習、エージェント型環境)。
Note
Q: SWE-benchを特に難しいエージェントベンチマークにしているものは何ですか?
解答: SWE-benchは人気のPythonリポジトリにある実際のGitHub Issueでエージェントをテストします。
難しい理由:
リポジトリ規模のコンテキスト: 10万行以上のコードベースを理解する必要がある。コンテキストウィンドウに収まらず、探索・検索・移動が必要。
不足仕様のタスク: Issueは暗黙のコンテキストを持つ人間の文章。エージェントは本当に必要なことを推測する必要がある。
複数ファイル編集: 解決策が連鎖依存を持つ複数ファイルにまたがることが多い。
テスト検証: 既存テストだけでなく、修正を検証する新しいテストにも合格する必要がある。
手助けがない: 単一関数のHumanEvalと異なり、Issueを読む \(\to\) コードを探索 \(\to\) バグを局所化 \(\to\) 修正を実装 \(\to\) 検証という完全なソフトウェア工学ワークフローが必要。
最先端の状況 (2024〜2025): 最良のエージェントはSWE-bench Verified(精選サブセット)の \(\sim\)50%、完全版SWE-benchの \(\sim\)30%を解く。
学習への重要な洞察: SWE-benchは「コーディング能力」(正しい関数を書く)と「ソフトウェア工学能力」(システムを理解し、コードベースを移動し、最小変更を行う)の差を明らかにする。SWE-bench型環境でのRLは、コード生成だけでなく探索・計画戦略を教える。
復習: 第19章(エージェント型環境とベンチマーク)。
エージェント型UIフレームワークの問題
Note
Q: エージェント向けのチャット型UIとキャンバス型UIのパラダイムを比較してください。
解答:
チャット型 (ChatGPT、Claudeのデフォルト):
線形メッセージストリーム: ユーザー \(\to\) アシスタント \(\to\) ユーザー \(\to\) …
利点: 馴染みのあるUX、探索とQ&Aに自然、実装が容易。
欠点: 生成アーティファクト(コード/文書)が会話に埋もれる。特定アーティファクトを反復しにくく、長い会話でコンテキストが失われる。
キャンバス/アーティファクト型 (Claude Artifacts、ChatGPT Canvas、Cursor):
サイドパネルに生成コンテンツ、チャットパネルに指示を表示。
エージェントが永続アーティファクトを作成、編集、反復できる。
利点: アーティファクトがチャットから独立して保持される。ユーザーが直接編集でき、バージョン履歴もある。
欠点: UIが複雑で、アーティファクト種別検出が必要。両パネルへのストリーミング実装も難しい。
使い分け:
チャット: ブレインストーミング、Q&A、短いタスク、モバイルUI。
キャンバス: コード生成、文書作成、データ分析など、反復が必要な永続出力を伴うタスク。
ハイブリッド (現代UIの多く): デフォルトはチャットで、コード/文書/可視化出力を検出したら自動的にキャンバスへ引き上げる。
エージェント学習では: UIパラダイムが報酬信号に影響する。キャンバスUIは明示的な編集フィードバック(ユーザーがアーティファクトを変更)を与え、オンライン学習に使える。
復習: 第25章(エージェント型UIフレームワーク)。
Note
Q: Human-in-the-Loopエージェントシステムの承認ゲートをどう設計しますか?
解答: 承認ゲートは重要な地点でエージェント実行を一時停止し、人間のレビューを受けます。
3段階モデル:
自動承認 (ゲートなし): 安全で取り消し可能なアクション。読み取り、検索、計算。
通知 (ソフトゲート): 影響はあり得るが回復可能。メール送信、下書き作成、ファイル変更。エージェントは進むが、ユーザーに通知し取り消せる。
ブロック (ハードゲート): 不可逆または高リスク。データ削除、送金、公開、副作用のあるコード実行。エージェントは明示承認を必ず待つ。
設計原則:
中断を最小化: ゲートが多すぎるとユーザーはエージェントを見放す。3段階モデルなら多くのアクションを流しつつ危険なものを捕捉できる。
コンテキストを表示: 承認ゲートで、何をするか、なぜか(エージェントの推論)、何が変わるか、どう取り消すかを表示する。
承認をまとめる: 5つのファイル書き込みが必要なら、1つずつでなくまとめて提示する。
タイムアウト処理: ユーザーが \(T\) 分以内に応答しなければ通知を再試行するか、安全なデフォルトで進むか、適切に中止する。
承認から学ぶ: 承認/拒否パターンを追跡する。常に承認されるアクション種別は自動承認へ昇格させることを検討する。
実装: ツールアノテーション(MCPの
destructiveHintとreadOnlyHint)でゲート割り当てを自動化する。コンテキストに基づく独自ルールで上書きできる。復習: 第17章と第25章(エージェントハーネス、エージェント型UIフレームワーク)。
RAGとエージェント型RAGの問題
Note
Q: Reciprocal Rank Fusion(RRF)と、ハイブリッド検索で機能する理由を説明してください。
解答: RRFはスコアの較正なしに複数検索システムの順位を組み合わせます。 \[ \text{RRF}(d) = \sum_{r \in R} \frac{1}{k + r(d)} \] ここで \(r(d)\) は文書 \(d\) の検索器 \(r\) における順位、\(k=60\) は上位文書の支配を防ぐ定数です。
機能する理由:
スコア正規化不要: BM25スコアは非有界、密ベクトル検索の類似度は \([-1, 1]\)。RRFは順位だけを使うため直接比較できる。
外れ値に頑健: 1位でも \(1/(k+1) \approx 0.016\) なので、1検索器の異常に高いスコアが支配しない。
相補的信号: BM25は正確なキーワード一致、密ベクトル検索は意味的類似を捉える。両方で上位の文書が強化される。
例: 文書 \(d\) がBM25で3位、密ベクトル検索で7位ならRRFスコアは \(= 1/(60+3) + 1/(60+7) = 0.0159 + 0.0149 = 0.0308\)。一方で片方が1位、他方が100位の文書は \(1/61 + 1/160 = 0.0226\) で、1位があっても低い。
実際には: ハイブリッド(BM25+密ベクトル検索+RRF)は、85%以上のベンチマークで単独方式を上回る。
復習: 第15章(検索拡張生成)。
Note
Q: エージェント型RAGとは何で、標準RAGとどう異なりますか?
解答: 標準RAG は固定パイプライン、クエリ \(\to\) 検索 \(\to\) 生成に従い、次の能力がない。
検索が必要かどうかを判断する
検索文書が十分か評価する
検索失敗時にクエリを再定式化する
複数検索ステップの情報を組み合わせる
エージェント型RAG は検索をエージェントのMDPにおけるアクションとして扱う。
検索するかの判断: エージェントが答えをすでに知っているか評価する(学習データ内の事実質問なら検索を省く)。
クエリ計画: 複雑な質問をサブクエリへ分解する(「Xは何年に起きたか」+「そのときの大統領は誰か」)。
自己評価: 検索後に関連性を採点し、不十分ならクエリを再定式化するか別ソースを試す。
マルチホップ推論: 検索 \(\to\) 推論 \(\to\) 知識ギャップ特定 \(\to\) 再検索
ソースルーティング: クエリを適切な知識ベースへ送る(時事はウェブ、社内情報は内部文書、プログラミングはコード検索)。
アーキテクチャ上の主な違い: 標準RAGは決定論的パイプライン、エージェント型RAGは条件遷移を持つ状態機械(retrieve/grade/rewrite/generateノードのLangGraphパターン)。
トレードオフ: エージェント型RAGは複雑なクエリで正確だが、ルーティング/採点の複数LLM呼び出しでレイテンシが増える。単純な事実検索には標準RAG、マルチホップや曖昧なクエリにはエージェント型RAGを使う。
復習: 第15章と第17章(RAG、エージェントハーネス)。
Note
Q: 検索品質改善におけるSelf-RAGとCRAGのアプローチを比較してください。
解答:
Self-RAG (Asaiら、2023):
特別なリフレクショントークンをLLM語彙に学習させる。
推論時、モデルは[Retrieve]、[IsRel]、[IsSup]、[IsUse]などのトークンを出力する。
モデルがいつ検索するかを決める(すべてのクエリに必要ではない)。
検索後、モデルが自己採点する。検索箇所は関連するか、解答はそこから導けるか。
学習: GPT-4のリフレクションラベルで拡張したデータをSFTする。
利点: 1つのモデルですべて処理。 欠点: 独自学習が必要。
CRAG (Corrective RAG、Yanら、2024):
軽量な検索評価器(別モデル)で検索文書を採点する。
確信度に応じて3アクション:
Correct(そのまま使う)、Ambiguous(ウェブ検索で補完)、Incorrect(破棄してウェブへフォールバック)。知識精錬ステップを加え、検索文書から関連文だけを抽出する。
利点: 任意の凍結LLMで動く。 欠点: 評価用の追加モデルとレイテンシが必要。
主な違い: Self-RAGは検索判断をLLM自身に埋め込む(学習が必要)。CRAGは任意のLLMを包むパイプライン方式(学習不要)。Self-RAGは洗練され、CRAGは既存モデルを使う本番に実用的です。
復習: 第15章(検索拡張生成)。
Note
Q: lost-in-the-middle問題とは何で、どう緩和しますか?
解答: 問題: 検索コンテキストが長い(多くの箇所がある)と、LLMはコンテキストの先頭と末尾に偏って注意を向け、中間の情報を無視する。10箇所中5番目に解答があると見落とす可能性がある。
経験的根拠: Liuら(2023)は、20文書検索で関連文書が1〜3位ではなく5〜15位にあると精度が15〜20%低下することを示した。
緩和戦略:
再ランキングと切り詰め: クロスエンコーダーで再順位付けし、最も関連する上位3箇所だけ含める(少ないほど問題が減る)。
戦略的順序付け: 関連度の高い箇所をコンテキストの先頭と末尾、低いものを中間に置く。
コンテキスト圧縮: 挿入前に各箇所を1〜2文へ要約する。テキストが少ないほど位置バイアスが小さい。
Map-reduce: 各箇所を独立処理(map)し、解答を結合(reduce)する。位置効果を完全に除く。
引用プロンプト: どの箇所を使ったか引用するよう求める。全箇所への注意を促す。
チャンクサイズ削減: チャンクを小さくすると、解答を覆うのに必要な総チャンク数が減る。
ベストプラクティス: 多く(20以上)検索し、上位3〜5に再ランキングし、関連度順(最良を先頭)にする。多くのユースケースで問題を回避できる。
復習: 第15章(検索拡張生成)。