FixMatch — 擬似ラベルと整合性正則化で、わずかなラベルから学ぶ

ラベル付けは高くつきます。画像1枚に正解を付けるのは一瞬でも、数万枚となれば膨大な人手と時間がかかります。一方で、ラベルのないデータは大量に余っている——この「少しのラベルと大量の未ラベル」をどう活かすかが半教師あり学習のテーマです。

自己訓練(self-training)の記事では、モデル自身の予測を擬似ラベルにして学習する手法を見ました。しかしそこには 確証バイアス——誤った予測を自信たっぷりに学習して誤りを増幅する罠——という弱点がありました。本記事の FixMatch は、自己訓練に 整合性正則化(consistency regularization) という強力な仕掛けを組み合わせ、この弱点を抑えながら、ごくわずかなラベルで高精度を達成する手法です。画像分類では、1クラス数枚というレベルのラベルで、教師あり学習に迫る精度を出したことで注目を集めました。

FixMatchのアイデアは驚くほどシンプルにまとめられます——「弱く変形した入力で擬似ラベルを作り、強く変形した入力でその擬似ラベルに一致させる」。本記事ではこの仕組みを、自己訓練からの発展として丁寧に解き明かし、PyTorchで「ラベルだけの学習」と「FixMatch」を実測して比べます。

FixMatchの概念

図が全体像です。ラベル無しデータに弱い増強をかけて予測し、確信が高ければそれを擬似ラベルとする。同じデータに強い増強をかけた予測を、その擬似ラベルに一致させる——この非対称な使い分けがFixMatchの核心です。なぜ弱と強を分けるのか、それが確証バイアスをどう抑えるのかを、順に見ていきます。

自己訓練からの発展

FixMatchの位置づけをまず押さえます。

自己訓練からの発展

自己訓練は「モデルの予測を擬似ラベルにして自分を教える」手法でした。FixMatchはその擬似ラベルの考え方を受け継ぎつつ、整合性正則化——「同じデータは、多少変形しても同じ予測になるべき」という制約——を加えます。この組み合わせによって、自己訓練単体の弱点だった確証バイアスを抑え、より安定して高精度を得られるようにしたのが、FixMatchの貢献です。「擬似ラベル」と「整合性正則化」という半教師あり学習の2本柱を、最小限の部品でエレガントに統合した点が評価されています。

弱い増強と強い増強

FixMatchを理解する鍵は、2種類のデータ拡張(増強)の使い分けです。

弱い増強と強い増強

  • 弱い増強(weak augmentation):左右反転や軽い平行移動など、ラベルを保つ小さな変形。元のデータとほぼ同じ意味を持ちます。
  • 強い増強(strong augmentation):大きな色変換・回転・切り抜き・RandAugmentなど、見た目を大きく崩す変形。それでも本質(ラベル)は変わらないはずです。

FixMatchは、この2つを役割分担させます。擬似ラベルは「弱い増強」から作る(信頼できる予測を得るため)。一方、学習で一致させる対象は「強い増強」の予測(難しい変形でも正しく予測できるよう鍛えるため)。「易しい問題で答えを作り、難しい問題でその答えを言えるよう訓練する」という構図です。

確信度しきい値で擬似ラベルを選ぶ

弱い増強で予測を得ても、すべてを擬似ラベルにするわけではありません。

確信度しきい値

図のように、予測の最大クラス確信度がしきい値 $\tau$(例:0.95)を超えたものだけを擬似ラベルとして採用します。確信のない予測を擬似ラベルにすると誤りが混ざり、確証バイアスの引き金になるためです。「確実なものだけを使う」——この高いしきい値が、誤った擬似ラベルの混入を防ぐ第一の安全装置です。学習初期は確信できるサンプルが少なく、進むにつれて採用数が増えていく、という自然なカリキュラムにもなっています。

整合性正則化

採用した擬似ラベルを、強い増強の予測に一致させる——これが整合性正則化です。

整合性正則化

同じ入力なら、弱く変形しても強く変形しても、予測は同じであるべきです(猫はどう変形しても猫)。そこで、弱い増強から作った擬似ラベルを「正解」とみなし、強い増強の予測がそれに一致するよう学習します。これにより、モデルは表面的で壊れやすい特徴ではなく、強い変形にも耐える頑健な特徴を学ぶよう強制されます。これが確証バイアスを抑える第二の安全装置です。表面的な手がかりに頼った誤った確信は、強い増強の下では揺らぐため、整合性の要求がそれを許さないのです。

FixMatchの損失

以上をまとめた損失関数は、2項からなります。

