ドロップアウトとは
Dropout
学習時にニューロンの一部をランダムに無効化し、過学習を抑制するニューラルネットワークの正則化手法
ひとことで言うと
AIの学習中、一部の回路をわざと使えなくすることで、特定の部分に頼りすぎないようにする工夫。
概要
ドロップアウトは、ニューラルネットワークの学習時に、各層のニューロンを一定の確率でランダムに無効化(出力を0に)しながら順伝播・逆伝播する正則化手法。 毎回のミニバッチごとに無効化されるニューロンの組み合わせが変わるため、実質的に多数の異なる部分ネットワークを同時に学習しているのと近い効果が生まれ、特定のニューロンの組み合わせに過度に依存することを防ぐ。 推論時にはすべてのニューロンを使う代わりに、学習時の無効化確率に応じて出力をスケーリングし、学習時と推論時で出力の期待値を揃える。 全結合層を持つモデルで特に効果的とされ、CNNやTransformerの一部の層にも適用されるが、Batch NormalizationやLayer Normalizationの普及とともに使用箇所は限定的になっている。
背景
大きなニューラルネットワークは表現力が高い一方、訓練データに過学習しやすい。 ドロップアウトは、多数の異なる部分ネットワークをアンサンブル的に学習させる効果を、追加のモデルを用意せず1つのネットワークの学習過程だけで近似的に実現するために考案された。
歴史
2012年: HintonらがDropoutのアイデアを含む論文を発表。 2014年: SrivastavaらがJMLRに詳細な理論と実験を伴う論文「Dropout: A Simple Way to Prevent Neural Networks from Overfitting」を発表し広く普及。
ワークフロー
学習時、各層の出力に対しニューロンごとに独立したベルヌーイ分布からサンプリングし、指定した無効化確率で出力を0にする。 残ったニューロンの出力は無効化されなかった割合の逆数倍にスケーリングする(Inverted Dropout)。 逆伝播も無効化されたニューロンを除いて計算し、推論時はドロップアウトを適用せず全ニューロンをそのまま使う。
コード例
PyTorchでのDropout層
import torch.nn as nn
model = nn.Sequential(
nn.Linear(512, 256),
nn.ReLU(),
nn.Dropout(p=0.5),
nn.Linear(256, 10),
)利点
欠点
- ドロップアウト率(無効化する確率)の調整が必要で、大きすぎると学習が不安定になる
- Batch NormalizationやLayer Normalizationと併用すると、うまく機能しないことがある
- 学習に必要なエポック数が増え、収束までの時間も伸びやすい
比較
- 過学習 — ドロップアウトは過学習を抑えるための代表的な正則化手法
- アンサンブル学習 — ドロップアウトは1つのネットワーク内で多数の部分ネットワークを学習させる、擬似的なアンサンブル効果を持つ
- Layer Normalization — 近年のTransformerモデルではドロップアウトの代わりにLayer Normalizationなどが多用される場合がある
関連用語
よくある質問
推論時にもドロップアウトは適用する?
通常は適用しない。学習時のみランダムにニューロンを無効化し、推論時は全ニューロンを使って安定した出力を得る。
ドロップアウト率はどのくらいに設定する?
全結合層では0.5前後がよく使われる。層の種類やタスクによっては0.1〜0.5程度の範囲で調整されることもある。