¿Pedido de normalización y abandono de lotes?


116

La pregunta original se refería específicamente a las implementaciones de TensorFlow. Sin embargo, las respuestas son para implementaciones en general. Esta respuesta general también es la respuesta correcta para TensorFlow.

Cuando utilizo la normalización y abandono por lotes en TensorFlow (específicamente usando contrib.layers), ¿debo preocuparme por el pedido?

Parece posible que si utilizo el abandono seguido inmediatamente de la normalización por lotes, podría haber problemas. Por ejemplo, si el cambio en la normalización por lotes se entrena a los números de escala más grandes de las salidas de entrenamiento, pero luego ese mismo cambio se aplica a los números de escala más pequeños (debido a la compensación por tener más salidas) sin abandono durante las pruebas, entonces eso el turno puede estar apagado. ¿La capa de normalización por lotes de TensorFlow lo compensa automáticamente? ¿O esto no sucede por alguna razón que me falta?

Además, ¿hay otras trampas a tener en cuenta al usar estos dos juntos? Por ejemplo, suponiendo que los estoy usando en el orden correcto en lo que respecta a lo anterior (suponiendo que es un orden correcto), podría haber problemas con el uso de tanto la normalización de lotes y la deserción en múltiples capas sucesivas? No veo un problema de inmediato con eso, pero es posible que me esté perdiendo algo.

Muchas gracias!

ACTUALIZAR:

Una prueba experimental parece sugerir que ordenar es importante. Ejecuté la misma red dos veces con solo la norma de lotes y el abandono inverso. Cuando el abandono se produce antes de la norma de lote, la pérdida de validación parece aumentar a medida que disminuye la pérdida de entrenamiento. Ambos caen en el otro caso. Pero en mi caso los movimientos son lentos, por lo que las cosas pueden cambiar después de más entrenamiento y es solo una prueba. Aún así, se agradecería una respuesta más definitiva e informada.

Respuestas:


143

En Ioffe y Szegedy 2015 , los autores afirman que "nos gustaría asegurarnos de que para cualquier valor de parámetro, la red siempre produzca activaciones con la distribución deseada". Por lo tanto, la capa de normalización por lotes se inserta justo después de una capa de conversión / capa completamente conectada, pero antes de alimentar a ReLu (o cualquier otro tipo de) activación. Vea este video aproximadamente a los 53 minutos para obtener más detalles.

En cuanto a la deserción, creo que la deserción se aplica después de la capa de activación. En la figura 3b del papel de abandono , el factor de abandono / matriz de probabilidad r (l) para la capa oculta l se le aplica en y (l), donde y (l) es el resultado después de aplicar la función de activación f.

Entonces, en resumen, el orden de uso de la normalización y abandono por lotes es:

-> CONV / FC -> BatchNorm -> ReLu (u otra activación) -> Abandono -> CONV / FC ->


63
Parece que incluso a Christian Szegedy ahora le gusta realizar BatchNorm después de ReLU (no antes). Cita de F. Chollet, autor de Keras: "No he vuelto para comprobar lo que están sugiriendo en su artículo original, pero puedo garantizar que el código reciente escrito por Christian aplica relu antes de BN. Todavía es ocasionalmente un tema de debate, sin embargo ". fuente
pseudomarvin

3
¿Qué pasa con la agrupación, eso iría entre batchnorm y la activación?
wordsforthewise

5
Además, parece que la precisión puede ser mayor con BN después de la activación: github.com/cvjena/cnn-models/issues/3
wordsforthewise

1
el video se elimina de alguna manera!
blitu12345

10
Este artículo muestra que normalmente el abandono con BN conduce a peores resultados a menos que se realice algún acondicionamiento para evitar el riesgo de cambios de varianza.
Haramoz

37

Como se ha señalado en los comentarios, un recurso increíble para leer en el orden de las capas es aquí . He revisado los comentarios y es el mejor recurso sobre el tema que he encontrado en Internet.

Mis 2 centavos:

La deserción está destinada a bloquear la información de ciertas neuronas por completo para asegurarse de que las neuronas no se adapten conjuntamente. Por lo tanto, la normalización por lotes debe realizarse después de la interrupción, de lo contrario, pasará información a través de las estadísticas de normalización.