FixMatchの損失

$$ \begin{equation} L = L_s + \lambda_u L_u \end{equation} $$

$L_s$ はラベルありデータの通常の教師あり損失(クロスエントロピー)。$L_u$ は、確信度がしきい値を超えたラベル無しデータについて、強い増強の予測を擬似ラベルに合わせる整合性損失です。$\lambda_u$ は両者のバランスをとる係数です。

FixMatchの学習ループ

学習ループは図の通り。(1) 弱い増強で予測、(2) 確信度がしきい値を超えたものを擬似ラベル化、(3) 強い増強の予測を擬似ラベルに合わせ、(4) 教師あり損失と合算して更新——これを繰り返します。

PyTorchで確かめる

2つの三日月(make_moons)で、ラベルをわずか8点だけにした半教師あり設定を作ります。増強は「ガウスノイズの付加」で代用し、弱い増強=小さなノイズ、強い増強=大きなノイズとします。「ラベル8点だけの教師あり学習」と「FixMatch」を比べます。

import numpy as np, torch, torch.nn as nn
from sklearn.datasets import make_moons

def setup(seed=0):
    X, y = make_moons(2000, noise=0.13, random_state=seed)
    X = (X - X.mean(0)) / X.std(0)
    rng = np.random.default_rng(seed); idx = rng.permutation(len(X))
    lab, unlab, test = idx[:8], idx[8:1000], idx[1000:]      # ラベルは8点のみ
    t = lambda a: torch.tensor(a, dtype=torch.float32)
    return t(X[lab]), torch.tensor(y[lab]), t(X[unlab]), t(X[test]), torch.tensor(y[test])

class Net(nn.Module):
    def __init__(s):
        super().__init__()
        s.f = nn.Sequential(nn.Linear(2,64), nn.ReLU(), nn.Linear(64,64), nn.ReLU(), nn.Linear(64,2))
    def forward(s, x): return s.f(x)

def acc(m, X, y):
    m.eval()
    with torch.no_grad(): return (m(X).argmax(1) == y).float().mean().item()

Xl, yl, Xu, Xt, yt = setup(0)
ce = nn.CrossEntropyLoss()

まずラベル8点だけの教師あり学習。

torch.manual_seed(0); m = Net(); opt = torch.optim.Adam(m.parameters(), 1e-2)
for _ in range(300):
    opt.zero_grad(); ce(m(Xl), yl).backward(); opt.step()
print(f"ラベルのみ: test acc = {acc(m, Xt, yt):.3f}")
ラベルのみ: test acc = 0.850

次にFixMatch。弱い増強(小ノイズ)で擬似ラベルを作り、確信度0.95超のものだけを、強い増強(大ノイズ)の予測に一致させます。

torch.manual_seed(0); m = Net(); opt = torch.optim.Adam(m.parameters(), 1e-2)
for ep in range(300):
    opt.zero_grad(); loss = ce(m(Xl), yl)                       # 教師あり損失 L_s
    with torch.no_grad():
        weak = m(Xu + 0.05*torch.randn_like(Xu))                # 弱い増強で予測
        conf, pl = weak.softmax(1).max(1)
        mask = conf > 0.95                                      # 確信度しきい値
    if mask.sum() > 0:
        strong = m(Xu[mask] + 0.25*torch.randn_like(Xu[mask]))  # 強い増強で予測
        loss = loss + ce(strong, pl[mask])                      # 整合性損失 L_u
    loss.backward(); opt.step()
print(f"FixMatch  : test acc = {acc(m, Xt, yt):.3f}")
FixMatch  : test acc = 0.911

FixMatchの結果

ラベルわずか8点での教師あり学習は 0.850 ですが、ラベル無しデータを活用したFixMatchは 0.911 へ改善しました。正解ラベルを増やさず、未ラベルデータの「変形への整合性」だけでこの向上です。この改善は乱数シードに対しても安定しており、5つのシードで平均すると 0.857 → 0.922 と一貫して改善しました(自己訓練の記事で見た、設定次第で崩壊する不安定さと対照的です)。確信度しきい値と整合性正則化という2つの安全装置が効いている証拠です。

決定境界が低密度域へ

なぜ効くのかは、決定境界の動きで理解できます。ラベルだけでは境界が甘く引かれますが、整合性正則化は「近くのデータは同じ予測」を促すため、境界がデータの密な塊を避け、隙間(低密度域)へ押しやられます。これは半教師あり学習が依拠するクラスタ仮定自己訓練の記事参照)に沿った、望ましい振る舞いです。

