Skip to main content

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

PyTorchモデルをドロップアウトで正則化する方法を学びましょう。コードチュートリアルとインタラクティブな視覚化を含みます。
Created on August 5|Last edited on August 5
このレポートでは、PyTorchモデルにドロップアウト正則化を追加する例を見て、Weights & Biasesでモデルを追跡することによって、ドロップアウトがモデルのパフォーマンスに与える影響を観察します。
馴染みのない方のために、ドロップアウトが何をするのか説明します。すでにご存知の方は、次のことができます。
Jump to the tutorial


私たちが取り上げる内容



ドロップアウト正則化とは、機械学習において過学習を防ぐための手法です。

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

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

このColabでPyTorchのドロップアウトの例を実行する→

理解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. ドロップアウトがモデルの性能に与える影響を観察する

ドロップアウト効果を観察するために、モデルを訓練する画像分類まず非正則化ネットワークを訓練し、その後、Dropoutで正則化したネットワークを訓練します。これらのモデルはそれぞれ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正則化の影響

「ドロップアウト正則化を使用することの影響は何ですか?」これにより、次のことがわかります。
  • 正則化されていないネットワークは、訓練データセットにすぐに過適合します。検証損失の変化に注意してください。without-dropout数エポック後に実行が大きく発散します。これがより高い汎化誤差の原因です。
  • ドロップアウト率25%の2つのドロップアウト層でトレーニングすると、モデルの過学習を防ぐことができます。ただし、これによりトレーニング精度が低下するため、正則化されたネットワークをより長く訓練する必要があります。
  • ドロップアウトはモデルの汎化性能を向上させます。正則化されていないネットワークと比べて訓練精度は低くなりますが、全体的な検証精度は向上しています。これは汎化誤差が低いことを示しています。
以上で、PyTorchモデルにおけるDropoutの使用に関する短いチュートリアルを終了します。

ドロップアウトコラボをお試しください →

Weights & Biasesを試してみてください。

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




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

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

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

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

結論

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