自己訓練(self-training)の記事では、モデル自身の予測を擬似ラベルにして学ぶ手法と、その弱点である確証バイアス(誤りの自己増幅)を見ました。素朴な自己訓練は「効くときは効くが、外すと崩れる」不安定さがあり、劇的な改善は出にくいものでした。
ところが、自己訓練にいくつかの工夫を加えるだけで、ImageNetという最難関のベンチマークで当時の最高精度を塗り替えた手法があります——それが Noisy Student Training です。その鍵は、名前の通りノイズにあります。教師が付けた擬似ラベルを学ぶ生徒に、あえて強いノイズ(データ拡張・Dropout・Stochastic Depth)を加える。すると生徒は教師より頑健になり、教師を超えていく。そして生徒を次の教師にして繰り返すことで、性能を押し上げていきます。
「自分の予測で自分を教えるだけでは大して良くならないのに、なぜノイズを加えると教師を超えられるのか?」——この一見不思議な現象が本記事の主題です。Noisy Studentの仕組みを、自己訓練やFixMatchとの関係から解き明かし、PyTorchで「ノイズの有無が結果を分ける」ことを実測します。

図が全体像です。ラベルで教師を学習し、大量の未ラベルデータに擬似ラベルを付け、ノイズを加えた生徒に学ばせ、その生徒を次の教師にして反復する——このサイクルがNoisy Studentの骨格です。
素朴な自己訓練との違い
Noisy Studentは自己訓練の一種ですが、決定的な3つの違いがあります。

- 生徒にノイズを加える:これが最重要。生徒は、データ拡張・Dropout・Stochastic Depthといったノイズの下で学習する。教師は擬似ラベルを作るときノイズなし(クリーンな予測)、生徒は学ぶときノイズあり、という非対称性が肝。
- 生徒は教師と同等以上に大きい:知識蒸留(大きな教師→小さな生徒)とは逆に、生徒の容量を教師以上にする。擬似ラベルを「真似る」のではなく「超える」ための余力を持たせる。
- 反復する:生徒を次の教師にして、擬似ラベルの生成と学習を繰り返す。世代を重ねるごとに精度が上がる。
この3点が、素朴な自己訓練を「劇的に効く」手法へと押し上げました。順に見ていきます。
教師-生徒ループ
まず全体の手順を確認します。

(1) ラベルありデータで教師モデルを学習する。(2) 学習済み教師で、大量のラベル無しデータに擬似ラベルを付ける(このときノイズは加えない=なるべく正確な擬似ラベルを得る)。(3) ラベルあり+擬似ラベルの全データで、ノイズを加えた生徒を学習する。(4) 学習した生徒を新しい教師とし、(2)へ戻って繰り返す——これがNoisy Studentのループです。
ノイズの正体
生徒に加える「ノイズ」は、具体的には次の3種類です。

- データ拡張(RandAugmentなど):入力画像を回転・色変換・切り抜きなどで大きく変形する。入力レベルのノイズ。
- Dropout:学習中にユニットの一部をランダムに無効化する。モデル内部のノイズ。
- Stochastic Depth:深いネットワークの層を確率的にスキップする。これもモデル内部のノイズ。
これらは、いずれも生徒に「同じ擬似ラベルを、もっと難しい条件で予測せよ」と要求するための仕掛けです。
なぜノイズが効くのか
ここがNoisy Studentの核心です。なぜ、生徒をいじめるようにノイズを加えると、教師を超えられるのでしょうか。

教師はクリーンな入力で擬似ラベルを作ります。生徒は、その同じ擬似ラベルを、変形され・一部が無効化された厳しい条件で当てなければなりません。これは「猫の写真を、ぼかされ・色を変えられ・一部を隠された状態でも猫と答えよ」と要求するようなものです。この厳しい訓練を乗り越えた生徒は、表面的で壊れやすい手がかりに頼れなくなり、ノイズに揺らがない本質的な特徴を学びます。その結果、クリーンなテストデータでは教師より高精度になる——これが「生徒が教師を超える」メカニズムです。
これは、FixMatchで見た整合性正則化(変形しても同じ予測であるべき)と本質的に同じ原理です。ノイズへの不変性を学ぶことが、汎化と頑健性を生むのです。逆に言えば、ノイズを加えない生徒は、教師の擬似ラベルをそのまま真似るだけで、教師を超える理由がありません。後の実験で、この差をはっきり目撃します。