なぜ確証バイアスに強いのか

FixMatchが自己訓練の弱点を克服できる理由を、改めて整理します。

確証バイアスを抑える仕掛け

  • 高い確信度しきい値:誤った擬似ラベルの混入を入口で防ぐ。確信のない予測は学習に使わないので、誤りの増幅が起きにくい。
  • 強増強への整合性:表面的・偶然的な手がかりに基づく予測は、強い増強の下で揺らぐ。整合性を要求することで、揺らがない頑健な特徴だけが学ばれる。

この2つが噛み合うことで、「自信のある誤り」を学習し続ける確証バイアスの悪循環を断ち切れます。ただし万能ではありません。注意点として、しきい値が高すぎると擬似ラベルがほとんど採用されず学習が進まないこと、増強の設計がタスクに合っていないと整合性が無意味になること(画像では有効な強増強が、表データでは設計が難しい)、クラスタ仮定が成り立たないデータでは効果が限定的なことが挙げられます。増強というドメイン知識をうまく注入できるかが、FixMatchの成否を分けます。

半教師あり学習の系譜の中で

FixMatchは突然生まれたわけではなく、整合性正則化の系譜の到達点として位置づけられます。流れを押さえると、FixMatchの「引き算の美学」が見えてきます。

  • Π-model / Temporal Ensembling:同じ入力に2回ノイズを加えた予測どうしを一致させる、整合性正則化の出発点。擬似ラベルという明示的な目標は持たない。
  • Mean Teacher:モデルの重みの指数移動平均(EMA)で「教師モデル」を作り、その安定した予測に生徒を合わせる。擬似ラベルの目標を滑らかにすることで学習を安定化。
  • MixMatch / ReMixMatch:複数の増強の予測を平均してシャープ化した擬似ラベルを作り、MixUpなどと組み合わせる。高精度だが部品が多く複雑。
  • FixMatch:上記の工夫を大胆に削ぎ落とし、「弱増強で確信した擬似ラベル+強増強への整合性」という最小構成に凝縮。シンプルなのに最高水準、という点で画期的だった。

この系譜が示すのは、半教師あり学習が「整合性(同じものは同じ予測に)」と「擬似ラベル(確信した予測を目標に)」という2原理の組み合わせ方を洗練させてきた歴史だ、ということです。FixMatchはその2原理を最も簡潔に結晶化させました。さらに後続の FlexMatch では、クラスごとに学習の進み具合が違う点に着目し、確信度しきい値をクラス適応的に動かす改良が加えられています。固定しきい値というFixMatchの単純さが、次の改良の出発点になったわけです。

整合性正則化のもう一つの見方

整合性正則化は、「入力に小さな摂動を加えても予測が変わらないこと」を要求します。これは数学的には、予測関数を入力の摂動方向に対して平らにする(滑らかにする)正則化と解釈できます。決定境界の近くでは予測が急変しますが、整合性を課すと、データが密に存在する領域では予測が平坦になり、急変(境界)はデータの少ない隙間へ追いやられます。これが前節で見た「決定境界が低密度域へ移る」現象の数理的な裏付けです。

この見方からは、強い増強がなぜ重要かも分かります。摂動が大きいほど、より広い範囲で予測の平坦さを要求することになり、頑健性が増します。ただし大きすぎてラベルが変わるほどの増強(猫が犬に見えるような変形)は、整合性の前提(変形してもラベル不変)を壊すので逆効果です。「ラベルを保つ範囲で、できるだけ強く」が増強設計の勘所になります。

まとめ

FixMatchを、理論から実装まで解説しました。

  • FixMatchは、擬似ラベル(自己訓練)と整合性正則化を統合した半教師あり学習。「弱い増強で擬似ラベルを作り、強い増強でそれに一致させる」が核心。
  • 弱い増強は信頼できる擬似ラベルを作るため、強い増強は頑健な特徴を学ぶため、と役割を分ける。
  • 高い確信度しきい値強増強への整合性という2つの安全装置で、自己訓練の弱点だった確証バイアスを抑制する。
  • 実測では、ラベル8点の教師あり学習 0.850 に対し、FixMatch は 0.911(5シード平均 0.857→0.922 と安定して改善)。整合性正則化により決定境界が低密度域へ移る。
  • 注意点として、しきい値・増強設計・クラスタ仮定への依存がある。

次のステップとして、教師モデルを指数移動平均で安定させる Mean Teacher や、本シリーズで扱う Noisy Student(自己訓練のスケール版)との比較に進むと、半教師あり学習の系譜がさらに立体的に見えてきます。