正則化のための PyTorch Dropout チュートリアル
コードチュートリアルとインタラクティブな可視化付きで、PyTorchモデルをDropoutで正則化する方法を学ぶ
Created on August 12|Last edited on August 12
Comment
このレポートでは、PyTorchモデルにDropoutによる正則化を追加する例を示し、Weights & Biasesで学習を追跡しながら、Dropoutがモデル性能に与える影響を確認します。
未経験の方向けに、ドロップアウトの役割を簡潔に説明します。すでに理解している場合は次のいずれかを行ってください。
Jump to the tutorial
学ぶ内容
機械学習におけるDropout正則化とは何か概要 torch.nn.DropoutPyTorchモデルにDropoutを追加する1. PyTorchモデルにDropoutを追加する2. Dropoutがモデル性能に与える影響を観察するPyTorchにおけるDropout正則化の効果と影響Weights & Biases を試すニューラルネットワークで Dropout を適用する場所発展的なドロップアウト手法と設計上の考慮事項まとめ
機械学習におけるDropout正則化とは何か
Dropout正則化は、ニューラルネットワーク内のユニットを一部無効化(“ドロップアウト”)して、同時に多数のアーキテクチャを学習しているかのような効果を得る手法です。重要な点として、ドロップアウトは学習中の過学習のリスクを大幅に低減できます。

