Few-Shot Learning
少数ショット学習(FSL)は、メトリック学習、メタ学習、ファインチューニング、またはプロンプトを用いて、少数のラベル付きサンプルから新しいクラスを認識します。
Few-shot learning (FSL)は、新しいタスク、特に新しいクラスの認識を、各クラスあたりごく少数(通常1~10個)のラベル付きサンプルから学習する課題です。標準的な教師あり学習では、クラスごとに数百から数千枚のラベル付き画像が必要ですが、希少な欠陥や希少疾患、発売されたばかりの製品では、画像の収集に多大な費用がかかるか、収集自体が不可能です。Few-shot手法は、事前知識を活用してこの差を埋めます。関連性の高い大規模データで事前学習したモデルは、新しいクラスをうまく分離する特徴をすでに生成できるため、わずかなサンプルでクラスを定義できます。同じ考え方は言語モデルにも見られ、プロンプト内の少数の例によって、学習を行わずにモデルを新しいタスクへ導きます。
N-way K-shotタスク#
Few-shotの課題は、N-way K-shotとして表されます。これは、新しいNクラスそれぞれにK個のラベル付きサンプルがある設定です。これらのサンプルはサポートセットを構成し、モデルは同じNクラスからなる別のクエリセットのラベル付け性能で評価されます。したがって、5-way 1-shotタスクでは、モデルが未学習の5クラスについて各1つずつ例を与え、新しい画像をそのいずれかに分類させます。One-shot learningはK = 1の場合であり、zero-shot learningはK = 0の場合です。後者では、例の代わりにテキストや属性でクラスを説明します。研究ベンチマークでは、Omniglot(50種類のアルファベットからなる1,623個の手書き文字)や、ImageNetの100クラスを各600枚の画像で構成したminiImageNetなど、学習時に除外されたクラスで評価します。
Few-shot learningのアプローチ#
メトリック学習では、同じクラスのサンプルが互いに近くなるよう、画像を埋め込み空間に写像するネットワークを学習します。そのため、クエリには最も類似するサポートサンプルのラベルが割り当てられます。Prototypical networksは、各クラスのサポート埋め込みを平均してプロトタイプを作り、クエリを最も近いプロトタイプに割り当てます。新しいクラスが追加されても再学習は不要です。
その他のアプローチでは、モデルの重みや入力を適応させます。
- メタ学習: ベースクラスから作成した数千の小規模な模擬タスクで学習し、モデルに適応方法を習得させます。モデル非依存メタ学習 (MAML)は、新しいタスクのサポートセットで数回勾配を更新すると良好な重みが得られるような初期値を学習します。
- 転移とファインチューニング: 大規模データセットでバックボーンを事前学習し、その後、サポートセットを使って新しい分類ヘッドだけを学習するか、ネットワーク全体を低い学習率で学習します。このシンプルなベースラインは、標準的な少数ショットベンチマークで専用のメタ学習手法に匹敵します。また、大規模な事前学習済みモデルの線形プロービングも、強力な少数ショットのベースラインです。
- 基盤モデルへのプロンプト入力: 大規模言語モデルは、重みを更新せずに、プロンプトに含めた少数の例から新しいタスクを実行します。GPT-3は、20以上の言語ベンチマークでこの能力を示しました。ビジョンモデルも同様に、例示用のボックスなどのビジュアルプロンプトを利用します。
ビジュアルプロンプトによるFew-shot物体検出#
検出では、few-shotの課題に位置特定が加わります。モデルは、学習時に与えられていないクラスのすべてのインスタンスを見つける必要があります。YOLO26はYOLOE-26も支えています。これはオープンボキャブラリー版で、ビジュアルプロンプトエンコーダーが例示ボックスをクラス埋め込みに変換し、学習なしで新しい画像内の一致する物体を検出・セグメント化します。同じクラスIDを持つボックスは1つのプロンプトに統合されるため、あるクラスの例が2つあれば2-shotのサポートセットとして機能します。この例では、1枚の画像に写った2人をサポートセットとし、別の画像から該当する人物を探します。
import numpy as np
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEVPSegPredictor
# ビジュアルプロンプトに対応するYOLOE-26チェックポイント
model = YOLOE("yoloe-26s-seg.pt")
# サポートセット: 参照画像内の1クラス (人物) の例示ボックス2つ
boxes = np.array([[221.52, 405.8, 344.98, 857.54], [669.47, 392.19, 809.72, 877.04]])
support = {"bboxes": boxes, "cls": np.array([0, 0])}
# クエリ: 学習なしで、別の画像から例に似た物体を見つける
results = model.predict(
"https://ultralytics.com/images/zidane.jpg",
refer_image="https://ultralytics.com/images/bus.jpg",
visual_prompts=support,
predictor=YOLOEVPSegPredictor,
)
result = results[0]
result.save(filename="few_shot_result.jpg")ビジュアルプロンプトは名前を付けずに例をまとめるため、結果の一致箇所には、クラスIDごとに1つの名前としてobject0、object1などのラベルが付きます。
実際のアプリケーション#
- 製造検査: 新しく導入された部品の亀裂など、新しい欠陥の種類は、検査担当者が検出対象にしようとするまで数回しか現れないことがあります。few-shot検出や異常検知を使えば、大規模な新規データセットなしで検出対象に追加できます。
- 医用画像: 希少疾患では注釈付きスキャンが少ないため、医用画像解析モデルは、専門家がラベル付けした少数の症例から得た新しい所見に、事前学習済みの特徴を適応させます。
- 小売とロボティクス: 店舗では新商品が追加され、ロボットは常に新しい物体に遭遇します。少数の参照写真があれば、システムは棚やグリッパー内の物体を認識できます。
Few-shot learningと関連概念の比較#
- 転移学習: あるタスクの知識を別のタスクに再利用する、より広範な手法です。few-shot learningはデータが極端に少ない場合であり、転移学習はその最も一般的な手段です。
- メタ学習: 学び方を学習するトレーニング戦略であり、few-shotの課題を解決する複数の方法の1つです。few-shot learningは課題そのものの設定を指します。
- Few-shotプロンプティング: 推論時に入力へ例を含めることで、凍結されたモデルを適応させます。一方、few-shotファインチューニングは、同じ少数の例を使ってモデルの重みを変更します。










