Wo soll ich Dropout-Layer in einem neuronalen Netzwerk platzieren?

65

Gibt es allgemeine Richtlinien zum Platzieren von Dropout-Layern in einem neuronalen Netzwerk?

Franck Dernoncourt
quelle
1
Die Verwendung der Dropout-Regularisierung deaktiviert zufällig einen Teil der Neuronen in einer verborgenen Schicht. In der Keras Bibliothek können Sie fügen Dropout nach jeder verborgenen Schicht, und man kann eine Dropout - Rate angeben, die den Prozentsatz der behinderten Neuronen in der vorhergehenden Schicht bestimmt.
Wiedergutmachung
Ist Karma-Farming hier erlaubt?
Wiedergutmachung
4
@redress wer bewirtschaftet und wie?
Franck Dernoncourt
Haben Sie diese Antwort gelöst?
Blaszard
Welche Arten von neuronalen Netzen? CNN, RNN, andere?
Wayne

Antworten:

34

In der Originalarbeit, die Dropout-Schichten vorschlug, von Hinton (2012) , wurde Dropout (mit p = 0,5) für jede der vollständig verbundenen (dichten) Schichten vor der Ausgabe verwendet. es wurde nicht auf den Faltungsschichten verwendet. Dies wurde die am häufigsten verwendete Konfiguration.

Neuere Forschungen haben gezeigt, dass das Anwenden von Dropout auch auf Faltungsschichten einen gewissen Wert hat, obwohl dies bei viel niedrigeren Niveaus der Fall ist: p = 0,1 oder 0,2. Dropout wurde nach der Aktivierungsfunktion jeder Faltungsschicht verwendet: CONV-> RELU-> DROP.

4Oh4
quelle
Sollen sie also nach allen Ebenen platziert werden oder nur nach denjenigen mit einer nichtlinearen Aktivierung? Sollte bei einer 2D-Faltung mit einer reluAktivierung gefolgt von einer Max-Pooling-Schicht die (2D-) Dropout-Schicht unmittelbar nach der Faltung oder nach der Max-Pooling-Schicht oder beidem verlaufen oder spielt dies keine Rolle?
23.
1
Ich habe die Antwort aktualisiert, um zu verdeutlichen, dass in der Arbeit von Park et al. Das Dropout nach dem RELUauf jeder CONV-Ebene angewendet wurde. Ich glaube nicht, dass sie den Effekt des Hinzufügens von Dropouts nach Max-Pooling-Schichten untersucht haben.
4Oh4
Es ist erwähnenswert, dass in der Hinton-Veröffentlichung auf Seite 10 (1938) darauf hingewiesen wird, dass die Verwendung von Dropout auf Faltungsebenen beim Testen mit dem Google Street View-Datensatz den Klassifizierungsfehler verringert.
Miki P
9

Vor jeder linearen Projektion. Siehe Srivastava et al. (2014) .

jnhwkim
quelle
5
Die anderen Antworten beschreiben, wie Dropout angewendet wird. Dies ist jedoch die einzige Antwort auf die Frage des OP, wo Dropout angewendet werden soll.
Stormont
3

Das Originalpapier schlug Dropout-Schichten vor, die auf jeder der vollständig verbundenen (dichten) Schichten vor der Ausgabe verwendet wurden. es wurde nicht auf den Faltungsschichten verwendet.

Wir dürfen keine Dropout-Schicht nach der Faltungsschicht verwenden, da wir den Filter über die Breite und Höhe des Eingabebildes schieben. Wir erstellen eine zweidimensionale Aktivierungskarte, die die Antworten dieses Filters an jeder räumlichen Position angibt. Wenn die Dropout-Schicht zufällige Neuronen neutralisiert (auf Null stellt), besteht die Möglichkeit, dass sehr wichtige Merkmale in einem Bild in unserem Trainingsprozess verloren gehen.

Pooja Sonkar
quelle
2

Wenn ich mich nicht irre, können Sie es nach der Nichtlinearität jeder Zelle hinzufügen:

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))

Die erste Zeile ist die Aktivierungsfunktion, und die letzte Zeile fügt das Dropout zum Ergebnis hinzu. Bitte beziehen Sie sich auf diesen Blog . Hoffe das hilft.

Oder Sie können es in die Eingabe einbetten, wie in diesem Snippet:

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

Quelle: https://github.com/spro/practical-pytorch/blob/master/seq2seq-translation/seq2seq-translation.ipynb

Technisch gesehen können Sie die Dropout-Ebene am Ende eines Blocks hinzufügen, beispielsweise nach der Faltung oder nach der RNN-Codierung.

Lerner Zhang
quelle
Wo ist GeneralAttn definiert?
Rafaelvalle