A pergunta original era especificamente com relação às implementações do TensorFlow. No entanto, as respostas são para implementações em geral. Essa resposta geral também é a resposta correta para o TensorFlow.
Ao usar normalização em lote e dropout no TensorFlow (especificamente usando contrib.layers), preciso me preocupar com o pedido?
Parece possível que, se eu usar o dropout seguido imediatamente pela normalização em lote, possa haver problemas. Por exemplo, se a mudança na normalização do lote treina para os números da escala maior das saídas de treinamento, mas então essa mesma mudança é aplicada aos números da escala menor (devido à compensação por ter mais saídas) sem abandono durante o teste, então isso o turno pode estar desligado. A camada de normalização de lote do TensorFlow compensa isso automaticamente? Ou isso não acontece por algum motivo que estou perdendo?
Além disso, há outras armadilhas a serem observadas ao usar esses dois juntos? Por exemplo, supondo que estou usá-los na ordem correcta no que diz respeito ao acima (assumindo que não é uma ordem correcta), pode haver problemas com o uso de tanto a normalização em lotes e abandono em várias camadas sucessivas? Não vejo imediatamente um problema nisso, mas posso estar faltando alguma coisa.
Muito obrigado!
ATUALIZAR:
Um teste experimental parece sugerir que ordenação faz importa. Executei a mesma rede duas vezes apenas com a norma batch e dropout reverso. Quando o abandono ocorre antes da norma do lote, a perda de validação parece aumentar à medida que a perda de treinamento diminui. Ambos estão caindo no outro caso. Mas no meu caso os movimentos são lentos, então as coisas podem mudar depois de mais treinamento e é apenas um único teste. Uma resposta mais definitiva e informada ainda seria apreciada.
fonte
Conforme observado nos comentários, um recurso incrível para ler sobre a ordem das camadas está aqui . Eu li os comentários e é o melhor recurso sobre o assunto que encontrei na internet
Meus 2 centavos:
O dropout tem como objetivo bloquear completamente a informação de certos neurônios para garantir que os neurônios não se co-adaptem. Portanto, a normalização do lote deve ser após o dropout, caso contrário, você está passando informações por meio de estatísticas de normalização.
Se você pensar sobre isso, em problemas típicos de ML, esse é o motivo pelo qual não calculamos a média e o desvio padrão sobre dados inteiros e depois os dividimos em conjuntos de treinamento, teste e validação. Nós dividimos e, em seguida, calculamos as estatísticas sobre o conjunto de trem e as usamos para normalizar e centralizar os conjuntos de dados de validação e teste
então, sugiro o Esquema 1 (leva em consideração o comentário de pseudomarvin sobre a resposta aceita)
-> CONV / FC -> ReLu (ou outra ativação) -> Desistência -> BatchNorm -> CONV / FC
em oposição ao Esquema 2
-> CONV / FC -> BatchNorm -> ReLu (ou outra ativação) -> Dropout -> CONV / FC -> na resposta aceita
Observe que isso significa que a rede no Esquema 2 deve mostrar sobreajuste em comparação com a rede no Esquema 1, mas o OP executou alguns testes conforme mencionado em questão e eles suportam o Esquema 2
fonte
Normalmente, basta descartar o
Dropout
(quando você tiverBN
):Dropout
em alguns casos, o BN fornece benefícios de regularização semelhantes aos do abandono intuitivamente"Dropout
Para obter mais detalhes, consulte este artigo [ Compreendendo a desarmonia entre o abandono e a normalização do lote por mudança de variância ], conforme já mencionado por @Haramoz nos comentários.
fonte
what about MLPs is it useful to combine them
, você quis dizer issoIs it useful to combine Dropout and BN when using MLPs
? Minha opinião sobre isso é que depende principalmente do tamanho do seu modelo e da quantidade de dados de treinamento que você tem.Encontrei um artigo que explica a desarmonia entre Dropout e Batch Norm (BN). A ideia principal é o que eles chamam de "mudança de variância" . Isso se deve ao fato do abandono ter um comportamento diferente entre as fases de treinamento e teste, o que altera as estatísticas de entrada que o BN aprende. A ideia principal pode ser encontrada nesta figura retirada deste artigo .
Uma pequena demonstração desse efeito pode ser encontrada neste notebook .
fonte
Com base no artigo de pesquisa para um melhor desempenho, devemos usar BN antes de aplicar Dropouts
fonte
A ordem correta é: Conv> Normalização> Ativação> Desistência> Pooling
fonte
Conv - Ativação - DropOut - BatchNorm - Pool -> Test_loss: 0,04261355847120285
Conv - Ativação - DropOut - Pool - BatchNorm -> Test_loss: 0.050065308809280396
Conv - Ativação - BatchNorm - Pool - DropOut -> Test_loss: 0,04911309853196144
Conv - Ativação - BatchNorm - DropOut - Pool -> Test_loss: 0,06809622049331665
Conv - BatchNorm - Ativação - DropOut - Pool -> Test_loss: 0,038886815309524536
Conv - BatchNorm - Ativação - Pool - DropOut -> Test_loss: 0,04126095026731491
Conv - BatchNorm - DropOut - Ativação - Pool -> Test_loss: 0,05142546817660332
Conv - DropOut - Ativação - BatchNorm - Pool -> Test_loss: 0,04827788099646568
Conv - DropOut - Ativação - Pool - BatchNorm -> Test_loss: 0,04722036048769951
Conv - DropOut - BatchNorm - Ativação - Pool -> Test_loss: 0,03238215297460556
Treinado no conjunto de dados MNIST (20 épocas) com 2 módulos convolucionais (veja abaixo), seguido de cada vez com
As camadas convolucionais têm um tamanho de kernel de
(3,3)
, preenchimento padrão, a ativação éelu
. O Pooling é um MaxPooling da beira da piscina(2,2)
. A perda écategorical_crossentropy
e o otimizador tambémadam
.A probabilidade de dropout correspondente é
0.2
ou0.3
, respectivamente. A quantidade de mapas de recursos é32
ou64
, respectivamente.Edit: Quando deixei cair o Dropout, como recomendado em algumas respostas, ele convergiu mais rápido, mas tinha uma capacidade de generalização pior do que quando eu uso BatchNorm e Dropout.
fonte
ConV / FC - BN - Sigmóide / tanh - abandono. Se a função de ativação for Relu ou não, a ordem de normalização e dropout depende da sua tarefa
fonte
Eu li os papéis recomendados na resposta e comentários de https://stackoverflow.com/a/40295999/8625228
Do ponto de vista de Ioffe e Szegedy (2015), use apenas BN na estrutura da rede. Li et al. (2018) fornecem as análises estatísticas e experimentais, que há uma mudança de variância quando os profissionais usam Dropout antes de BN. Assim, Li et al. (2018) recomendam aplicar Dropout após todas as camadas BN.
Do ponto de vista de Ioffe e Szegedy (2015), o BN está localizado dentro / antes da função de ativação. No entanto, Chen et al. (2019) usam uma camada de IC que combina dropout e BN, e Chen et al. (2019) recomenda o uso de BN após ReLU.
No plano de fundo de segurança, eu uso Dropout ou BN apenas na rede.
Chen, Guangyong, Pengfei Chen, Yujun Shi, Chang-Yu Hsieh, Benben Liao e Shengyu Zhang. 2019. “Repensando o uso de normalização em lote e abandono no treinamento de redes neurais profundas.” Abs CoRR / 1905.05928. http://arxiv.org/abs/1905.05928 .
Ioffe, Sergey e Christian Szegedy. 2015. “Batch Normalization: Accelerating Deep Network Training by Reducing Covariate Shift.” Abs CoRR / 1502.03167. http://arxiv.org/abs/1502.03167 .
Li, Xiang, Shuo Chen, Xiaolin Hu e Jian Yang. 2018. “Compreendendo a desarmonia entre a eliminação e a normalização de lote por mudança de variação. CoRR abs / 1801.05134. http://arxiv.org/abs/1801.05134 .
fonte