신경망에서 드롭 아웃 레이어를 어디에 배치해야합니까?


65

신경망에서 드롭 아웃 레이어를 배치 할 위치에 대한 일반적인 지침이 있습니까?


1
드롭 아웃 정규화를 사용하면 숨겨진 레이어에서 뉴런의 일부가 무작위로 비활성화됩니다. Keras 라이브러리에서 숨겨진 레이어 뒤에 드롭 아웃 을 추가 할 수 있으며 드롭 아웃 비율을 지정하여 이전 레이어에서 비활성화 된 뉴런의 백분율을 결정합니다.
시정

카르마 농업은 여기서 허용됩니까?
시정

4
누가 농사를 고쳤습니까?
Franck Dernoncourt

이 답변을 해결 했습니까?
Blaszard

어떤 종류의 신경망? CNN, RNN, 기타?
Wayne

답변:


34

Hinton (2012)에 의해 드롭 아웃 레이어를 제안한 최초의 논문에서 , 드롭 아웃 (p = 0.5)은 출력 전에 완전히 연결된 (고밀도) 레이어 각각에 사용되었다; 컨벌루션 레이어에는 사용되지 않았습니다. 이것이 가장 일반적으로 사용되는 구성이되었습니다.

가장 최근의 연구 는 p = 0.1 또는 0.2보다 훨씬 낮은 수준이지만 컨볼 루션 레이어에도 드롭 아웃을 적용하는 데 약간의 가치가 있음을 보여주었습니다. 각 컨볼 루션 레이어의 활성화 기능인 CONV-> RELU-> DROP 후에 드롭 아웃이 사용되었습니다.


그렇다면 모든 레이어 뒤에, 또는 비선형 활성화 된 레이어 뒤에 배치해야합니까? 예를 들어 relu활성화 후 최대 풀링 레이어가 있는 2D 컨벌루션이 주어지면 (2D) 드롭 아웃 레이어가 컨볼 루션 직후 또는 최대 풀링 레이어 또는 둘 다 후에 가야합니까, 아니면 중요하지 않습니까?
z0r

1
Park et al.의 작업에서 드롭 아웃이 RELU각 CONV 레이어에 적용된 후에 명확하게 적용되도록 답변을 업데이트했습니다 . 나는 그들이 최대 풀링 레이어 다음에 드롭 아웃을 추가하는 효과를 조사했다고 생각하지 않습니다.
4Oh4

Hinton 논문 (1938 페이지)의 Google Street View 데이터 세트에 대해 테스트 할 때 컨볼 루션 레이어에서 드롭 아웃을 사용하면 분류 오류가 줄었다는 점에 주목할 가치가 있습니다.
Miki P


3

원래 논문은 출력 전에 완전히 연결된 (밀집된) 각 레이어에 사용되는 드롭 아웃 레이어를 제안했습니다. 컨벌루션 레이어에는 사용되지 않았습니다.

입력 이미지의 너비와 높이로 필터를 슬라이드 할 때 컨볼 루션 레이어 뒤에 드롭 아웃 레이어를 사용해서는 안됩니다. 모든 공간 위치에서 해당 필터의 응답을 제공하는 2 차원 활성화 맵을 생성합니다. 따라서 드롭 아웃 레이어가 임의의 뉴런을 중화 (제로화)함에 따라 훈련 과정에서 이미지에서 매우 중요한 기능을 잃어 버릴 가능성이 있습니다.


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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.