自己訓練(self-training)と擬似ラベル — 半教師あり学習の理論と確証バイアスの罠

ラベル付きデータを集めるのは高くつきます。専門家が一つ一つ正解を付ける必要がある医療画像や、運用履歴の少ない新しいシステムでは、ラベルはごくわずかしか手に入りません。一方、ラベルのないデータなら大量にある——この状況は珍しくありません。

そこで「少数のラベルありデータと、大量のラベルなしデータを組み合わせて学習する」のが半教師あり学習であり、その最も素朴で強力な手法が 自己訓練(self-training)擬似ラベル(pseudo-labeling) です。アイデアはシンプルで、「自分(モデル)の予測を仮の正解(擬似ラベル)として、自分で自分を教える」というもの。本記事では、その仕組み・効く理由・そして陥りがちな確証バイアスの罠までを、図と実装で解説します。

具体的には次の問いに答えます。

  • 問い1: ラベルのないデータを、どうやって学習に役立てるのか?
  • 問い2: 「自分の予測で自分を教える」と、なぜ間違いが暴走しないのか(あるいは暴走するのか)?

自己訓練は、最近の時系列・異常検知の研究でも、ラベルの乏しいターゲットへモデルを適応させる学習ループの骨格として使われています。

機械学習は、すべてのデータにラベルがある教師あり学習と、ラベルが一切ない教師なし学習に大別されますが、その中間が半教師あり学習です。現実には「少しはラベルがあるが、全部に付けるのは無理」という状況が圧倒的に多く、半教師あり学習の実用価値は高いのです。自己訓練はその中でも、既存の教師あり学習器をそのまま使える手軽さから、最初に試す価値のある手法です。

自己訓練の概念

全体像は図の通りです。少数のラベルありデータでモデルを作り、それで大量のラベルなしデータに「擬似ラベル」を付け、両方を合わせて再学習する——これが自己訓練です。

前提知識

この記事は教師あり学習の基礎を前提にします。関連して以下も参考になります。

自己訓練の仕組み

自己訓練は、次のループを繰り返すだけのシンプルな手法です。

自己訓練のループ

図の4ステップです。①ラベルありデータでモデルを学習し、②ラベルなしデータを予測、③そのうち確信度の高い予測を擬似ラベルとして採用し、④擬似ラベル付きデータを訓練集合に加えて①に戻ります。反復するたびに、モデルが自信を持って予測できる領域が広がっていきます。

ポイントは③の「確信度の高いものだけ採用する」という選別です。

確信度しきい値

図のように、予測の確信度(最大クラスの確率)がしきい値(例:0.9)を超えたものだけを擬似ラベルにします。確信のない予測まで採用すると誤りが混ざるため、「確実なものから少しずつ」が鉄則です。

擬似ラベルの形式とエントロピー最小化

擬似ラベルには2種類あります。確信度最大のクラスを1とするハードラベル($\hat{y} = \arg\max_k p_k$)と、予測確率分布そのものを使うソフトラベルです。

ハードラベルで学習することには、実は深い意味があります。それはエントロピー最小化と同じ効果を持つ、ということです。モデルに自分の予測(とがった分布)を正解として学習させると、予測分布のエントロピー $-\sum_k p_k \log p_k$ を小さくする——つまり「どのデータに対しても自信を持って予測する」方向に学習が進みます。確信を持てる状態とは、決定境界から遠いということ。結果として、決定境界がデータの低密度領域(クラスタの隙間)へ押しやられます。これが、次に述べるクラスタ仮定のもとで自己訓練が効く、もう一つの見方です。

なぜ効くのか — クラスタ仮定

「自分の予測で自分を教えて、本当に良くなるの?」という疑問は当然です。自己訓練が効く理由は、クラスタ仮定(cluster assumption)にあります。

半教師あり学習の前提

クラスタ仮定とは「同じクラスタ(データの塊)に属する点は同じクラスである」という仮定です(図左)。これが成り立つなら、ラベルなしデータは「クラスタの形」を教えてくれます。ラベルありデータが少数でも、ラベルなしデータが密集している領域の境界を避けるように決定境界を引けば、正しい分類に近づきます。関連して「データは低次元の多様体上に分布する」という多様体仮定(図右)もあり、どちらも「ラベルなしデータが分布の構造を教える」という発想です。

自己訓練では、確信度の高い擬似ラベルが「クラスタの中心付近」から付き、それが徐々にクラスタの縁へ広がることで、決定境界がデータの低密度領域(クラスタの隙間)へ移動します。これがうまくいけば、ラベルなしデータだけで境界が改善するのです。

