Gdzie powinienem umieścić warstwy odpadające w sieci neuronowej?

65

Czy istnieją jakieś ogólne wytyczne dotyczące miejsca umieszczania warstw odpadających w sieci neuronowej?

Franck Dernoncourt
źródło
1
Użycie losowej regulacji regularnie wyłącza pewną część neuronów w ukrytej warstwie. W bibliotece Keras możesz dodać porzucanie po dowolnej ukrytej warstwie, a także możesz określić współczynnik porzucania, który określa procent wyłączonych neuronów w poprzedniej warstwie.
zadośćuczynienie
czy uprawianie karmy jest tutaj dozwolone?
zadośćuczynienie
4
@redress, która uprawiała i jak?
Franck Dernoncourt
Czy rozwiązałeś tę odpowiedź?
Blaszard,
Jakie typy sieci neuronowych? CNN, RNN, inne?
Wayne,

Odpowiedzi:

34

W oryginalnym artykule, w którym zaproponowano warstwy zrywające, autorstwa Hintona (2012) , zrzucono (przy p = 0,5) na każdej z w pełni połączonych (gęstych) warstw przed wydrukiem; nie zastosowano go na warstwach splotowych. Ta stała się najczęściej używaną konfiguracją.

Nowsze badania wykazały pewną wartość w stosowaniu rezygnacji również z warstw splotowych, chociaż na znacznie niższych poziomach: p = 0,1 lub 0,2. Usunięcie zastosowano po funkcji aktywacji każdej warstwy splotowej: CONV-> RELU-> DROP.

4Oh4
źródło
Czy powinny być one umieszczone po wszystkich warstwach, czy tylko tych z aktywacją nieliniową? Na przykład, biorąc pod uwagę splot 2D z reluaktywacją, po której następuje warstwa maksimum puli, czy warstwa odpadająca (2D) powinna iść natychmiast po splotie, czy po warstwie maksimum puli, czy też obie, czy to nie ma znaczenia?
z0r,
1
Zaktualizowałem odpowiedź, aby wyjaśnić, że w pracy Park i wsp. Porzucenie zastosowano po RELUkażdej warstwie CONV. Nie sądzę, aby zbadali wpływ dodania porzucania po maksymalnych warstwach pulowania.
4Oh4
Warto zauważyć, że w pracy Hintona, na stronie 10 (1938), piszą, że stosowanie rezygnacji z warstw splotowych podczas testowania zestawu danych Google Street View zmniejszyło błąd klasyfikacji.
Miki P
9

Przed każdą projekcją liniową. Patrz Srivastava i in. (2014) .

jnhwkim
źródło
4
Pozostałe odpowiedzi opisują, jak zastosować rezygnację, ale jest to jedyna odpowiedź, która odpowiada na pytanie PO, gdzie zastosować rezygnację.
stormont
3

W oryginalnym papierze zaproponowano warstwy odpadające, które zastosowano na każdej z w pełni połączonych (gęstych) warstw przed wydrukiem; nie zastosowano go na warstwach splotowych.

Nie wolno nam używać warstwy odpadającej po warstwie splotowej, ponieważ przesuwając filtr na szerokość i wysokość obrazu wejściowego, tworzymy dwuwymiarową mapę aktywacji, która daje odpowiedzi tego filtra w każdej pozycji przestrzennej. Tak więc, gdy warstwa odpadowa neutralizuje (zeruje) losowe neurony, istnieje szansa na utratę bardzo ważnej cechy na obrazie w naszym procesie treningowym.

Pooja Sonkar
źródło
2

Jeśli się nie mylę, możesz dodać to po nieliniowości każdej komórki:

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

Pierwszy wiersz to funkcja aktywacji, a ostatni to dodanie wyniku do wyniku. Proszę odnieść się do tego bloga . Mam nadzieję że to pomoże.

Możesz też umieścić go na stronie wejściowej, tak jak w tym fragmencie:

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

Źródło: https://github.com/spro/practical-pytorch/blob/master/seq2seq-translation/seq2seq-translation.ipynb

Technicznie możesz dodać warstwę usuwaną na końcu bloku, na przykład po splotie lub po kodowaniu RNN.

Lerner Zhang
źródło
Gdzie jest zdefiniowany GeneralAttn?
rafaelvalle