生徒を教師以上に大きくするのも、同じ理由です。ノイズという厳しい条件下で擬似ラベルを超えるには、それだけの容量(表現力)が要ります。知識を圧縮する知識蒸留とは目的が真逆で、ここでは能力を伸ばすために生徒を大きくするのです。

そして反復。教師を超えた生徒が次の教師になれば、より正確な擬似ラベルが得られ、次の生徒はさらに良くなる——この好循環で、世代を重ねるごとに精度が押し上がっていきます。
PyTorchで確かめる
Noisy Studentの心臓部である「ノイズの有無が結果を分ける」ことを確認します。2つの三日月(make_moons)でラベルを16点だけにした半教師あり設定を作り、(A)教師、(B)ノイズ無しの生徒、(C)ノイズありの生徒(Noisy Student)のテスト精度を比べます。乱数で結果がぶれないよう、5つのシードで平均します。
import numpy as np, torch, torch.nn as nn
from sklearn.datasets import make_moons
def setup(seed):
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[:16], idx[16:1000], idx[1000:] # ラベルは16点のみ
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, drop=0.0):
super().__init__()
s.f = nn.Sequential(nn.Linear(2,64), nn.ReLU(), nn.Dropout(drop), # Dropout=内部ノイズ
nn.Linear(64,64), nn.ReLU(), nn.Dropout(drop), 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()
def train(m, Xl, yl, Xu=None, pl=None, epochs=300, noise=0.0):
opt = torch.optim.Adam(m.parameters(), 1e-2); ce = nn.CrossEntropyLoss()
for _ in range(epochs):
m.train(); opt.zero_grad()
loss = ce(m(Xl + noise*torch.randn_like(Xl)), yl) # noise=入力ノイズ
if Xu is not None:
loss = loss + ce(m(Xu + noise*torch.randn_like(Xu)), pl)
loss.backward(); opt.step()
return m
教師を学習し、その擬似ラベルで「ノイズ無し生徒」と「Noisy Student」を学習する処理を、5シードで回します。
def run(seed):
Xl, yl, Xu, Xt, yt = setup(seed)
torch.manual_seed(seed); teacher = train(Net(), Xl, yl) # ①教師
teacher.eval()
with torch.no_grad(): pl = teacher(Xu).argmax(1) # ②クリーンな擬似ラベル
torch.manual_seed(seed); s0 = train(Net(0.0), Xl, yl, Xu, pl, noise=0.0) # ③ノイズ無し生徒
torch.manual_seed(seed); s1 = train(Net(0.3), Xl, yl, Xu, pl, noise=0.15)# ④Noisy Student
return acc(teacher, Xt, yt), acc(s0, Xt, yt), acc(s1, Xt, yt)
T, S0, S1 = [], [], []
for s in range(5):
a, b, c = run(s); T.append(a); S0.append(b); S1.append(c)
print(f"教師 平均 = {np.mean(T):.3f}")
print(f"生徒(ノイズ無し) 平均 = {np.mean(S0):.3f}")
print(f"Noisy Student 平均 = {np.mean(S1):.3f}")
出力は次の通りです。
教師 平均 = 0.881
生徒(ノイズ無し) 平均 = 0.883
Noisy Student 平均 = 0.900

結果は核心を突いています。ノイズ無しの生徒は 0.883 で、教師(0.881)からほとんど改善しません——擬似ラベルをそのまま真似ているだけだからです。ところがノイズを加えたNoisy Studentは 0.900 と明確に教師を上回りました。同じ擬似ラベル・同じデータを使っているのに、違いは「生徒にノイズを加えたかどうか」だけ。ノイズこそが、自己訓練を単なる模倣から「教師超え」へと変える決定的な要素であることが、数値で確認できました。素朴な自己訓練が伸び悩んだのは、まさにこのノイズが欠けていたからなのです。
FixMatchとの関係
Noisy StudentとFixMatchは、どちらも「擬似ラベル+ノイズへの整合性」という同じ原理に立っています。

- FixMatch:1つのモデルの中で、弱増強→擬似ラベル、強増強→一致、をオンライン(学習しながら同時)に行う。
- Noisy Student:教師→生徒というオフラインの反復で、ノイズ下の整合性を実現する。大規模データ・大規模モデルで威力を発揮。
両者は「ノイズに対して予測を不変にすることで頑健な特徴を学ぶ」という思想を共有し、実装の枠組みが違うだけ、と理解できます。

知識蒸留との対比で理解する
Noisy Studentの設計思想は、よく似た「教師-生徒」の枠組みである知識蒸留(knowledge distillation)と対比すると、いっそう明確になります。
知識蒸留は、大きく高精度な教師の知識を、小さな生徒に圧縮して移すのが目的です。生徒は教師のソフトな予測を真似ることで、少ない容量でも教師に近い性能を得ます。つまり蒸留のゴールは「教師に追いつく(できれば軽量に)」ことであり、生徒が教師を超えることは基本的に想定しません。
Noisy Studentはこれと正反対です。生徒は教師と同等以上に大きく、しかもノイズという handicap を背負って学びます。同じ擬似ラベルを、より大きな容量で、より厳しい条件で学ぶことで、生徒は教師を超える余地を持つ。両者の違いを一言でまとめると、知識蒸留は「能力を圧縮する」、Noisy Studentは「能力を拡張する」。同じ教師-生徒の絵を描きながら、目的地が真逆なのです。
この対比は、なぜNoisy Studentで「生徒を大きく・ノイズを加える」の2点が同時に必要かを教えてくれます。生徒が教師より小さければ擬似ラベルを真似るのが精一杯で超えられない。ノイズがなければ難しさが足りず、やはり真似るだけになる。大きな容量とノイズという負荷の両方があって初めて、生徒は教師を踏み台にして上へ行けるわけです。
注意点
Noisy Studentを使う際の注意点もまとめます。
- 計算コストが大きい:大きな生徒を、大量の未ラベルデータで、何世代も学習するため計算資源を要します。本領を発揮するのは大規模設定です。
- 擬似ラベルの質に依存:初期教師が弱すぎると、誤った擬似ラベルが反復で固定化される恐れがあります。確信度によるフィルタリングやソフトラベルの利用が有効です。
- ノイズの強さの調整:生徒のノイズは強いほど頑健化に効きますが、強すぎると学習が進みません。一方で教師の擬似ラベル生成時はノイズを抑えるのが原則です。
- クラス分布の偏り:擬似ラベルがある特定クラスに偏ると性能が崩れるため、クラスごとのバランス調整が使われます。
「教師のクリーンな知識を、ノイズで鍛えた大きな生徒が受け継ぎ、超えていく」——Noisy Studentは、自己訓練というシンプルな枠組みが、ノイズという一手によっていかに強力になりうるかを示した好例です。
まとめ
Noisy Student Trainingを、理論から実装まで解説しました。
- Noisy Studentは自己訓練の発展形で、素朴な自己訓練と比べ ①生徒にノイズ ②生徒を教師以上に大きく ③反復 の3点が違う。
- 教師はクリーンに擬似ラベルを作り、生徒はノイズ下でそれを学ぶ。この非対称性で、生徒はノイズに揺らがない頑健な特徴を獲得し、教師を超える。
- ノイズの正体はデータ拡張・Dropout・Stochastic Depth。整合性正則化(FixMatch)と同じ原理。
- 実測では、ノイズ無し生徒 0.883(教師0.881からほぼ不変)に対し、Noisy Student は 0.900 と明確に改善。ノイズが「模倣」を「教師超え」に変える決定的要素だと確認できた。
- 計算コスト・擬似ラベルの質・ノイズ強度の調整が実務上の鍵。
本記事で、研究の基盤となる分布シフト対策(共変量シフト・転移・ドメイン適応/汎化・IRM)と半教師あり/表現学習(自己訓練・FixMatch・VAE系・Noisy Student)の一連のシリーズが揃いました。これらを土台に、より発展的な手法へ進んでいけます。