python - networks - tensorflow mnist example



Pedido de normalização e abandono de lotes? (4)

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

  • "O BN elimina a necessidade do Dropout em alguns casos, porque o BN fornece benefícios de regularização semelhantes aos do Dropout intuitivamente"
  • "Arquiteturas como ResNet, DenseNet etc. não usam o Dropout

Para obter mais detalhes, consulte este artigo [ Entendendo a desarmonia entre desistência e normalização de lotes por desvio de variação ], como já mencionado por @Haramoz nos comentários.

A pergunta original dizia respeito especificamente à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 a normalização de lotes e a desistência no TensorFlow (especificamente usando os contrib.layers), preciso me preocupar com o pedido?

Parece possível que, se eu usar o abandono seguido imediatamente pela normalização do lote, possa haver problemas. Por exemplo, se a mudança na normalização do lote atingir os números de escala maiores das saídas de treinamento, mas esse mesmo deslocamento for aplicado aos números de escala menores (devido à compensação por ter mais saídas) sem interrupção durante o teste, esse o turno pode estar desativado. A camada de normalização em lote do TensorFlow compensa automaticamente isso? Ou isso não acontece por algum motivo que estou sentindo falta?

Além disso, existem outras armadilhas a serem observadas ao usar esses dois juntos? Por exemplo, supondo que eu os esteja usando na ordem correta em relação ao descrito acima (supondo que exista uma ordem correta), poderia haver problemas com o uso da normalização em lote e do abandono em várias camadas sucessivas? Não vejo imediatamente um problema com isso, mas posso estar perdendo alguma coisa.

Muito obrigado!

ATUALIZAR:

Um teste experimental parece sugerir que a ordem é importante. Executei a mesma rede duas vezes apenas com a norma de lote e a desistência reversa. Quando a interrupção ocorre antes da norma do lote, a perda de validação parece estar aumentando conforme a perda de treinamento diminui. Os dois estão caindo no outro caso. Mas no meu caso, os movimentos são lentos, então as coisas podem mudar após mais treinamento e é apenas um teste. Uma resposta mais definitiva e informada ainda seria apreciada.


Answer #1

A ordem correta é: Conv> Normalização> Ativação> Dropout> Pool


Answer #2

Como observado nos comentários, um recurso incrível para ler sobre a ordem das camadas está here . Passei pelos comentários e é o melhor recurso sobre o tópico que encontrei na internet

Meus 2 centavos:

O abandono visa bloquear completamente as informações de certos neurônios para garantir que os neurônios não se co-adaptem. Portanto, a normalização do lote deve ocorrer após o abandono, caso contrário, você está passando informações pelas 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 de dados inteiros e depois os dividimos em conjuntos de treinamento, teste e validação. Dividimos e depois calculamos as estatísticas sobre o conjunto de trens e as usamos para normalizar e centralizar os conjuntos de dados de validação e teste

então sugiro o esquema 1 (isso leva em consideração pseudomarvin's comentário pseudomarvin's sobre a resposta aceita)

-> CONV / FC -> ReLu (ou outra ativação) -> Dropout -> 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 um ajuste excessivo em comparação com a rede no Esquema 1, mas o OP executou alguns testes conforme mencionado na pergunta e eles suportam o Esquema 2


Answer #3

No Ioffe e Szegedy 2015 , os autores afirmam que "gostaríamos de garantir que, para qualquer valor de parâmetro, a rede sempre produza ativações com a distribuição desejada". Portanto, a camada de normalização em lote é realmente inserida logo após uma camada conv / camada totalmente conectada, mas antes de alimentar a ativação do ReLu (ou qualquer outro tipo de). Veja este vídeo em torno de 53 minutos para obter mais detalhes.

Quanto ao abandono, acredito que o abandono é aplicado após a camada de ativação. Na figura 3b do documento de abandono escolar, a matriz de fator / probabilidade de abandono r (l) da camada oculta l é aplicada 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 usar a normalização e a eliminação do lote é:

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