ニューラルネットワークのドロップアウトレイヤーはどこに配置すればよいですか?


65

ニューラルネットワークのドロップアウトレイヤーを配置する場所に関する一般的なガイドラインはありますか?


1
ドロップアウト正則化を使用すると、隠れ層のニューロンの一部がランダムに無効になります。Kerasライブラリでは、非表示のレイヤーの後にドロップアウトを追加できます。ドロップアウト率を指定して、前のレイヤーの無効なニューロンの割合を決定できます。
救済

カルマ農業はここで許可されていますか?
救済

4
@redress誰が農業をし、どのように?
フランクダーノンクール

この答えを解決しましたか?
ブラザード

どのような種類のニューラルネットワークですか?CNN、RNN、その他?
ウェイン

回答:


34

Hinout(2012)によるドロップアウトレイヤーを提案した元の論文では、出力前に完全に接続された(密な)レイヤーのそれぞれでドロップアウト(p = 0.5)が使用されました。畳み込み層では使用されませんでした。これが最も一般的に使用される構成になりました。

より最近の研究では、ドロップアウトを畳み込み層にも適用することである程度の価値が示されていますが、はるかに低いレベルではあります:p = 0.1または0.2。ドロップアウトは、各畳み込み層の活性化機能の後に使用されました:CONV-> RELU-> DROP。


したがって、それらはすべてのレイヤーの後に配置する必要がありますか、それとも非線形のアクティブ化を持つレイヤーのみに配置する必要がありますか?たとえば、2Dコンボリューションにreluアクティベーションと最大プールレイヤーが続く場合、(2D)ドロップアウトレイヤーはコンボリューションの直後、または最大プーリングレイヤー、あるいはその両方の直後に行くべきですか、それとも重要ではありませんか?
z0r

1
Park等の研究では、ドロップアウトはRELU各CONV層の後に適用されたことを明確にするために回答を更新しました。私は彼らが最大プーリング層の後にドロップアウトを追加する効果を調査したとは思わない。
4Oh4

ヒントンの論文の10ページ(1938年)には、Google Street Viewデータセットに対するテスト時に畳み込み層でドロップアウトを使用すると分類エラーが減少したと書いてあります。
ミキP

9

すべての線形投影の前。Srivastavaらを参照してください(2014)


5
他の回答はドロップアウトを適用する方法を説明ていますが、これはドロップアウトを適用する場所に関するOPの質問に答える唯一の回答です。
stormont

3

元の論文では、出力の前に完全に接続された(密な)レイヤーのそれぞれで使用されるドロップアウトレイヤーを提案しました。畳み込み層では使用されませんでした。

入力画像の幅と高さにわたってフィルターをスライドさせるため、畳み込みレイヤーの後にドロップアウトレイヤーを使用しないでください。すべての空間位置でそのフィルターの応答を提供する2次元の活性化マップを生成します。そのため、ドロップアウトレイヤーがランダムニューロンを中和(ゼロにする)ため、トレーニングプロセスの画像で非常に重要な機能が失われる可能性があります。


2

私が間違っていなければ、すべてのセルの非線形性の後に追加できます。

layer_1 = (1/(1+np.exp(-(np.dot(X,synapse_0)))))
if(do_dropout):
    layer_1 *= np.random.binomial([np.ones((len(X),hidden_dim))],1-dropout_percent)[0] * (1.0/(1-dropout_percent))

最初の行はアクティベーション関数であり、最後の行は結果にドロップアウトを追加しています。このブログを参照しください。お役に立てれば。

または、次のスニペットのように入力埋め込みに配置できます。

class BahdanauAttnDecoderRNN(nn.Module):
    def __init__(self, hidden_size, output_size, n_layers=1, dropout_p=0.1):
        super(AttnDecoderRNN, self).__init__()

        # Define parameters
        self.hidden_size = hidden_size
        self.output_size = output_size
        self.n_layers = n_layers
        self.dropout_p = dropout_p
        self.max_length = max_length

        # Define layers
        self.embedding = nn.Embedding(output_size, hidden_size)
        self.dropout = nn.Dropout(dropout_p)
        self.attn = GeneralAttn(hidden_size)
        self.gru = nn.GRU(hidden_size * 2, hidden_size, n_layers, dropout=dropout_p)
        self.out = nn.Linear(hidden_size, output_size)

    def forward(self, word_input, last_hidden, encoder_outputs):
        # Note that we will only be running forward for a single decoder time step, but will use all encoder outputs

        # Get the embedding of the current input word (last output word)
        word_embedded = self.embedding(word_input).view(1, 1, -1) # S=1 x B x N
        word_embedded = self.dropout(word_embedded)

        # Calculate attention weights and apply to encoder outputs
        attn_weights = self.attn(last_hidden[-1], encoder_outputs)
        context = attn_weights.bmm(encoder_outputs.transpose(0, 1)) # B x 1 x N

        # Combine embedded input word and attended context, run through RNN
        rnn_input = torch.cat((word_embedded, context), 2)
        output, hidden = self.gru(rnn_input, last_hidden)

        # Final output layer
        output = output.squeeze(0) # B x N
        output = F.log_softmax(self.out(torch.cat((output, context), 1)))

        # Return final output, hidden state, and attention weights (for visualization)
        return output, hidden, attn_weights

ソース:https : //github.com/spro/practical-pytorch/blob/master/seq2seq-translation/seq2seq-translation.ipynb

技術的には、たとえば畳み込みの後またはRNNエンコードの後に​​、ブロックの最後にドロップアウトレイヤーを追加できます。


GeneralAttnはどこで定義されていますか?
rafaelvalle
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.