過学習とは、ニューラルネットワークが訓練データのノイズや個別の癖まで過度に学習してしまい、未見データでの性能が低下する現象です。Dropoutは学習中にランダム性を導入することでこれに対処します。各学習イテレーションでニューロンの一部をランダムに「ドロップアウト」(値を0に設定)することで、特定のニューロンや特徴量に過度に依存するのを防ぎます。結果として、より分散的でロバストな表現の学習を促します。
これにより、ニューロン同士が過度に協調して特化してしまう共適応も抑制され、汎化を妨げにくくなります。ドロップアウトという概念は、Hinton らの2012年の論文で提案されました。 特徴検出器の共適応を防いでニューラルネットワークを改善する以来、深層学習の定番手法となり、モデルの汎化能力を高めることで分野全体に大きな影響を与えてきました。
このColabでPyTorchのドロップアウト例を実行する →
概要 torch.nn.Dropout
PyTorch では、次の機能を使ってドロップアウトを手軽に実装できます torch.nn.Dropout クラスです。このクラスは学習時に入力テンソルの要素をランダムに0にし、実質的にニューロンを「ドロップアウト」します。主なパラメータは次のとおりです。 p、各要素を0にする確率を定義します。また、 inplace、演算をインプレースで行うかどうかを決定します。
The p パラメータ(一般にドロップアウト率と呼ばれる)は、各学習ステップでランダムに無効化されるニューロンの割合を制御します。より高い p 値が大きいほどより多くのニューロンが無効化され、正則化は強くなります。一般的な設定値は p 一般的には 0.2〜0.5 程度ですが、最適な値はネットワークやデータセットによって異なります。
The inplace パラメータは、 True、入力テンソルを直接変更してメモリを節約します。ただし、インプレース演算は柔軟性に欠ける場合があり、常に適切とは限らない点に注意が必要です。
以下は、インスタンス化と使用方法を示すシンプルなコード例です。 nn.Dropout
PyTorchモデルにDropoutを追加する
PyTorchモデルにDropoutによる正則化を追加するための、シンプルな手順を以下に示します。
1. PyTorchモデルにDropoutを追加する
PyTorchのモデルにDropoutを追加するのは、 を使えばとても簡単です。 torch.nn.Dropout クラスで、ニューロンが無効化される確率(ドロップアウト率)をパラメータとして受け取ります。
self.dropout = nn.Dropout(0.25)
出力層以外の任意の層の後にドロップアウトを適用できます。
2. Dropoutがモデル性能に与える影響を観察する
ドロップアウトの効果を観察するには、モデルを学習させて次の���理を行います。 画像分類まずは正則化なしのネットワークを学習し、その後に Dropout で正則化したネットワークを学習します。どちらのモデルも CIFAR-10 データセットで各15エポック学習します。
PyTorchモデルにドロップアウトを追加する完全な例:
class Net(nn.Module):def __init__(self, input_shape=(3,32,32)):super(Net, self).__init__()self.conv1 = nn.Conv2d(3, 32, 3)self.conv2 = nn.Conv2d(32, 64, 3)self.conv3 = nn.Conv2d(64, 128, 3)self.pool = nn.MaxPool2d(2,2)n_size = self._get_conv_output(input_shape)self.fc1 = nn.Linear(n_size, 512)self.fc2 = nn.Linear(512, 10)# Define proportion or neurons to dropoutself.dropout = nn.Dropout(0.25)def forward(self, x):x = self._forward_features(x)x = x.view(x.size(0), -1)x = self.dropout(x)x = F.relu(self.fc1(x))# Apply dropoutx = self.dropout(x)x = self.fc2(x)return x
def train(model, device, train_loader, optimizer, criterion, epoch, steps_per_epoch=20):# Log gradients and model parameterswandb.watch(model)# loop over the data iterator, and feed the inputs to the network and adjust the weights.for batch_idx, (data, target) in enumerate(train_loader, start=0):# ...acc = round((train_correct / train_total) * 100, 2)# Log metrics to visualize performancewandb.log({'Train Loss': train_loss/train_total, 'Train Accuracy': acc})
Run set
0
PyTorchにおけるDropout正則化の効果と影響
「Dropout 正則化を使うと何が起きるのか?」と思うかもしれません。導入すると、次のような変化が見られます。
- 正則化なしのネットワークは学習データに素早く過学習します。検証損失がどのように… without-dropout 数エポックのうちに学習が大きく発散し、これが汎化誤差の増大につながっています。
- ドロップアウト確率を25%に設定したドロップアウト層を2層挿入すると、モデルの過学習を抑えられます。ただし、その分学習精度は低下するため、正則化したネットワークはより長く学習させる必要があります。
- Dropout によりモデルの汎化性能が向上します。学習精度は正則化なしのネットワークより低くなるものの、全体として検証精度は改善されます。これは汎化誤差の低下を示しています。
以上で、PyTorch モデルにおける Dropout の使い方に関する短いチュートリアルは終了です。
自分で試せる Dropout の Colab はこちら →
Weights & Biases を試す
Weights & Biases は機械学習の実験管理を支援します。実行ごとのハイパーパラメータや出力メトリクスを記録し、結果を可視化・比較して、発見を同僚と素早く共有できます。
Replit で手早く2件の実験を実行し、W&B が作業の整理にどう役立つかを確認するには、以下の手順に従ってください。
手順
- 下の緑色の「Run」ボタンをクリックしてください(最初に「Run」をクリックすると、Replit がマシンを割り当てるまでに約30〜45秒かかります)
- ターミナルウィンドウに表示される指示に従ってください(下の右下ペイン)
- ターミナルウィンドウのサイズを変更できます(右下)を拡大表示するにはこちらをご覧ください
ニューラルネットワークで Dropout を適用する場所
ニューラルネットワーク内でのドロップアウト層の配置は、その効果を左右する重要な要素です。適用場所はいくつか考えられますが、一般的には中間層の活性化関数の後、場合によっては入力層にも用いられます。ドロップアウトの戦略的な配置は、モデルの性能に大きく影響します。
ドロップアウトの適用場所 活性化関数 中間層に挿入するのが一般的です。これにより、その層内のニューロン同士の共適応を抑え、過学習を防ぐのに役立ちます。ただし、最適な配置はアーキテクチャやタスクによって異なる場合があります。
たとえば、より深いネットワークでは、初期の層でドロップアウトがより効果的に働く場合があります。入力層にドロップアウトを適用すると、特定の入力特徴に依存しない頑健な表現を学習することを促すため、特徴選択の観点でも有用です。ただし、入力層でのドロップアウトが強すぎるとアンダーフィッティングにつながる点には注意が必要です。
ドロップアウトをどこに適用するかの判断は、タスクごとに最適な構成を見つけるための試行錯誤を要する、実証的な問題であることが多いです。
発展的なドロップアウト手法と設計上の考慮事項
標準的なドロップアウトは有効ですが、性能をさらに高めるための発展的な手法や設計上の考慮点もあります。たとえば、適応的なドロップアウト率や各種のドロップアウト派生手法などです。
適応的なドロップアウト率は、学習中のモデルの挙動に応じてドロップアウト率を動的に調整する手法です。これにより正則化の強さをきめ細かく制御でき、汎化性能の向上が期待できます。変分ドロップアウトなどの派生手法では、ニューロンをランダムに無効化するためのより洗練された仕組みを導入します。とくに複雑なモデルでは、これらの派生手法が標準的なドロップアウトより高い性能を示す場合があります。
層ごとに適切なドロップアウト率を選ぶことも重要です。層によって異なるドロップアウト率を試し、タスクに最適な構成を見つけるアプローチが有効です。
まとめ
ドロップアウトは、ニューラルネットワークの過学習を防ぐうえで重要な役割を果たす、強力で汎用的な正則化手法です。学習中にニューロンをランダムに無効化することで、より頑健で汎化しやすい特徴の学習を促します。使い方を理解し torch.nn.Dropout PyTorchで効果的に活用することは、高性能なディープラーニングモデルを構築するうえで不可欠です。
Add a comment