Si lo piensa bien, en los problemas típicos de AA, esta es la razón por la que no calculamos la desviación estándar y media de los datos completos y luego los dividimos en conjuntos de entrenamiento, prueba y validación. Dividimos y luego calculamos las estadísticas sobre el conjunto de trenes y las usamos para normalizar y centrar los conjuntos de datos de validación y prueba

así que sugiero el Esquema 1 (Esto toma en consideración el comentario de pseudomarvin sobre la respuesta aceptada)

-> CONV / FC -> ReLu (u otra activación) -> Abandono -> BatchNorm -> CONV / FC

a diferencia del esquema 2

-> CONV / FC -> BatchNorm -> ReLu (u otra activación) -> Dropout -> CONV / FC -> en la respuesta aceptada

Tenga en cuenta que esto significa que la red del esquema 2 debería mostrar un ajuste excesivo en comparación con la red del esquema 1, pero OP ejecutó algunas pruebas como se menciona en la pregunta y son compatibles con el esquema 2


Discusión relevante de reddit sobre la ubicación de BatchNorm: reddit.com/r/MachineLearning/comments/67gonq/…
saetch_g

3
Pero, ¿no arruinaría esto sus estadísticas de BN, ya que las calculará después de que se haya aplicado la deserción, que no será el caso en el momento de la prueba?
ZakJ

@ZakJ Supongo que no. Dado que calculamos BN por unidad (para cada característica interna) y, además, se escala para compensar la caída.
celo

@ZakJ tiene razón. Vea la respuesta de mohammed adel y este documento aquí: arxiv.org/pdf/1801.05134.pdf . En efecto, las capas de normalización por lotes aprenden a contrarrestar el cambio de covariables en los datos que ya no existen cuando la deserción se desactiva en el momento de la prueba.
skeller88

@ skeller88 No he leído el periódico. En la parte superior de mi cabeza, creo que si tiene BN antes de la deserción, eso esencialmente arruina la intención de la capa BN, ya que la función de BN es proporcionar datos estandarizados a la siguiente capa.
MiloMinderbinder

12

Por lo general, simplemente suelte el Dropout(cuando lo haya hecho BN):

  • "BN elimina la necesidad de, Dropouten algunos casos, porque BN proporciona beneficios de regularización similares a los de Dropout intuitivamente"
  • "Arquitecturas como ResNet, DenseNet, etc. no utilizan Dropout

Para obtener más detalles, consulte este documento [ Comprensión de la falta de armonía entre la deserción y la normalización de lotes por cambio de varianza ] como ya lo mencionó @Haramoz en los comentarios.


¿Qué pasa con los MLP? ¿Es útil combinarlos?
DINA TAKLIT

1
@DINATAKLIT Cuando realmente no tienes suficientes datos de entrenamiento, en mi opinión, SÍ.
xtluo

@xtulo, ¿te refieres a que este trabajo una vez que hay una pequeña cita? ¡como si hubiera leído que la normalización por lotes funciona mejor con grandes conjuntos de datos! Estoy un poco confundido:
DINA TAKLIT

1
@DINATAKLIT En su comentario anterior what about MLPs is it useful to combine them, ¿quiso decir eso Is it useful to combine Dropout and BN when using MLPs? Mi sensación sobre esto es que depende principalmente del tamaño de su modelo y la cantidad de datos de entrenamiento que tenga.
xtluo

@xtulo sí quiero decir si es útil combinar Droupout y BN, sí, estoy de acuerdo con tu última respuesta.
DINA TAKLIT

6

Encontré un artículo que explica la falta de armonía entre Dropout y Batch Norm (BN). La idea clave es lo que ellos llaman "cambio de varianza" . Esto se debe al hecho de que la deserción tiene un comportamiento diferente entre las fases de entrenamiento y prueba, lo que cambia las estadísticas de entrada que aprende BN. La idea principal se puede encontrar en esta figura que se toma de este artículo . ingrese la descripción de la imagen aquí

En este cuaderno se puede encontrar una pequeña demostración de este efecto .


3
¿Cómo responde esto a la pregunta?
nbubis

