Di mana saya harus meletakkan layer dropout di jaringan saraf?

65

Apakah ada pedoman umum tentang di mana menempatkan lapisan dropout di jaringan saraf?

Franck Dernoncourt
sumber
1
Menggunakan dropout regularisasi secara acak menonaktifkan sebagian neuron di lapisan tersembunyi. Di pustaka Keras, Anda bisa menambahkan dropout setelah lapisan tersembunyi, dan Anda bisa menentukan tingkat dropout, yang menentukan persentase neuron yang dinonaktifkan di lapisan sebelumnya.
ganti rugi
Apakah pertanian karma diizinkan di sini?
ganti rugi
4
@ kantor yang bertani, dan bagaimana?
Franck Dernoncourt
Apakah Anda menyelesaikan jawaban ini?
Blaszard
Apa jenis jaringan saraf? CNN, RNN, lainnya?
Wayne

Jawaban:

34

Dalam makalah asli yang mengusulkan lapisan dropout, oleh Hinton (2012) , dropout (dengan p = 0,5) digunakan pada masing-masing lapisan (padat) yang terhubung sepenuhnya sebelum output; itu tidak digunakan pada lapisan konvolusional. Ini menjadi konfigurasi yang paling umum digunakan.

Penelitian yang lebih baru telah menunjukkan beberapa nilai dalam menerapkan dropout juga ke lapisan konvolusional, meskipun pada tingkat yang jauh lebih rendah: p = 0,1 atau 0,2. Dropout digunakan setelah fungsi aktivasi setiap lapisan konvolusional: CONV-> RELU-> DROP.

4Oh4
sumber
Jadi haruskah mereka ditempatkan setelah semua lapisan, atau hanya yang dengan aktivasi non-linear? Misalnya diberi konvolusi 2D dengan reluaktivasi diikuti oleh lapisan penggabungan maks, haruskah lapisan putus (2D) langsung pergi setelah konvolusi, atau setelah lapisan penyatuan maks, atau keduanya, atau apakah itu tidak masalah?
z0r
1
Saya telah memperbarui jawaban untuk mengklarifikasi bahwa dalam karya Park dkk., Dropout diterapkan setelah RELUpada setiap lapisan CONV. Saya tidak percaya mereka menyelidiki efek penambahan dropout berikut lapisan penyatuan maks.
4Oh4
Perlu dicatat bahwa dalam makalah Hinton, pada halaman 10 (1938), mereka menulis bahwa menggunakan dropout pada lapisan convolutional ketika pengujian terhadap dataset Google Street View mengurangi kesalahan klasifikasi.
Miki P
9

Di depan setiap proyeksi linier. Lihat Srivastava et al. (2014) .

jnhwkim
sumber
5
Jawaban lain menjelaskan cara menerapkan dropout, tetapi ini adalah satu-satunya jawaban yang menjawab pertanyaan OP di mana menerapkan dropout.
stormont
3

Makalah asli mengusulkan lapisan putus sekolah yang digunakan pada masing-masing lapisan (padat) yang terhubung sepenuhnya sebelum output; itu tidak digunakan pada lapisan konvolusional.

Kita tidak boleh menggunakan lapisan putus sekolah setelah lapisan konvolusional karena kita menggeser filter di atas lebar dan tinggi gambar input, kita menghasilkan peta aktivasi 2 dimensi yang memberikan respons dari filter itu di setiap posisi spasial. Jadi ketika lapisan dropout menetralkan (menjadikannya nol) neuron acak ada kemungkinan kehilangan fitur yang sangat penting dalam gambar dalam proses pelatihan kami.

Pooja Sonkar
sumber
2

Jika saya tidak salah, Anda dapat menambahkannya setelah non-linearitas setiap sel:

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

Baris pertama adalah fungsi aktivasi, dan yang terakhir adalah menambahkan dropout ke hasilnya. Silakan merujuk ke blog ini . Semoga ini membantu.

Atau Anda dapat menempatkannya di penyisipan input seperti dalam cuplikan ini:

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

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

Secara teknis Anda dapat menambahkan lapisan putus sekolah di akhir blok, misalnya setelah konvolusi atau setelah pengkodean RNN.

Lerner Zhang
sumber
Di mana GeneralAttn didefinisikan?
rafaelvalle