Semi-Supervised Learning
半教師あり学習は、少数のラベル付きサンプルと多数のラベルなしサンプルを使って学習し、ラベリングコストを削減します。疑似ラベリング、一貫性学習、コードを解説します。
半教師あり学習では、少量のラベル付き例と、それよりはるかに多いラベルなし例を使ってモデルを訓練し、ラベルだけでは得られない高い精度を目指します。教師あり学習ではすべての訓練例にラベルがありますが、教師なし学習ではラベルがありません。半教師あり学習はその中間に位置します。画像はカメラで低コストに収集できる一方、ボックスやマスクの描画、診断の記録などのデータラベリングには人手が必要で、多くの場合専門知識も求められるため、この手法はコンピュータービジョンに適しています。FixMatchは、クラスごとにラベル付き画像を4枚だけ使い、CIFAR-10画像ベンチマークで88.61%の精度を達成しました。Noisy Studentは、ラベルなし画像3億枚の疑似ラベルを追加し、ImageNetのTop-1精度を88.4%に向上させました。
半教師あり学習の仕組み#
ラベルなしデータが役立つのは、データ分布の形状が分かるためです。多くの手法では、密度の高い領域内で近接する例は同じラベルを持つと仮定し、クラス間の決定境界は例がほとんどない疎な領域を通るべきだと考えます。これを実現する手法は、大きく3つの系統に分かれます。
自己訓練とも呼ばれる疑似ラベリングでは、ラベル付きデータでモデルを訓練し、ラベルなしデータに適用して、信頼度のしきい値を超えた予測を追加の訓練データとして採用します。教師と生徒を使う方式では、訓練済みモデルを教師としてデータ群にラベルを付けます。教師と同等またはそれ以上の規模であることも多い生徒は、実際のラベルと疑似ラベルの両方で訓練され、次の教師になります。
一貫性正則化では、ラベルなし画像に異なる摂動を加えても、モデルが同じ予測を出すようにします。たとえば、同じ画像に異なるデータ拡張を適用します。FixMatchはこの2つの考え方を組み合わせています。弱い拡張を適用したビューに対して、モデルの信頼度が高い場合にのみ疑似ラベルを付け、同じ画像の強く拡張したビューに対してそのラベルを予測するようモデルを訓練します。グラフベースの手法では、類似する例をグラフでつなぎ、その辺に沿って既知のラベルを伝播させます。全体を通じた主なリスクは確証バイアスです。誤った疑似ラベルで訓練すると、モデルがそれをさらに高い信頼度で予測するようになります。そのため、高いしきい値、強いデータ拡張、または生徒の重みをゆっくり移動平均した教師が使われます。
このscikit-learnの例では、各数字について画像2枚分のラベルだけを残し、その20枚の画像で訓練した教師あり分類器と、グラフベースの手法であるラベル伝播を比較します。ラベル伝播では、ラベルなしの訓練画像1,237枚も利用します。
import numpy as np
from sklearn.datasets import load_digits
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.semi_supervised import LabelSpreading
X, y = load_digits(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X / 16, y, test_size=0.3, random_state=0, stratify=y)
# Keep the labels of only 2 training images per digit; -1 marks every other image as unlabeled
labeled = np.concatenate([np.flatnonzero(y_train == digit)[:2] for digit in range(10)])
y_partial = np.full_like(y_train, -1)
y_partial[labeled] = y_train[labeled]
# Supervised baseline trains on the 20 labeled images; label spreading also uses the unlabeled ones
supervised = LogisticRegression(max_iter=5000).fit(X_train[labeled], y_train[labeled])
semi_supervised = LabelSpreading(kernel="knn", n_neighbors=10).fit(X_train, y_partial)
print(f"Supervised, 20 labeled images: {supervised.score(X_test, y_test):.3f}")
print(f"Semi-supervised, 20 labeled + {(y_partial == -1).sum()} unlabeled: {semi_supervised.score(X_test, y_test):.3f}")評価用の数字540枚では、教師あり分類器のスコアが0.800、ラベル伝播のスコアが0.919でした。ラベルはどちらも同じ20個ですが、ラベルなし画像が各ラベル付き例を、同じ数字を表す多数の類似画像につなぐためです。
コンピュータービジョンにおける半教師あり学習#
教師・生徒型の疑似ラベリングは、ボックス、インスタンスセグメンテーションのマスク、深度マップなど、ラベル作成のコストが特に高いタスクにも適用できます。Unbiased Teacherなどの半教師あり物体検出手法は、教師モデルが生成した信頼度の高い疑似ボックスを保持します。Depth Anythingは、教師モデルが自動でラベル付けした約6,200万枚のラベルなし画像を使って、単眼深度推定モデルを学習しました。Ultralytics YOLO26の深度モデルも同じ方法で事前学習されました。深度の正解データがない1,281,167枚のImageNet学習画像にDepth Anything 3の教師モデルで疑似深度マップを付与し、実際の深度正解データセットも含む219万枚の混合データの約58%を構成しました。視覚言語モデルも教師として、クラス名だけから物体にラベルを付けることができます。VLM Leaderboardでは、実世界の検出データセットにどれほど正確にアノテーションするかを比較します。検出では、大型のYOLO26モデルを教師として使い、信頼度の高い予測をYOLO形式のラベルファイルに書き出すことで、シンプルな自動ラベリングを実現できます。
from ultralytics import YOLO
from ultralytics.utils import ASSETS
# 大規模な事前学習済みYOLO26モデルを教師として使用
teacher = YOLO("yolo26x.pt")
# ラベルのない画像フォルダーにラベルを付けます。信頼度が0.5を超える検出のみ、疑似ラベルとして採用します
# save_txt=Trueを指定すると、画像ごとにYOLO形式の.txtラベルファイルが1つ書き出され、生徒モデルの訓練にすぐ使えます
results = teacher.predict(source=ASSETS, conf=0.5, save_txt=True)半教師あり学習と関連用語#
- アクティブラーニング: 最も有益なラベルなし画像を選び、人間のアノテーターに送ります。半教師あり学習ではデータ群に自動でラベルを付け、多くのラベリングパイプラインで両方を組み合わせます。
- 自己教師あり学習: データから導いたターゲットを使い、ラベルなしデータのみで事前学習し、その後のファインチューニングで初めてラベルを使います。半教師あり学習では、同じ訓練実行でラベル付きデータとラベルなしデータの両方を使います。
- 転移学習: 別のデータセットで事前学習したモデルから始めます。事前学習済みモデルはより優れた初期教師となるため、半教師あり学習と組み合わせられます。
- 知識蒸留: 通常はモデルを圧縮するために、生徒を教師の出力に一致するよう訓練します。疑似ラベリングも同じ教師・生徒の構成を使って訓練データを追加します。Noisy Studentでは、訓練中にノイズを加えながら、教師と同等以上の規模の生徒を訓練しました。その結果、35億枚の弱ラベル付きInstagram画像で事前学習されていた従来最高のImageNetモデルを2.0%上回りました。










