← 機械学習テキスト 一覧

🎓 レベル:基礎 | 重要度:A(必須)

📎 前提:LLMの全体像

要点(BLUF)


In-context learning(ICL)とは

ICL は、推論時にモデルに渡す文脈(context)の中で、その場でタスクを学んだかのように振る舞わせる仕組みです。GPT-3 の論文(Brown et al., 2020)で体系的に示されました。

ポイントは 「重み(パラメータ)を一切変えない」 こと。ファインチューニング(ファインチューニング)が勾配降下で重み θ\theta を書き換えるのに対し、ICL は学習済みモデルをそのまま使い、プロンプトという入力だけで出力の傾向を変えます。

形式的には、LLM は次トークンの条件付き分布

pθ(出力プロンプト)p_\theta(\text{出力} \mid \text{プロンプト})

を計算しているだけです。ICL は θ\theta を固定したまま、条件にあたる「プロンプト」を工夫して、欲しい出力が出やすい条件を作る行為だと言えます。要するに、学習させるのではなく「問いの立て方で答えを引き出す」 ということです。

zero / one / few-shot の違い

プロンプトの中に**例(demonstration、入力と出力のペア)**をいくつ入れるかで呼び分けます。

呼び方プロンプトに入れる例の数イメージ
zero-shot0 個(タスクの指示だけ)「次の文を英訳して:…」
one-shot1 個1 組の手本+本番 1 問
few-shot数個〜文脈に収まる範囲数組の手本+本番 1 問

few-shot は「文脈窓(context window)に収まる範囲なら何個でも」入れられますが、いくらでも増やせば良いわけではありません(後述)。

⚠️ ICL ≠ 学習:few-shot で例を見せても、その例はモデルの重みに残りません。会話/リクエストが終われば何も覚えていません。 恒久的に挙動を変えたいなら ファインチューニング が必要です。ここが両者の根本的な違いです。

flowchart TB
    subgraph Prompt["プロンプト(推論時の入力。重みは固定)"]
        E1["例1:入力A → 出力a"]
        E2["例2:入力B → 出力b"]
        E3["例3:入力C → 出力c"]
        Q["新しい入力X → ?"]
    end
    Prompt --> LLM["LLM(パラメータθは更新しない)"]
    LLM --> OUT["出力x(例のパターンに倣って生成)"]

上の図は few-shot ICL の構造です。プロンプト内の例 →新しい入力 →出力 という流れで、モデルは例の「形式・ラベル空間・入力の分布」を手がかりに、新しい入力にも同じパターンを当てはめます。


なぜ ICL は効くのか(理論は研究途上・要最新確認)

正直に言うと、なぜ重み更新なしで「学習したように」振る舞えるのか、決定的な理論はまだ確立していません。 有力な見方が複数あり、活発に議論されています(要最新確認)。代表的な 2 つを挙げます。

  1. 暗黙のベイズ推論という見方:事前学習で多様な「タスク」を含むデータを学んだ結果、モデルは内部に潜在的なタスク(概念)の分布を持つ。プロンプト内の例はその潜在タスクを事後的に絞り込む条件として働き、例が増えるほどベイズ最適な予測に近づく、という説明です(Xie et al., 2021 ほか)。要するに、プロンプトが「どのタスクをやってほしいか」の事後分布を条件付けるという見方です。
  2. 順伝播が暗黙の勾配降下に相当するという見方:Transformer の自己注意(LLMの全体像)の順伝播そのものが、例に対する勾配降下に似た更新を内部で実行している、という解釈です(Transformer をメタ最適化器とみなす)。

ただしこの「勾配降下」説には反例も出ています。注意機構を使わない状態空間モデル(Mamba など)も ICL が得意ですが、その順伝播は素直に勾配計算に分解できません。したがって単一の説明では片付かず、現時点では“複数の見方が併存する未解決問題”と理解しておくのが安全です。


Chain-of-Thought(CoT):段階的に考えさせる

CoT は、答えだけでなく「途中の推論ステップ」を出力させるプロンプト技法です(Wei et al., 2022)。few-shot の手本を「入力 →答え」ではなく「入力 →考える過程 →答え」にする、あるいは zero-shot で

「Let’s think step by step(順を追って考えよう)」

の一言を添えるだけ(zero-shot CoT、Kojima et al., 2022)でも、算術・常識・記号推論などの精度が大きく上がることが報告されています。

flowchart LR
    subgraph A["CoTなし"]
        Qa["問題"] --> Da["即答"] --> Wa["答え(間違えやすい)"]
    end
    subgraph B["CoTあり"]
        Qb["問題"] --> S1["ステップ1"] --> S2["ステップ2"] --> S3["ステップ3"] --> Wb["答え(精度↑)"]
    end

なぜ CoT は効くのか

直観は 「逐次計算の余地を与える」 ことです。

また CoT は 創発的能力(emergent ability) とされ、ある程度大きいモデルでのみ安定して効果が出る、という観察があります(小さいモデルでは逆に下がることもある)。ただし「どの規模から」「どの程度効くか」はモデルと評価の仕方に強く依存し、解釈にも議論があります(要最新確認)


self-consistency など発展技法(要最新確認)

CoT を強化する代表が self-consistency(Wang et al., 2022)です。

この系統には自動で推論経路を作る手法、検証器を組み合わせる手法など多数の派生があります。ただし このあたりは最も動きが速い領域で、推論特化モデル(“考えてから答える”系)の普及で前提自体が変わりつつあります。個別技法はモデル世代に依存するため、必ず最新の一次情報を確認してください(要最新確認)。


プロンプト設計の基本(廃れにくい原則)

具体的な「効くフレーズ」はモデルごとに変わりますが、土台になる原則は比較的安定しています。

  1. 明確で具体的な指示:何を・どんな形式で・どんな制約で出すかを曖昧にしない。
  2. 例を見せる(few-shot):言葉で説明しづらいタスクは、入出力の手本を数個示すのが速い。例の形式・ラベルの種類・入力の分布を本番に合わせる。
  3. 役割や文脈の付与:立場や前提(誰として・何のために)を与えると出力が安定することがある。
  4. 段階的に考えさせる(CoT):推論を要する課題では途中過程を出させる。
  5. 出力形式の固定:JSON など決まった形を要求すると後段の処理が安定する。

要するに、「曖昧さを減らし、欲しい出力が出やすい条件を作る」 のが共通原理です。個別の言い回しよりこの原理を押さえるほうが長持ちします。


⚠️ よくある誤解・落とし穴


関連ノート