1
El papel proporciona 2 estrategias potenciales: - Aplicar Dropout (solo) después de todas las capas BN - Cambiar Dropout a una forma más estable en la varianza
user3641187

@nbubis Creo que lo responde indirectamente. Parece sugerir no utilizarlos juntos en absoluto ("explica la falta de armonía entre Dropout y Batch Norm (BN)").
NelsonGon


2

El orden correcto es: Conv> Normalización> Activación> Abandono> Agrupación


2

Conv - Activación - DropOut - BatchNorm - Pool -> Test_loss: 0.04261355847120285

Conv - Activación - DropOut - Pool - BatchNorm -> Test_loss: 0.050065308809280396

Conv - Activación - BatchNorm - Pool - DropOut -> Test_loss: 0.04911309853196144

Conv - Activación - BatchNorm - DropOut - Pool -> Test_loss: 0.06809622049331665

Conv - BatchNorm - Activación - DropOut - Pool -> Test_loss: 0.038886815309524536

Conv - BatchNorm - Activación - Pool - DropOut -> Test_loss: 0.04126095026731491

Conv - BatchNorm - DropOut - Activación - Pool -> Test_loss: 0.05142546817660332

Conv - DropOut - Activación - BatchNorm - Pool -> Test_loss: 0.04827788099646568

Conv - DropOut - Activación - Pool - BatchNorm -> Test_loss: 0.04722036048769951

Conv - DropOut - BatchNorm - Activación - Pool -> Test_loss: 0.03238215297460556


Capacitado en el conjunto de datos MNIST (20 épocas) con 2 módulos convolucionales (ver más abajo), seguidos cada vez con

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

Las capas convolucionales tienen un tamaño de kernel de (3,3), relleno predeterminado, la activación es elu. El Pooling es un MaxPooling de la piscina (2,2). La pérdida es categorical_crossentropyy el optimizador es adam.

La probabilidad de abandono correspondiente es 0.2o 0.3, respectivamente. La cantidad de mapas de características es 32o 64, respectivamente.

Editar: cuando dejé caer el abandono, como se recomienda en algunas respuestas, convergió más rápido pero tenía una peor capacidad de generalización que cuando uso BatchNorm y abandono.


Debido a la naturaleza estocástica de los NN, no es suficiente jugar con un entrenamiento. Cuando hagas alrededor de 100 entrenamientos y obtengas un promedio, los resultados serán más precisos.
GensaGames

0

ConV / FC - BN - Sigmoide / tanh - abandono. Si la función de activación es Relu o no, el orden de normalización y abandono depende de su tarea


0

Leí los artículos recomendados en la respuesta y los comentarios de https://stackoverflow.com/a/40295999/8625228

Desde el punto de vista de Ioffe y Szegedy (2015), solo use BN en la estructura de la red. Li y col. (2018) dan los análisis estadísticos y experimentales, que hay un cambio de varianza cuando los profesionales usan Dropout antes que BN. Por tanto, Li et al. (2018) recomiendan aplicar Dropout después de todas las capas BN.

Desde el punto de vista de Ioffe y Szegedy (2015), BN se ubica dentro / antes de la función de activación. Sin embargo, Chen et al. (2019) utilizan una capa de IC que combina abandono y BN, y Chen et al. (2019) recomienda usar BN después de ReLU.

En el ámbito de la seguridad, uso Dropout o BN solo en la red.

Chen, Guangyong, Pengfei Chen, Yujun Shi, Chang-Yu Hsieh, Benben Liao y Shengyu Zhang. 2019. “Repensando el uso de la normalización por lotes y el abandono en el entrenamiento de redes neuronales profundas”. CoRR abs / 1905.05928. http://arxiv.org/abs/1905.05928 .

Ioffe, Sergey y Christian Szegedy. 2015. “Normalización por lotes: aceleración del entrenamiento de redes profundas mediante la reducción del cambio de covariables interno”. CoRR abs / 1502.03167. http://arxiv.org/abs/1502.03167 .

Li, Xiang, Shuo Chen, Xiaolin Hu y Jian Yang. 2018. "Comprensión de la falta de armonía entre la deserción y la normalización de lotes por cambio de variación". CoRR abs / 1801.05134. http://arxiv.org/abs/1801.05134 .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.