逆に、クラスタ仮定が成り立たない——クラスの境界が高密度領域を横切る——場合、自己訓練はかえって有害になります。境界付近の擬似ラベルが誤りやすく、それを学習して境界がさらにずれるためです。自己訓練を使う前に「データがクラスごとに塊を作っているか」を確認することが、成否を分ける第一歩です。

確証バイアスの罠

しかし、自己訓練は諸刃の剣です。最大の危険が 確証バイアス(confirmation bias) です。

確証バイアスの罠

図のように、モデルが誤った予測を高い確信度で出してしまうと、その誤りが擬似ラベルとして採用され、再学習でその誤りを「正解」として強化し、さらに自信を深める……という悪循環に陥ります。一度間違った方向に転がり始めると、自己訓練はそれを加速させてしまうのです。

数理的に見ると、擬似ラベルを使った学習は「モデル自身の予測分布を目標にする」自己参照的な最適化です。初期モデルが正しければ正のフィードバックで改善しますが、初期が誤っていれば誤りを目標に学習し続け、誤差が増幅されます。この最適化が収束する固定点は「正解」とは限らず、「自信のある誤り」にもなりうる——これが確証バイアスの本質です。だからこそ、初期モデルの質と、誤りの混入を防ぐ仕組みが決定的に重要になります。

これは実際に起きます。後の実装で、ラベルを各クラス3点にした場合は精度がわずかに改善(0.807→0.812)しましたが、各クラス2点まで減らすと、初期境界の歪みが擬似ラベルで増幅され、精度が0.84から0.18へ崩壊しました。ラベルが少なく初期モデルが不正確なほど、確証バイアスのリスクが高まります。

安定化の工夫

確証バイアスを避けるため、実務では次の工夫を組み合わせます。

  • 高いしきい値: 確信度が非常に高い予測だけを採用し、誤った擬似ラベルの混入を防ぐ。
  • 段階的な追加(curriculum): 一度に全部ではなく、最も確実な少数の点から少しずつ追加し、各段階でモデルを安定させる。
  • 整合性正則化(consistency regularization): 同じ入力に小さなノイズを加えても予測が変わらないよう促す。確信度だけに頼らず、予測の「頑健さ」を要求する。
  • 早期終了: 検証性能が悪化し始めたら止める。

これらは、論文レベルの自己訓練フレームワークでも標準的に使われる安全装置です。

Noisy Student

自己訓練を大規模に成功させた代表例が Noisy Student です。

Noisy Student

図のように、教師モデルがラベルなしデータに擬似ラベルを付け、生徒モデルがそれを学習します。鍵は、生徒の学習時にノイズ(データ拡張・Dropout・確率的深さなど)を加えることです。ノイズの中でも正しく予測できるよう鍛えられた生徒は、教師より頑健で高精度になります。そして生徒を次の教師にして繰り返すことで、性能を押し上げていきます。「ノイズを乗り越える」ことが整合性正則化と同じ効果を生み、確証バイアスを抑えるのです。

整合性正則化とFixMatch

整合性正則化をさらに推し進めたのが FixMatch などの手法です。同じ入力に対し、弱いデータ拡張を加えた版で擬似ラベルを作り、強いデータ拡張を加えた版でその擬似ラベルを予測させます。「どんな変形を加えても同じ予測になるべき」という整合性を強制するわけです。確信度の高い擬似ラベルだけを使う点は自己訓練と同じですが、データ拡張による整合性を組み合わせることで、確証バイアスを抑えつつ強力に学習します。画像分類では、1クラス数枚というごくわずかなラベルで、教師あり学習に迫る精度を達成しています。

このように現代の半教師あり学習は、「擬似ラベル(自己訓練)」と「整合性正則化」という2本柱を組み合わせる方向に進化しています。素朴な自己訓練はその原点であり、両者の関係を理解する出発点になります。

Pythonで実装する

2つの三日月形データ(make_moons)で、ラベルを各クラス3点だけにした半教師あり設定を作り、自己訓練を実装します。

import numpy as np
from sklearn.datasets import make_moons
from sklearn.svm import SVC

X, y = make_moons(n_samples=400, noise=0.18, random_state=0)
rng = np.random.default_rng(1)

# ラベルあり: 各クラス3点だけ
lab_idx = []
for cls in [0, 1]:
    idx = np.where(y == cls)[0]
    lab_idx += list(rng.choice(idx, 3, replace=False))
lab_idx = np.array(lab_idx)
unlab_idx = np.array([i for i in range(len(y)) if i not in lab_idx])
X_test, y_test = make_moons(n_samples=400, noise=0.18, random_state=99)

