신경망에서 드롭 아웃 레이어를 배치 할 위치에 대한 일반적인 지침이 있습니까?
신경망에서 드롭 아웃 레이어를 배치 할 위치에 대한 일반적인 지침이 있습니까?
답변:
Hinton (2012)에 의해 드롭 아웃 레이어를 제안한 최초의 논문에서 , 드롭 아웃 (p = 0.5)은 출력 전에 완전히 연결된 (고밀도) 레이어 각각에 사용되었다; 컨벌루션 레이어에는 사용되지 않았습니다. 이것이 가장 일반적으로 사용되는 구성이되었습니다.
가장 최근의 연구 는 p = 0.1 또는 0.2보다 훨씬 낮은 수준이지만 컨볼 루션 레이어에도 드롭 아웃을 적용하는 데 약간의 가치가 있음을 보여주었습니다. 각 컨볼 루션 레이어의 활성화 기능인 CONV-> RELU-> DROP 후에 드롭 아웃이 사용되었습니다.
relu
활성화 후 최대 풀링 레이어가 있는 2D 컨벌루션이 주어지면 (2D) 드롭 아웃 레이어가 컨볼 루션 직후 또는 최대 풀링 레이어 또는 둘 다 후에 가야합니까, 아니면 중요하지 않습니까?
RELU
각 CONV 레이어에 적용된 후에 명확하게 적용되도록 답변을 업데이트했습니다 . 나는 그들이 최대 풀링 레이어 다음에 드롭 아웃을 추가하는 효과를 조사했다고 생각하지 않습니다.
모든 선형 투영 앞에. 참조 스리 바스타 등의 알. (2014) .
내가 틀리지 않으면 모든 셀의 비선형 성 후에 추가 할 수 있습니다.
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 인코딩 후에 드롭 아웃 레이어를 추가 할 수 있습니다.