Skip to main content

パイナップルトーチドロップアウトによる正則化 - チュートリアル

PyTorchモデルをDropoutで正則化する方法を学ぶためのコードチュートリアルとインタラクティブなビジュアライゼーション。
Created on August 5|Last edited on August 5
このレポートでは、PyTorchモデルにドロップアウト正則化を追加する例を見て、Weights & Biasesでモデルを追跡することによって、ドロップアウトがモデルのパフォーマンスに与える影響を観察します。
このまま進めてください。
Jump to the tutorial


取り上げる内容



機械学習におけるドロップアウト正則化とは何ですか?

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

過学習は、ニューラルネットワークが学習データのノイズや特定のパターンも含めて過剰に学習してしまい、新しい未見のデータに対してパフォーマンスが低下する現象です。ドロップアウトは、学習中にランダム性を導入することでこれに対処します。各学習の反復でランダムに一部のニューロンを「ドロップアウト」(ゼロに設定)することで、ネットワークが特定のニューロンや特徴に過度に依存するのを防ぎます。これにより、ネットワークがより分散的で頑健な表現を学習することが促進されます。
これはまた、ニューロンが一緒に働くように過度に専門化し、一般化を妨げるニューロンの共同適応を軽減します。ドロップアウトの概念は、ヒントンらによって2012年の論文で紹介されました。特徴検出器の共適応を防ぐことによるニューラルネットワークの改善以来、深層学習の定番となり、モデルの汎化能力を向上させることで分野に大きな影響を与えています。

PyTorchでドロップアウトを実行する例をColabで試してみてください→

理解torch.nn.Dropout

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

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

ここにPyTorchモデルにドロップアウト正則化を追加する簡単な手順があります。

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

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

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

ドロップアウト効果を観察するために、モデルを訓練するための画像分類最初に正則化されていないネットワークを訓練し、その後、ドロップアウトによって正則化されたネットワークを訓練します。モデルはそれぞれ15エポックにわたってCifar-10データセットで訓練されます。

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でDropout正則化を使用する影響

「Dropout正則化の影響は何ですか?」それを使用すると、次のことがわかります。
  • 正則化されていないネットワークはトレーニングデータセットに迅速にオーバーフィットします。検証損失がどのようにwithout-dropoutいくつかのエポックの後に走行が大きく発散します。これが高い一般化誤差の原因となっています。
  • ドロップアウト確率が25%のドロップアウト層を2つ使用したトレーニングはモデルの過学習を防ぎます。しかし、これによりトレーニング精度が低下し、正則化されたネットワークをより長くトレーニングする必要があります。
  • ドロップアウトはモデルの一般化を改善します。非正則化ネットワークよりも訓練精度は低いですが、全体的な検証精度が向上しました。これは、低い一般化誤差に寄与します。
これで、PyTorchモデルでのドロップアウトの使用に関する短いチュートリアルを終了します。

私たちのドロップアウトのコラボを自分で試してみてください→

ウェイトアンドバイアスを試す

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




ニューラルネットワークにおけるドロップアウトの適用箇所はどこですか。

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

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

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

結論

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