Meta Learning
メタ学習は、多数のタスクを通じてモデルを学習させ、少数の例から新しいタスクに適応できるようにします。エピソード、MAML、プロトタイプネットワークの仕組みを解説します。
「学習方法を学ぶ」とも呼ばれるメタラーニングは、新しいタスクに少数のラベル付きサンプルからすばやく適応できるよう、関連する多くのタスクにわたってモデルを学習させる機械学習(ML)の手法です。教師あり学習が1つのデータセットに適合するのに対し、メタラーニングは学習プロセス自体を最適化します。具体的には、初期重み、サンプルを比較するための埋め込み空間、または1回の順伝播でサンプルから学習するネットワークを最適化します。主な用途は、各クラスの1~数個のサンプルから新しいクラスを認識する少数ショット学習に加え、状況の変化に応じてその場で適応する必要があるロボットやその他のエージェントです。
メタラーニングの仕組み#
メタラーニングでは、モデルがテスト時に直面する状況を模したエピソードで学習します。各エピソードではタスクをサンプリングします。たとえば、1クラスにつきラベル付き画像を1枚ずつ使い、5クラスからなる5-way 1-shotの分類問題を構成します。ラベル付きサンプルがサポートセットを形成し、同じクラスの未使用サンプルがクエリセットを形成します。内側ループではモデルをサポートセットに適応させ、外側ループでは適応後のモデルがクエリセットでどれほど良好に動作したかに基づいてメタパラメーターを更新します。これにより、モデルは特定のタスクを記憶するのではなく、適切に適応することで報酬を得ます。メタテストに使うクラスは、メタトレーニング中には一度も登場しません。
主な手法#
- 最適化ベース: モデル非依存メタラーニング(MAML)は、新しいタスクのサポートセットで1回または数回の勾配降下を行うと良好な性能が得られる初期値を学習します。外側ループでは内側の更新を通じて微分するため、2次勾配が必要です。OpenAIのReptileなどの1次近似手法は、各タスクで適応した重みへ初期値を移動させることで、このコストを回避します。
- メトリックベース: サンプルを距離で分類できる埋め込み空間を学習する手法です。プロトタイプネットワークは、各クラスのサポート埋め込みの平均をプロトタイプとし、各クエリを最も近いプロトタイプに割り当てます。そのため、テスト時にクラスを追加しても再学習は不要です。
- モデルベース: 外部メモリを持つ再帰型ニューラルネットワーク(RNN)などのネットワークは、サポートセットを読み込み、クエリのラベルを直接予測します。活性化の中で適応手順を学習します。GPT-3の論文では、プロンプト内のサンプルからタスクを解く大規模言語モデル(LLM)のインコンテキスト学習を、この種のメタラーニングにおける内側ループと捉え、事前学習を外側ループと位置付けています。
MAML独自の回帰ベンチマークでは、小規模なネットワークに、ランダムな振幅と位相を持つ正弦波をそれぞれ10点からフィッティングさせます。次のPyTorchの例では、両方のループで初期値をメタトレーニングし、新しい正弦波に対して1回の適応ステップをテストします。
import torch
import torch.nn.functional as F
from torch import nn
from torch.func import functional_call
torch.manual_seed(0)
net = nn.Sequential(nn.Linear(1, 40), nn.ReLU(), nn.Linear(40, 40), nn.ReLU(), nn.Linear(40, 1))
meta_optimizer = torch.optim.Adam(net.parameters(), lr=0.001)
def sine_task_losses():
"""Sample a sine-wave task, adapt on 10 points with one gradient step, and return query losses before and after."""
amplitude, phase = torch.empty(1).uniform_(0.1, 5), torch.empty(1).uniform_(0, 3.14)
x = torch.empty(20, 1).uniform_(-5, 5)
y = amplitude * torch.sin(x + phase)
params = dict(net.named_parameters())
support_loss = F.mse_loss(functional_call(net, params, x[:10]), y[:10])
grads = torch.autograd.grad(support_loss, list(params.values()), create_graph=True) # inner loop
adapted = {name: p - 0.01 * g for (name, p), g in zip(params.items(), grads)}
before = F.mse_loss(functional_call(net, params, x[10:]), y[10:])
after = F.mse_loss(functional_call(net, adapted, x[10:]), y[10:])
return before, after
# Outer loop: update the shared initialization so that one inner step fits each new task
for step in range(10000):
meta_loss = sum(sine_task_losses()[1] for _ in range(4))
meta_optimizer.zero_grad()
meta_loss.backward()
meta_optimizer.step()
# On 500 unseen sine waves, compare query error before and after the one-step adaptation
losses = torch.tensor([[loss.item() for loss in sine_task_losses()] for _ in range(500)])
print(f"query MSE before adaptation: {losses[:, 0].mean():.2f}, after one step: {losses[:, 1].mean():.2f}")query MSE before adaptation: 3.10, after one step: 0.70が出力されます。メタラーニングで得た初期値は特定の正弦波にはフィットしていませんが、未知の波の10点で勾配ステップを1回行うだけで、新しい点での誤差が4分の1未満に減少します。
メタラーニングと関連用語の比較#
- 転移学習: 大規模なタスクで学習した重みを、適応性を最適化せずに別のタスクの初期値として再利用します。COCOで事前学習したUltralytics YOLO26検出器をカスタムデータセットでファインチューニングするのは転移学習です。初期重みはCOCOで通常のトレーニングを行って得られたもので、適応には少数のサンプルと数回の勾配ステップではなく、ラベル付きデータセットと多数のエポックを使います。
- 少数ショット学習: ごく少数のサンプルから学習する課題です。メタラーニングはその解決手法の一つであり、事前学習済みの埋め込みと単純な分類器を使う方法もあります。
- 自動機械学習(AutoML): 通常は一度に1つのデータセットを対象として、アーキテクチャやハイパーパラメーターを探索します。タスク間のハイパーパラメーター学習をメタラーニングに含める調査もあります。
- 継続学習: 以前のタスクを忘れずに一連のタスクを学習します。一方、メタラーニングは新しいタスクをすばやく学習できるようモデルを準備します。
ベンチマークと研究結果#
少数ショット画像ベンチマークは、メタ学習研究の大半を牽引しました。Omniglotには50のアルファベットからなる手書き文字が1,623個含まれ、miniImageNetはImageNetの100クラスを各600枚の画像で構成し、メタ学習、検証、テスト用に別々のクラスに分割しています。その後の2つの研究では、メタ学習自体がどれほど寄与するかが検討されました。「高速な学習か特徴の再利用か」は、MAMLの成功は主に外側ループで学習した特徴の再利用によることを示しました。また、内側ループで最終レイヤーのみを適応させる簡略版のANILは、MAMLと同等の性能を達成しました。続く「少数ショット画像分類の再考」では、メタ学習クラスを使った通常の教師あり学習または自己教師あり学習で得た良好な埋め込み上の線形分類器が、当時の主要な少数ショットメタ学習手法を上回ることが示されました。










