In-Context Learning(ICL)は、大規模言語モデル(LLM)が示す驚くべき能力の1つです。モデルのパラメータを更新することなく、プロンプトに含まれる例からタスクを「学習」し、新しい入力に対して適切な出力を生成します。
本記事では、In-Context Learningの概念、理論的背景、なぜICLが機能するのかについての研究知見、そして実践的な応用について解説します。
本記事の内容
- In-Context Learningの定義と特徴
- Few-shot学習との関係
- ICLの理論的解釈
- ICLが機能する条件と要因
- 実験による検証と知見
- 実践的な応用
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
In-Context Learningとは
定義
In-Context Learning(ICL)は、事前学習済み言語モデルが、入力コンテキストに含まれる例(demonstrations)からタスクのパターンを理解し、新しい入力に対して適切な出力を生成する能力です。
重要な特徴: – パラメータの更新なし(推論時のみで完結) – 例はプロンプトの一部として与えられる – モデルスケールが大きいほど能力が顕著
数式による定義
入力 $x$、出力 $y$、デモンストレーション(例)を $D = \{(x_1, y_1), \ldots, (x_k, y_k)\}$ とすると、ICLは以下のように定式化されます。
$$ \hat{y} = \arg\max_y P(y \mid D, x; \theta) $$
ここで $\theta$ は固定された事前学習済みパラメータです。
通常の教師あり学習との違い:
教師あり学習: $$ \theta^* = \arg\min_\theta \mathcal{L}(D; \theta) $$ $$ \hat{y} = f(x; \theta^*) $$
In-Context Learning: $$ \hat{y} = f(D \oplus x; \theta) $$
ここで $\oplus$ はコンテキストの連結を表します。
例: 感情分類
デモンストレーション:
"素晴らしい映画だった" -> ポジティブ
"最悪の体験だった" -> ネガティブ
"普通だった" -> ニュートラル
新しい入力:
"とても楽しかった" -> ?
期待される出力: ポジティブ
モデルはデモンストレーションから「感情分類タスク」であること、および各感情クラスの特徴を「理解」し、新しい入力を分類します。
ICLとFew-shot学習の違い
従来のFew-shot学習
従来のFew-shot学習(メタ学習など)では、少数の例からパラメータを更新してタスクに適応します。
$$ \theta’ = \theta – \alpha \nabla_\theta \mathcal{L}(D; \theta) $$
In-Context Learning
ICLでは、パラメータは固定のまま、コンテキストとして例を活用します。
利点: – 勾配計算が不要 – 推論のみで実行可能 – タスク切り替えが瞬時
欠点: – コンテキスト長の制限 – 例の選択・順序に敏感 – 安定性が低い場合がある
ICLの理論的解釈
仮説1: 暗黙的なベイズ推論
ICLは暗黙的なベイズ推論として解釈できます。
$$ P(y \mid D, x) \propto P(D \mid y, x) P(y \mid x) $$
デモンストレーション $D$ は、タスクの事後分布を形成するための「観測データ」として機能します。
仮説2: 暗黙的な勾配降下
研究によると、Transformerの順伝播は、暗黙的に勾配降下と等価な計算を行っている可能性があります。
Attentionの計算: $$ \text{Attention}(\bm{Q}, \bm{K}, \bm{V}) = \text{softmax}\left(\frac{\bm{Q}\bm{K}^T}{\sqrt{d}}\right)\bm{V} $$
これは、最小二乗法の解(正規方程式)と形式的に類似しています: $$ \bm{W}^* = (\bm{X}^T\bm{X})^{-1}\bm{X}^T\bm{Y} $$
仮説3: タスクの識別
ICLは、デモンストレーションから「どのタスクを実行すべきか」を識別し、事前学習で獲得した該当タスクの能力を発動させていると解釈できます。
$$ P(y \mid D, x) = \sum_{\tau} P(y \mid x, \tau) P(\tau \mid D) $$
ここで $\tau$ は潜在的なタスク変数です。
ICLが機能する条件
モデルスケール
ICL能力は、モデルの規模に強く依存します(emergent ability)。
| パラメータ数 | ICL能力 |
|---|---|
| ~100M | ほぼなし |
| ~1B | 一部のタスクで出現 |
| ~10B | 多くのタスクで有効 |
| ~100B+ | 複雑なタスクも可能 |
事前学習データ
事前学習データに類似したパターンが含まれている場合、ICLは効果的に機能します。
デモンストレーションの特性
1. 例の数
一般的に、例が多いほど性能は向上しますが、収穫逓減が見られます。
2. 例の多様性
異なるパターンをカバーする多様な例が有効です。
3. 例の品質
ノイズの多い例や誤ったラベルは、性能を低下させます。
4. 例の順序
例の順序が結果に影響することがあります(order sensitivity)。
興味深い研究結果
ラベルの重要性
驚くべきことに、いくつかの研究では、デモンストレーションのラベルがランダムでも、一定の性能が得られることが報告されています。
実験:
正しいラベル: "素晴らしい" -> ポジティブ
ランダムラベル: "素晴らしい" -> ネガティブ (誤り)
結果: ランダムラベルでも、性能低下は限定的
解釈: – ICLは入力の形式を学習している – タスクの「種類」を識別している – 事前学習で獲得した知識を活用している
入力分布の重要性
入力テキストの分布(スタイル、トピック)は、ラベルよりも重要な場合があります。
セマンティック・プライアとの関係
モデルが事前学習で獲得した「意味的な先入観」(semantic priors)が、ICLの挙動に影響します。
ICLの数学的モデル
線形回帰としてのICL
簡単な設定として、Transformerが線形回帰をICLで解く場合を考えます。
デモンストレーション: $D = \{(\bm{x}_i, y_i)\}_{i=1}^k$ ここで $y_i = \bm{w}^* \cdot \bm{x}_i + \epsilon_i$
ICLによる予測: $$ \hat{y} = \bm{W}_V \cdot \text{softmax}\left(\frac{\bm{W}_Q \bm{x} \cdot (\bm{W}_K \bm{X})^T}{\sqrt{d}}\right) \cdot \bm{Y} $$
特定の条件下で、これは以下と等価になります: $$ \hat{y} \approx (\bm{X}^T\bm{X})^{-1}\bm{X}^T\bm{Y} \cdot \bm{x} $$
つまり、最小二乗法の解に相当する予測を行います。
勾配降下との対応
1層のTransformerが、1ステップの勾配降下と等価な計算を行えることが示されています。
$$ \bm{W}’ = \bm{W} – \eta \nabla_{\bm{W}} \mathcal{L} $$
深いTransformerは、複数ステップの勾配降下に対応すると考えられます。
実践的な応用
効果的なデモンストレーションの選択
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
def select_demonstrations(query, examples, embeddings, k=5):
"""
クエリに類似した例を選択
Args:
query: 新しい入力
examples: 候補となる例のリスト
embeddings: 例の埋め込みベクトル
k: 選択する例の数
Returns:
選択された例
"""
query_emb = get_embedding(query)
similarities = cosine_similarity([query_emb], embeddings)[0]
top_k_indices = np.argsort(similarities)[-k:][::-1]
return [examples[i] for i in top_k_indices]
def construct_icl_prompt(demonstrations, query, template):
"""
ICL用のプロンプトを構築
Args:
demonstrations: 選択された例 [(input, output), ...]
query: 新しい入力
template: プロンプトテンプレート
Returns:
完成したプロンプト
"""
demo_str = "\n".join([
f"入力: {inp}\n出力: {out}"
for inp, out in demonstrations
])
return template.format(demonstrations=demo_str, query=query)
例の順序の最適化
import itertools
def optimize_demonstration_order(demonstrations, query, model, metric_fn):
"""
デモンストレーションの最適な順序を探索
Args:
demonstrations: 例のリスト
query: テスト入力
model: LLM
metric_fn: 評価関数
Returns:
最適な順序の例
"""
best_order = None
best_score = float('-inf')
# 全順列を試す(例が少ない場合のみ実用的)
for perm in itertools.permutations(demonstrations):
prompt = construct_prompt(perm, query)
output = model.generate(prompt)
score = metric_fn(output)
if score > best_score:
best_score = score
best_order = perm
return best_order
キャリブレーション
ICLの出力確率をキャリブレーションすることで、バイアスを軽減できます。
def calibrate_icl(model, demonstrations, query, labels):
"""
コンテンツフリーな入力でキャリブレーション
Args:
model: LLM
demonstrations: 例
query: 実際の入力
labels: 可能なラベル
Returns:
キャリブレーション済みの確率
"""
# 実際のクエリでの確率
real_probs = get_label_probs(model, demonstrations, query, labels)
# コンテンツフリー入力(例: "N/A")での確率
content_free_probs = get_label_probs(model, demonstrations, "N/A", labels)
# キャリブレーション: 事前バイアスを除去
calibrated_probs = real_probs / content_free_probs
calibrated_probs = calibrated_probs / calibrated_probs.sum()
return calibrated_probs
ICLの限界と課題
1. コンテキスト長の制限
デモンストレーションはコンテキストウィンドウ内に収める必要があります。
2. 例の選択への敏感性
異なる例を選ぶと、結果が大きく変わることがあります。
3. 順序への敏感性
例の順序によって結果が変わることがあり、再現性に影響します。
4. 事前学習データへの依存
事前学習データにないパターンは学習しにくいです。
5. 説明可能性
ICLが「なぜ」機能するのか、完全には解明されていません。
ICLとファインチューニングの比較
| 観点 | ICL | ファインチューニング |
|---|---|---|
| パラメータ更新 | なし | あり |
| 計算コスト | 推論のみ | 学習が必要 |
| データ効率 | 数例で可能 | より多くのデータが必要 |
| タスク切り替え | 即時 | 再学習が必要 |
| 性能上限 | やや低い | 高い |
| 安定性 | 例に敏感 | より安定 |
まとめ
本記事では、In-Context Learning(ICL)について解説しました。
- ICLの定義: パラメータを更新せず、コンテキスト内の例からタスクを学習する能力
- 理論的解釈: 暗黙的なベイズ推論、暗黙的な勾配降下、タスク識別など
- 機能条件: モデルスケール、事前学習データ、デモンストレーションの特性
- 興味深い発見: ラベルよりも入力分布が重要な場合がある
- 実践的応用: 類似例の選択、順序の最適化、キャリブレーション
ICLは、LLMの最も興味深い能力の1つであり、その完全な理解は依然として研究課題です。しかし、実践的には強力なツールとして活用できます。
次のステップとして、以下の記事も参考にしてください。