Де слід розміщувати шари відсіву в нейронній мережі?


65

Чи є загальні вказівки щодо того, де розмістити шари, що випадають в нейронну мережу?


1
Використання регуляризації випадання випадковим чином вимикає деяку частину нейронів у прихованому шарі. У бібліотеці Кераса ви можете додати випадання після будь-якого прихованого шару, а також можна вказати швидкість випадання, яка визначає відсоток відключених нейронів у попередньому шарі.
відшкодування

чи дозволено ведення карми тут?
відшкодування

4
@redress хто господарював, і як?
Френк Дернонкурт

Ви вирішили цю відповідь?
Blaszard

Які типи нейронних мереж? CNN, RNN, інші?
Уейн

Відповіді:


34

У оригінальній статті, що пропонував шари випадання, від Hinton (2012) , випадання (з р = 0,5) було використано на кожному з повністю пов'язаних (щільних) шарів до виходу; його не застосовували на згорткових шарах. Це стало найбільш часто використовуваною конфігурацією.

Більш недавні дослідження показали деяку цінність у застосуванні відсіву також на згорткових шарах, хоча на значно нижчих рівнях: p = 0,1 або 0,2. Випадання використовувалося після функції активації кожного згорткового шару: CONV-> RELU-> DROP.


Тож чи слід їх розміщувати після всіх шарів або лише тих, що мають нелінійну активацію? Наприклад, дається 2D згортання з reluактивацією, що супроводжується максимумом шару об'єднання, чи повинен (2D) випадаючий шар переходити відразу після згортання, або після шару максимального об'єднання, або обох, чи це не має значення?
z0r

1
Я оновив відповідь, щоб уточнити, що у роботі Park et al. Відміни застосовувались після RELUкожного шару CONV. Я не вірю, що вони досліджували ефект додавання відсіву після максимального об'єднання шарів.
4Oh4

Варто зауважити, що в роботі Hinton, на сторінці 10 (1938), вони пишуть, що використання відсіву на згорткових шарах при тестуванні на набір даних Google Street View зменшило помилку класифікації.
Мікі П

9

Перед кожною лінійною проекцією. Зверніться до Srivastava та ін. (2014) .


4
Інші відповіді описують, як застосовувати відмову, але це єдина відповідь, яка відповідає на питання ОП про те, де застосувати відмову.
штормонець

3

В оригінальному папері запропоновані шари випадання, які використовувались на кожному повністю з'єднаному (щільному) шарі перед виходом; його не застосовували на згорткових шарах.

Ми не повинні використовувати шар випадання після згорткового шару, оскільки ми пересуваємо фільтр по ширині та висоті вхідного зображення, ми створюємо двовимірну карту активації, яка дає відповіді цього фільтра у кожному просторовому положенні. Так як шар випадає нейтралізує (робить його нульовим) випадкові нейрони, є шанси втратити дуже важливу особливість у зображенні в нашому тренувальному процесі.


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.