確信度の高い予測を段階的に擬似ラベル化していきます(curriculum)。

X_tr, y_tr = X[lab_idx].copy(), y[lab_idx].copy()
remain = list(unlab_idx)

# 初期(ラベルありのみ)
acc0 = SVC(gamma=0.2).fit(X[lab_idx], y[lab_idx]).score(X_test, y_test)

for _ in range(10):
    m = SVC(probability=True, gamma=0.2).fit(X_tr, y_tr)
    if not remain:
        break
    proba = m.predict_proba(X[remain])
    conf, pred = proba.max(1), proba.argmax(1)
    order = np.argsort(-conf)
    take = [int(o) for o in order[:5] if conf[o] > 0.7]   # 最確信の上位5点ずつ
    if not take:
        break
    add = [remain[i] for i in take]
    X_tr = np.vstack([X_tr, X[add]])
    y_tr = np.concatenate([y_tr, pred[take]])
    remain = [r for r in remain if r not in add]

acc_self = m.score(X_test, y_test)
print(f"ラベルありのみ: {acc0:.3f}  自己訓練後: {acc_self:.3f}")

実行すると ラベルありのみ: 0.807 自己訓練後: 0.812 となり、わずかですが改善します。

自己訓練前後の決定境界

図は自己訓練の前後です。ラベルあり(縁取りの点)はわずか各3点ですが、ラベルなしデータ(灰)の分布に沿って決定境界が調整されています。この例では改善は小さいですが、これは元のSVMが少数ラベルでもmake_moonsの構造を概ね捉えられているためです。ラベルがさらに少なく、初期モデルが構造を捉えきれない状況ほど、自己訓練の効きしろは大きくなります(同時に確証バイアスのリスクも高まります)。

擬似ラベルの付与

擬似ラベルの付き方を見ると、確信の高い点から順にラベルが伝播し、最初の少数ラベルから大量のラベルなしデータへとラベルが広がっていることがわかります。

ラベル数と精度

ラベル数を変えて自己訓練の効果を見ると、ラベルが少ない領域ほど自己訓練の上積みが効く傾向が見えます。ラベルが十分にあれば教師あり学習だけで足りるので、自己訓練の出番は「ラベルが乏しいとき」なのです。

しきい値のトレードオフ

最後にしきい値のトレードオフです。しきい値を高くすると擬似ラベルの正確さは上がりますが、採用される量は減ります。低くすると量は増えますが誤りが混ざりやすくなります。このバランスが自己訓練の成否を左右します。

実務で自己訓練を使うときの勘所

自己訓練を実際に使うときのチェックリストをまとめます。

  • 初期モデルの質を確保する: 確証バイアスは初期の誤りから始まります。まず少数ラベルで、できるだけ良い初期モデルを作ることが最優先です。
  • しきい値は高めに: 誤った擬似ラベルの混入は崩壊の引き金です。確信度しきい値は高め(0.9以上)から始め、慎重に下げます。
  • 段階的に、検証を見ながら: 一度に大量の擬似ラベルを足さず、少しずつ追加し、各段階で検証性能を確認します。悪化の兆候があれば止めます。
  • クラスタ仮定の確認: データがクラスごとに塊を作っているか(クラスの境界が低密度領域にあるか)を、可視化などで事前に確認します。

ラベルの乏しいターゲットへモデルを適応させる学習ループでも、これらの安定化(重み付け・早期終了・整合性チェック)を組み込むことで、自己訓練を安全に活用できます。「効くときは強力、外すと崩壊」という性質を理解し、安全装置とセットで使うことが肝心です。

まとめ

自己訓練(self-training)と擬似ラベルを、理論から実装、そして罠まで解説しました。

  • 自己訓練: 少数ラベルで学習→ラベルなしを予測→確信の高い予測を擬似ラベル化→再学習、を繰り返す半教師あり学習。
  • 効く理由(クラスタ仮定): ラベルなしデータが分布の構造(クラスタ)を教え、決定境界を低密度領域へ導く。
  • 確証バイアスの罠: 誤った高確信予測が自己強化され崩壊することがある(実装でも各2点で0.84→0.18の崩壊を確認)。
  • 安定化: 高いしきい値・段階的追加・整合性正則化・早期終了、そして Noisy Student のノイズ注入が効果的。
  • 使いどころ: ラベルが乏しく、クラスタ仮定が成り立つときに最も効く。

自己訓練は「タダで手に入る大量のラベルなしデータ」を活かす強力な手法ですが、確証バイアスという影と隣り合わせです。安定化の工夫とセットで使うことが、実用の鍵になります。

次のステップとして、以下もあわせて読むと理解が深まります。