Skip to main content

PyTorchで正則化のためのドロップアウト - チュートリアル

PyTorchモデルをドロップアウトで正則化する方法を学びましょう。コードチュートリアルとインタラクティブなビジュアライゼーションも含まれています。
Created on August 1|Last edited on August 1
このレポートでは、PyTorchモデルにドロップアウト正則化を追加する例を見て、Weights & Biasesでモデルを追跡することでドロップアウトがモデルの性能に与える影響を観察します。
慣れていない方のために、ドロップアウトが何をするのかを説明します。すでに知っている場合は、次に進むことができます。
Jump to the tutorial


私たちが取り上げる内容



ドロップアウト正則化とは何ですか?

ドロップアウト正則化は、ニューラルネットワークにおいてユニットを削除(または「ドロップアウト」)することで、多数のアーキテクチャを同時に学習することをシミュレートする機械学習技術です。重要なことに、ドロップアウトはトレーニング中の過学習の確率を大幅に減少させることができます。

過学習は、ニューラルネットワークが訓練データを細部にわたり学習しすぎることで発生し、未見の新しいデータに対する性能が低下します。ドロップアウトは、訓練中にランダム性を導入することでこれに対処します。各訓練の反復でニューロンの一部をランダムに「ドロップアウト」(ゼロに設定)することにより、ネットワークが特定のニューロンや特徴に過度に依存するのを防ぎます。これによって、ネットワークがより分散され、堅牢な表現を学習するよう促します。
これは、ニューロンが過度に専門化して一緒に働くようになり、一般化を妨げるニューロンの共適応を軽減します。ドロップアウトの概念は、Hintonらによって2012年の論文で紹介されました。特徴検出器の共同適応を防ぐことによるニューラルネットワークの改善その後、ディープラーニングの定番となり、モデルの一般化能力を向上させることで、分野に大きな影響を与えました。



理解torch.nn.Dropout

PyTorchは、を使用してドロップアウトを実装する便利な方法を提供します。torch.nn.Dropout クラス。このクラスはトレーニング中に入力テンソルの要素をランダムにゼロにし、ニューロンを「ドロップアウト」します。重要なパラメータはp、要素をゼロにする確率を定義し、inplace、操作がインプレースで実行されるかどうかを決定します。
そのpパラメータは、各トレーニングステップでランダムに非活性化されるニューロンの割合を制御します。高いp値が大きいほど多くのニューロンがドロップアウトされ、より強い正則化が行われます。一般的な値はp範囲は0.2から0.5ですが、最適な値は特定のネットワークとデータセットに依存します。
そのinplaceパラメーターを設定した場合、True、入力テンソルを直接変更し、メモリを節約します。ただし、インプレース操作は柔軟性に欠ける場合があり、すべての状況に適しているわけではないことに注意することが重要です。
ここにインスタンス化して使用する方法を示す簡単なコード例があります。nn.Dropout

PyTorchモデルへのドロップアウトの追加

PyTorchモデルにドロップアウト正則化を追加するための簡単なステップバイステップの手順を以下に示します。 1. `torch.nn.Dropout`をインポートします。 2. モデルの定義で、ドロップアウトレイヤーを追加したい場所に`Dropout`レイヤーを挿入します。例: `self.dropout = nn.Dropout(p=0.5)`。ここで、`p`はドロップアウトの確率を示します。 3. フォワードメソッドでドロップアウトを適用します。例: `x = self.dropout(x)`。 4. 学習モードでドロップアウトが有効になりますが、評価モードでは無効になります。`model.train()`と`model.eval()`でモードを切り替えます。

1. PyTorchモデルにドロップアウトを追加する

PyTorchモデルにドロップアウトを追加するのは非常に簡単です。torch.nn.Dropoutクラスは、パラメーターとしてドロップアウト率(ニューロンが無効化される確率)を受け取ります。
self.dropout = nn.Dropout(0.25)
任意の非出力層の後にドロップアウトを適用できます。

2. ドロップアウトがモデルの性能に与える影響を観察する

ドロップアウト効果を観察するために、モデルを訓練して行う。画像分類最初に非正則化ネットワークを訓練し、その後ドロップアウトによって正則化されたネットワークを訓練します。モデルは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 dropout self.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 dropout x = self.dropout(x) x = self.fc2(x) return x
を使用してwandb.log()トレーニング関数では、モデルのパフォーマンスを自動的に追跡できます。見てください。ドキュメント詳細については。
def train(model, device, train_loader, optimizer, criterion, epoch, steps_per_epoch=20): # Log gradients and model parameters wandb.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 performance wandb.log({'Train Loss': train_loss/train_total, 'Train Accuracy': acc})



