¿Qué es una norma de lotes en el aprendizaje automático?

La normalización por lotes es una idea reciente propuesta en [1] para mejorar los procedimientos de entrenamiento en redes neuronales profundas (y modelos relacionados). Soy un gran admirador de esta idea porque (a) es ridículamente simple, pero increíblemente poderoso y arroja mucha luz sobre las dificultades de entrenar redes profundas, y (2) las mejoras en el entrenamiento que induce son bastante sobresalientes.

Como dije, BN es vergonzosamente simple: normalizar las entradas a no linealidades en cada capa oculta. Eso es. Seriamente.

Para entrar en un poco más de detalle. (Casi) cada capa oculta en una red tiene la forma:

[matemáticas] x ^ {(k)} = h_k (W_ {k} ^ Tx ^ {(k-1)}) [/ matemáticas]

donde [math] h [/ math] es alguna función no lineal (digamos un RELU), [math] W_k [/ math] es la matriz de peso asociada con la capa, y [math] x ^ k [/ math] es la salida de esa capa (eliminando los términos de sesgo por simplicidad). Llamemos a [math] z ^ k = W_ {k} ^ Tx ^ {(k-1)}. [/ Math] BN propone normalizar [math] z ^ k [/ math] como:

[matemáticas] \ tilde {z} ^ k = \ frac {z ^ k – \ mathbb {E} [z ^ k]} {\ sqrt {V [z ​​^ k]}} [/ matemáticas]

donde [math] \ mathbb {E} [x], V [x] [/ math] son ​​los primeros y segundos momentos de [math] x [/ math] respectivamente. Durante el entrenamiento usamos los momentos empíricos para cada lote de entrenamiento. Hay algunos elementos adicionales utilizados en la práctica para mejorar la expresividad de un lote normalizado y permitir que esto funcione durante el tiempo de prueba, pero lo anterior es el núcleo de BN.

La intuición general de por qué BN es tan eficaz es la siguiente. El entrenamiento de modelos profundos casi siempre se realiza con procedimientos basados ​​en gradientes. Cada peso se ajusta de acuerdo con su gradiente bajo el supuesto de que todos los demás pesos no cambiarán. En la práctica, cambiamos todos los pesos en cada iteración. Es importante destacar que al cambiar los pesos de la capa [math] k-1 [/ math] cambia la distribución de las entradas a la capa [math] k, [/ math] haciendo cualquier suposición del paso de gradiente a los pesos de la capa [math] k [/ matemáticas] bastante débil, especialmente al comienzo del entrenamiento donde los cambios pueden ser dramáticos. Esto complica enormemente el entrenamiento y hace que la convergencia sea difícil y lenta. Al aplicar BN entre capas, estamos haciendo cumplir, en cierto sentido, que las entradas a cada capa siempre estén cerca de una distribución normal estándar. Esto facilita las dependencias entre las capas y significa que los cambios realizados no se ven contrarrestados por los cambios en las capas anteriores. Esa es una intuición muy áspera, para explicaciones más profundas definitivamente recomiendo leer [1].

Esto funciona increíblemente bien. En la práctica, el entrenamiento es un orden de magnitud más rápido (medido en épocas de entrenamiento), es mucho más fluido y el entrenamiento puede realizarse con tasas de aprendizaje mucho mayores. Es realmente increíble lo bien que funciona. Mi propia investigación tiene que ver con modelos generativos profundos, donde típicamente entrenamos conjuntamente una serie de redes profundas (bayesianas) dependientes. En mi experiencia, BN ha sido clave para permitirnos entrenar los modelos más grandes y complejos. Otros grupos que se especializan en VAE y similares también han reportado hallazgos similares [2].

[1] – Acelerar el entrenamiento de redes profundas al reducir el cambio interno de covariables

[2] – https: //pdfs.semanticscholar.org…