Dropout Layer
ドロップアウト層は、学習中に活性化値の一部をランダムにゼロにすることで、ネットワークが特定のユニットだけに依存できないようにし、過学習を抑制します。
ドロップアウト層は、ニューラルネットワークの正則化コンポーネントであり、各学習ステップで入力の割合pをランダムにゼロに設定し、推論時にはすべての値をそのまま通します。どのユニットも任意のステップで無効になる可能性があるため、ネットワークは特定の少数のニューロンや、それらの間の壊れやすい共適応に依存できません。その結果、汎化性能が高く、過学習しにくい冗長な特徴を学習します。学習データへの過学習も抑えられます。Geoffrey Hintonらが2012年にこの手法を導入し、Srivastava, Hinton, et al.が2014年に詳細を発表しました。ドロップアウトはPyTorch、TensorFlow、その他多くの深層学習フレームワークに組み込まれたレイヤーで、全結合分類ヘッドからTransformerまで、さまざまなアーキテクチャで使用されています。
ドロップアウトの仕組み#
学習中、レイヤーはフォワードパスごとに新しいランダムマスクをサンプリングし、確率1 − pで各要素を保持し、確率pでゼロにします。そのため、各ステップでは異なる縮小サブネットワークが学習され、テスト時に使われるネットワーク全体は、重みを共有する指数関数的な数のサブネットワークの平均を近似します。このため、ドロップアウトは低コストなアンサンブル学習と表現されることがあります。両フェーズで期待活性化値を同じに保つため、最新のフレームワークでは反転ドロップアウトを使用します。学習中に残った値に1 / (1 − p)を掛けるため、推論時にはレイヤーは何も行いません。PyTorchでは、nn.Dropoutはモジュールの学習モードまたは評価モードに従います。
import torch
from torch import nn
torch.manual_seed(0)
dropout = nn.Dropout(p=0.5)
x = torch.ones(10)
# 学習モード: 値の約半分がゼロになり、残りの値は1 / (1 - p) = 2倍にスケーリングされます
dropout.train()
print("Train:", dropout(x))
# 評価モード: レイヤーはすべての値を変更せずに通します
dropout.eval()
print("Eval: ", dropout(x))学習モードでは10個の値のうち6個が除去され、残りの4個は2.0になり、期待値は1.0に保たれます。評価モードでは、10個すべての値が1.0のままです。
一般的なドロップアウトのバリエーション#
- 空間ドロップアウト: PyTorchの
nn.Dropout2dは特徴マップのチャネル全体をゼロにします。チャネル内で隣接するピクセル間には強い相関があり、ピクセルを1つずつ除去しても正則化効果がほとんどないため、畳み込みネットワークに適しています。 - 確率的深度(DropPath): 個々の活性化値ではなく、サンプルごとに残差ブランチ全体をランダムにスキップします。Vision Transformerや最新のCNNの学習で標準的に使われています。
- モンテカルロドロップアウト: 推論時もドロップアウトを有効にし、同じ入力に対してモデルのフォワードパスを複数回実行します。予測のばらつきから、安全性が重要なシステムでモデルの不確実性を低コストで推定できます。GalとGhahramaniは、この手法を近似ベイズ推論として解釈しました。
- DropConnect: 活性化値ではなく個々の重みをランダムにゼロにし、各接続に個別のマスクを適用します。
ドロップアウトの実践#
ドロップアウト率は、他のハイパーパラメーターと同様に調整します。Srivastavaらは、幅広いネットワークとタスクで隠れユニットを確率0.5で除去すると良好に機能し、入力ユニットでは保持率を1に近づけると最適になることを示しました。初期のTransformerではp = 0.1が使われていました。率が高すぎると収束が遅くなり、学習不足を引き起こす可能性があります。また、ドロップアウトをバッチ正規化の直前に置くと、学習時とテスト時の分散シフトによって精度が低下することがあります。多くの畳み込みニューラルネットワークは、主にバッチ正規化、データ拡張、重み減衰に依存し、ドロップアウトは分類ヘッドに使用します。Ultralytics YOLO26の分類モデルもこのパターンに従っています。プーリング後の1,280チャネルの特徴と最終線形分類器の間にドロップアウト層が1つあり、その率は学習引数dropoutで設定します(デフォルトは0.0です)。
from ultralytics import YOLO
# ドロップアウト層を含むヘッドを持つYOLO26分類モデルを読み込みます
model = YOLO("yolo26n-cls.pt")
# 小規模なMNISTサブセットで、分類ヘッドに10%のドロップアウトを適用して学習します
results = model.train(data="mnist160", epochs=10, imgsz=64, dropout=0.1)実際のアプリケーション#
- 医用画像解析: ラベル付きスキャンはコストが高いため、診断用分類器は数千枚の画像を使って事前学習済みバックボーンをファインチューニングすることがよくあります。分類ヘッドのドロップアウトは、このような小規模なデータセットから個々の症例をヘッドが記憶するのを抑制します。
- 自然言語処理: BERTなどのTransformerエンコーダーは、事前学習とファインチューニング中に、アテンション重みを含むすべてのレイヤーに確率0.1のドロップアウトを適用します。