Run set
0


PyTorchにおけるドロップアウト正則化の影響

「ドロップアウト正則化を使用する影響は何ですか?」これにより次のことが分かります。
  1. 正則化されていないネットワークは、訓練データセットに対して迅速に過学習します。検証損失がどのようにwithout-dropout数エポック後に収束が大きく逸れることが多く、高い一般化誤差の原因となっています。
  2. ドロップアウト確率25%のドロップアウト層を2つ使ってトレーニングすることで、モデルの過学習を防ぎます。しかし、これによりトレーニングの精度が低下し、正則化されたネットワークのトレーニングに時間がかかることを意味します。
  3. ドロップアウトはモデルの一般化を改善します。トレーニング精度は正則化されていないネットワークよりも低いですが、全体的な検証精度は向上しています。これは一般化誤差が低いことを示しています。
これで、PyTorchモデルでドロップアウトを使用する短いチュートリアルが終了します。



ウェイト&バイアスを試す

Weights & Biasesは、機械学習実験を追跡するのに役立ちます。ハイパーパラメータを記録し、実行からの出力メトリクスをログに保存し、結果を視覚化して比較し、同僚とすばやく結果を共有するためのツールをお試しください。
Replitで2つのクイックな実験を実行し、W&Bがどのように作業を整理するのに役立つかを確認するには、以下の指示に従ってください。
指示:
  1. 以下の緑の「実行」ボタンをクリックしてください。(最初に「Run」をクリックすると、Replitがマシンを割り当てるのに約30〜45秒かかります)
  2. ターミナルウィンドウのプロンプトに従ってください。右下のペイン
  3. ターミナルウィンドウのサイズを変更できます。右下をクリックして拡大表示




ニューラルネットワークのどこにドロップアウトを適用するか

ニューラルネットワーク内のドロップアウト層の配置はその効果にとって重要です。ドロップアウトはさまざまな場所に適用できますが、通常は隠れ層の活性化関数の後や時には入力層に使用されます。ドロップアウトの戦略的な配置はモデルの性能に大きく影響することがあります。
後のドロップアウトの適用活性化関数隠れ層でのドロップアウトは一般的な手法です。これは、これらの層内のニューロンの共適応を減少させることで過学習を防ぐのに役立ちます。ただし、最適な配置は特定のアーキテクチャやタスクによって異なる場合があります。
例えば、より深いネットワークでは、ドロップアウトは初期の層でより有益であるかもしれません。入力層にドロップアウトを適用することは、特徴選択に役立つ場合があります。これは、モデルが単一の入力特徴に依存せず、より堅牢な表現を学ぶことを強制するからです。しかし、入力層に過剰にドロップアウトを適用すると、アンダーフィッティングにつながる可能性があることに注意が必要です。
ドロップアウトを適用する場所の決定はしばしば経験的なものであり、特定のタスクに最適な構成を見つけるために実験が必要です。

高度なドロップアウト技法と考慮事項

標準的なドロップアウトは効果的ですが、その性能をさらに向上させるための高度な技術と考慮事項があります。これには、適応型ドロップアウト率やドロップアウトの変種が含まれます。
適応的ドロップアウト率は、モデルの性能に基づいてトレーニング中にドロップアウト率を動的に調整することを含みます。これにより、正則化の強度を微調整し、モデルの一般化能力を向上させることができます。変分ドロップアウトなどの他のドロップアウトのバリエーションは、ニューロンをランダムにドロップするためのより高度なメカニズムを導入します。これらのバリエーションは、特に複雑なモデルにおいて、標準的なドロップアウトよりも良い性能をもたらすことがあります。異なる層に対して適切なドロップアウト率を選択することも重要です。異なる層に対して異なるドロップアウト率を試して、特定のタスクに最適な構成を見つけることがしばしば有益です。

結論

ドロップアウトは、ニューラルネットワークにおける過学習を防ぐ上で重要な役割を果たす強力で多用途な正則化手法です。トレーニング中にニューラルをランダムに無効化することで、ドロップアウトはネットワークがより堅牢で汎化可能な特徴を学習するように促します。使用方法を理解することは、torch.nn.DropoutPyTorchで効果的に実行することは、高性能なディープラーニングモデルを構築するために不可欠です。