Onde devo colocar as camadas de dropout em uma rede neural?

65

Existe alguma orientação geral sobre onde colocar camadas de dropout em uma rede neural?

Franck Dernoncourt
fonte
11
O uso da regularização de abandono desativa aleatoriamente uma parte dos neurônios em uma camada oculta. Na biblioteca Keras, você pode adicionar desistências após qualquer camada oculta e especificar uma taxa de desistência, que determina a porcentagem de neurônios desativados na camada anterior.
reparação
aqui é permitido o cultivo de karma?
reparação
4
@redress quem cultivou, e como?
Franck Dernoncourt
Você resolveu esta resposta?
Blaszard 12/08/19
Que tipos de redes neurais? CNN, RNN, outro?
Wayne

Respostas:

34

No artigo original que propôs camadas de abandono, por Hinton (2012) , o abandono (com p = 0,5) foi usado em cada uma das camadas (densas) totalmente conectadas antes da saída; não foi usado nas camadas convolucionais. Essa se tornou a configuração mais usada.

Pesquisas mais recentes mostraram algum valor na aplicação do abandono também em camadas convolucionais, embora em níveis muito mais baixos: p = 0,1 ou 0,2. O abandono foi utilizado após a função de ativação de cada camada convolucional: CONV-> RELU-> DROP.

4Oh4
fonte
Então, eles devem ser colocados após todas as camadas, ou apenas aquelas com uma ativação não linear? Por exemplo, dada uma convolução 2D com uma reluativação seguida por uma camada de pool máximo, a camada de abandono (2D) deve ir imediatamente após a convolução, ou após a camada de pool máximo, ou ambas, ou isso não importa?
Z0r 23/09/19
11
Atualizei a resposta para esclarecer que, no trabalho de Park et al., O abandono foi aplicado após o RELUem cada camada CONV. Não acredito que eles tenham investigado o efeito da adição de desistências após o máximo de camadas de pool.
precisa saber é
Vale a pena notar que, no artigo de Hinton, na página 10 (1938), eles escrevem que o uso da desistência em camadas convolucionais ao testar no conjunto de dados do Google Street View reduziu o erro de classificação.
Miki P
9

Na frente de todas as projeções lineares. Consulte Srivastava et al. (2014) .

jnhwkim
fonte
5
As outras respostas descrevem como aplicar a desistência, mas essa é a única resposta que responde à pergunta do OP sobre onde aplicar a desistência.
stormont
3

O documento original propunha camadas de abandono que eram usadas em cada uma das camadas (densas) totalmente conectadas antes da saída; não foi usado nas camadas convolucionais.

Não devemos usar a camada de eliminação após a camada convolucional. Ao deslizar o filtro sobre a largura e a altura da imagem de entrada, produzimos um mapa de ativação bidimensional que fornece as respostas desse filtro em todas as posições espaciais. Assim, à medida que a camada de abandono neutraliza (torna zero) os neurônios aleatórios, há chances de perder recursos muito importantes em uma imagem em nosso processo de treinamento.

Pooja Sonkar
fonte
2

Se não estou errado, você pode adicioná-lo após a não linearidade de cada célula:

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

A primeira linha é a função de ativação e a última é a adição do dropout ao resultado. Por favor, consulte este blog . Espero que isto ajude.

Ou você pode colocá-lo na incorporação de entrada como neste trecho:

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

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

Tecnicamente, você pode adicionar a camada de eliminação no final de um bloco, por exemplo, após a convolução ou após a codificação RNN.

Lerner Zhang
fonte
Onde o GeneralAttn está definido?
Rafaelvalle # 28/17