Где я должен разместить выпадающие слои в нейронной сети?


65

Существуют ли общие рекомендации о том, где размещать выпадающие слои в нейронной сети?


1
Использование регуляризации выпадения случайным образом отключает некоторую часть нейронов в скрытом слое. В библиотеке Keras вы можете добавить выпадающий список после любого скрытого слоя и указать частоту выпадения, которая определяет процент отключенных нейронов в предыдущем слое.
возмещение

разрешено ли здесь кармическое земледелие?
возмещение

4
@redress кто занимался сельским хозяйством и как?
Франк Дернонкур

Вы решили этот ответ?
Блазард

Какие типы нейронных сетей? CNN, RNN, другие?
Уэйн

Ответы:


34

В оригинальной статье, в которой предлагались выпадающие слои, Хинтон (2012) , выпадение (с p = 0,5) использовалось на каждом из полностью связанных (плотных) слоев перед выходом; это не использовалось на сверточных слоях. Это стало наиболее часто используемой конфигурацией.

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


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

1
Я обновил ответ, чтобы уточнить, что в работе Park et al. Выпадение было применено после RELUкаждого слоя CONV. Я не верю, что они исследовали эффект добавления отсева после максимального объединения пулов.
4O4

Стоит отметить, что в статье Хинтона на странице 10 (1938 г.) они пишут, что использование выпадения на сверточных слоях при тестировании с набором данных Google Street View уменьшило ошибку классификации.
Мики П

9

Перед каждой линейной проекцией. См. Шривастава и соавт. (2014) .


5
Другие ответы описывают, как применять отсев, но это единственный ответ, который отвечает на вопрос OP о том, где применять отсев.
Stormont

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.