Pedido de normalização e eliminação de lote?


116

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.

Respostas:


143

No Ioffe e no Szegedy 2015 , os autores afirmam que “gostaríamos de garantir que, para quaisquer valores de parâmetros, a rede sempre produz ativações com a distribuição desejada”. Portanto, a camada de normalização de lote é realmente inserida logo após uma camada Conv / camada totalmente conectada, mas antes de alimentar a ativação ReLu (ou qualquer outro tipo de). Veja este vídeo por volta de 53 min para mais detalhes.

No que diz respeito ao abandono, acredito que o abandono é aplicado após a camada de ativação. No artigo de dropout figura 3b, o fator de dropout / matriz de probabilidade r (l) para a camada oculta l é aplicado a ela em y (l), onde y (l) é o resultado após a aplicação da função de ativação f.

Portanto, em resumo, a ordem de uso da normalização de lote e eliminação é:

-> CONV / FC -> BatchNorm -> ReLu (ou outra ativação) -> Dropout -> CONV / FC ->


63
Parece que até Christian Szegedy agora gosta de executar o BatchNorm após o ReLU (não antes dele). Citação de F. Chollet, o autor de Keras: "Não voltei para verificar o que eles estão sugerindo em seu artigo original, mas posso garantir que o código recente escrito por Christian aplica relu antes de BN. Ocasionalmente, ainda é um tópico de debate, no entanto. " fonte
pseudomarvin

3
E o pooling, isso ficaria entre a norma batch e a ativação?
palavras da maneira certa,

5
Além disso, parece que a precisão pode ser maior com BN após a ativação: github.com/cvjena/cnn-models/issues/3
wordsforthewise

1
o vídeo é excluído de alguma forma!
blitu12345

10
Este artigo mostra que normalmente o abandono com BN leva a resultados piores, a menos que algum condicionamento seja feito para evitar o risco de mudanças de variância.
Haramoz 01 de

37

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


Discussão relevante do reddit sobre o posicionamento do BatchNorm: reddit.com/r/MachineLearning/comments/67gonq/…
saetch_g

3
Mas isso não iria atrapalhar suas estatísticas BN, já que você vai calculá-las após a aplicação do abandono, o que não será o caso no momento do teste?
ZakJ 01 de

@ZakJ Acho que não. Uma vez que calculamos BN por unidade (para cada recurso interno) e, além disso, é escalado para compensar a queda.
zelo

@ZakJ está correto. Veja a resposta de mohammed adel e este artigo aqui: arxiv.org/pdf/1801.05134.pdf . Na verdade, as camadas de Normalização em lote aprendem a neutralizar a mudança de covariável nos dados que não existem mais quando o Dropout é desativado no momento do teste.
skeller88

@ skeller88 Não li o jornal. No topo da minha cabeça, eu acho que se você tem BN antes do abandono, então isso essencialmente estraga a intenção da camada BN, já que a função do BN é fornecer dados padronizados para a próxima camada.
MiloMinderbinder

12

Normalmente, basta descartar o Dropout(quando você tiver BN):

  • "O BN elimina a necessidade de, Dropoutem alguns casos, o BN fornece benefícios de regularização semelhantes aos do abandono intuitivamente"
  • "Arquiteturas como ResNet, DenseNet, etc. não usam 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.


e quanto aos MLPs, é útil combiná-los.
DINA TAKLIT

1
@DINATAKLIT Quando você realmente não tem dados de treinamento suficientes, na minha opinião, SIM.
xtluo

@xtulo quer dizer este trabalho uma vez que é um pequeno datest? como se eu tivesse lido que a normalização em lote funciona melhor com grandes conjuntos de dados! Estou um pouco confuso :!
DINA TAKLIT

1
@DINATAKLIT Em seu comentário anterior what about MLPs is it useful to combine them, você quis dizer isso Is 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.
xtluo de

@xtulo sim, significa que é útil combinar Droupout e BN, sim, concordo com sua última resposta.
DINA TAKLIT

6

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 . insira a descrição da imagem aqui

Uma pequena demonstração desse efeito pode ser encontrada neste notebook .


3
Como isso responde à pergunta?
nbubis

1
O artigo fornece 2 estratégias potenciais: - Aplicar Dropout (apenas) após todas as camadas BN - Mudar Dropout para uma forma mais estável de variação
user3641187

@nbubis Eu acho que responde indiretamente. Parece sugerir não usá-los juntos ("explica a desarmonia entre Dropout e Batch Norm (BN)").
NelsonGon


2

A ordem correta é: Conv> Normalização> Ativação> Desistência> Pooling


2

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

model.add(Flatten())
model.add(layers.Dense(512, activation="elu"))
model.add(layers.Dense(10, activation="softmax"))

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_crossentropye o otimizador também adam.

A probabilidade de dropout correspondente é 0.2ou 0.3, respectivamente. A quantidade de mapas de recursos é 32ou 64, 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.


Devido à natureza estocástica dos NNs não é suficiente apenas brincar com um treinamento. Quando você fizer cerca de 100 treinamentos e tirar a média, os resultados serão mais precisos.
GensaGames

0

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


0

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 .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.