Linear Probing
線形プロービングでは、凍結したモデルの特徴に線形分類器を学習させ、表現が何を符号化しているかを調べます。仕組み、コード、ファインチューニングとの比較について解説します。
線形プロービングは、凍結した特徴の上に線形分類器(プローブ)のみをトレーニングすることで、事前学習済みモデルの表現にどれだけ有用な情報が含まれているかを測定する手法です。エンコーダーの重みは一切変更されません。画像やテキストを一度だけ通し、得られた埋め込みを固定入力として、ロジスティック回帰または単一の全結合層でラベルを予測します。プローブの精度が高ければ、エンコーダーがすでに、クラスを直線的な境界で分離できるようにデータ例を配置していることを意味します。データ構造における同じ用語は、ハッシュテーブルの衝突を解決するため、次のスロットを確認する無関係な手法を指します。
線形プロービングの仕組み#
プローブ実験では、事前学習済みエンコーダーを読み込み、重みを凍結して、ラベル付きデータセットで特徴抽出を行い、保存した特徴を使って線形分類器をトレーニングします。結果は、学習に使っていないテストセットで評価します。プローブにはクラスごとに特徴1つにつき重みが1つと、バイアスがあるため、線形の決定境界しか描けず、独自の特徴を作ることはできません。したがって、達成した精度はエンコーダーが学習した内容を反映します。ロジスティック回帰はスコアにソフトマックスまたはシグモイドを適用しますが、決定境界は特徴空間上で線形のままです。トレーニングするのはプローブだけなので、特徴は一度計算すれば再利用でき、ファインチューニングより大幅に低コストでプロービングできます。
Ultralytics YOLO26の分類モデルは、model.embed()を通じて凍結した特徴を公開します。既定では、分類ヘッドの前の層の出力をプーリングし、画像ごとに1つのベクトルに変換します。nanoモデルでは256個の数値になります。次の例では、ImageNetでトレーニングされたモデルが見たことのない低解像度画像である、CIFAR-10の猫と犬の画像を使って特徴をプロービングし、比較のために生ピクセルでも同じプローブを学習します。
from pathlib import Path
import numpy as np
from PIL import Image
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from torchvision.datasets.utils import download_and_extract_archive
from ultralytics import YOLO
# 500 cat and 500 dog images from the CIFAR-10 test split
download_and_extract_archive("https://github.com/ultralytics/assets/releases/download/v0.0.0/cifar10.zip", "data")
cats = sorted(Path("data/cifar10/test/cat").glob("*.png"))[:500]
dogs = sorted(Path("data/cifar10/test/dog").glob("*.png"))[:500]
paths, labels = cats + dogs, [0] * 500 + [1] * 500
# Frozen YOLO26 classifier features, and raw pixels as a baseline representation
encoder = YOLO("yolo26n-cls.pt")
features = np.stack([encoder.embed(path, verbose=False)[0].cpu().numpy() for path in paths])
pixels = np.stack([np.asarray(Image.open(path)).ravel() / 255 for path in paths])
# Train the same linear probe on each representation and score it on held-out images
for name, x in [("raw pixels", pixels), ("YOLO26 features", features)]:
x_train, x_test, y_train, y_test = train_test_split(x, labels, test_size=0.3, random_state=0, stratify=labels)
probe = LogisticRegression(max_iter=5000)
probe.fit(x_train, y_train)
print(f"{name}: {probe.score(x_test, y_test):.3f}")プローブのスコアは生ピクセルでは0.573で、当てずっぽうの0.5をわずかに上回る程度ですが、YOLO26の特徴では0.833です。この差は、凍結したYOLO26エンコーダーがクラス情報を線形に取り出せる形でどれだけ保持しているかを示します。
プローブから分かること#
線形プローブは、情報が存在するかだけでなく、簡単に読み出せるかも検証します。Guillaume AlainとYoshua Bengioは、「Understanding Intermediate Layers Using Linear Classifier Probes」で線形分類器プローブを診断手法として提案し、調査したネットワークでは、特徴の線形分離可能性が層の深さとともに単調に増加することを見いだしました。この方法で各層をプロービングすれば、タスクに必要な概念がネットワークのどこで形成されるかが分かります。自己教師あり学習では、ラベルなしでトレーニングしたエンコーダーの比較に、ImageNet上の線形プローブ精度が標準的に使われるようになりました。プローブが表現にほとんど何も付け加えないため、弱い表現がプローブに頼る余地がほとんどないからです。自然言語処理では、言語モデルの隠れ状態でトレーニングしたプローブを使い、品詞、構文、文が真実かどうかといった特性をモデルが符号化しているかを検証します。
プローブの結果は、選択した層、入力解像度と前処理、ラベル付きデータの量、プローブの正則化、トレーニング画像と評価画像の分割に左右されます。そのため、これらすべての条件を固定しなければ、エンコーダー間の比較は成り立ちません。線形プローブが失敗しても、小規模な非線形プローブなら成功する場合があります。これは、情報は存在するものの、非線形に符号化されていることを示します。
線形プロービングと関連手法との比較#
- ファインチューニング: エンコーダーの重みの一部またはすべてをヘッドとともに更新するため、通常は対象データでより高い精度が得られます。「Fine-Tuning Can Distort Pretrained Features」では、10個のデータセットにおいて、ファインチューニングは線形プロービングより分布内精度が平均2%高かった一方、分布シフト下では精度が7%低くなりました。また、まず線形プロービングを行ってからそのヘッドを使ってファインチューニングするLP-FTは、完全なファインチューニングと比べ、分布内で1%、分布シフト下で10%上回りました。
- k近傍法による評価: トレーニングを一切行わず、テスト埋め込みごとに最も近いトレーニング埋め込みのラベルを使って分類します。自己教師ありエンコーダーによく使われるもう1つの評価プロトコルです。
- 特徴抽出と転移学習: 特徴抽出ではプローブが使う埋め込みを生成します。凍結したバックボーン上で線形ヘッドをトレーニングする方法は、最も低コストな転移学習です。PyTorchの転移学習チュートリアルでは、これをネットワークを固定特徴抽出器として使う方法と説明しています。
線形プロービングの限界#
線形プロービングで測定するのは情報の線形的な取り出しやすさであり、適応後の表現の有用性とは異なります。マスク付きオートエンコーダー(MAE)の著者らは、線形プロービングの結果とファインチューニングの結果にはほとんど相関がないことを見いだしました。彼らのViT-Lエンコーダーは、線形プロービングでImageNet精度73.5%を達成し、最後のTransformerブロックだけをファインチューニングすると81.0%に向上しました。一方、MoCo v3はMAEより高いプローブ結果を示しましたが、部分的なファインチューニング設定ではすべてMAEを下回りました。










