¿Cuál es el problema de ‘morir ReLU’ en las redes neuronales?

Aquí hay un escenario:

Supongamos que hay una red neuronal con alguna distribución sobre sus entradas X. Veamos una unidad R de ReLU en particular. Para cualquier conjunto fijo de parámetros, la distribución sobre X implica una distribución sobre las entradas hacia R. Supongamos, para facilitar la visualización, que R las entradas se distribuyen como una Gaussiana de baja varianza centrada en +0.1 .

Bajo este escenario:

  • La mayoría de las entradas a R son positivas , por lo tanto
  • La mayoría de las entradas harán que la puerta ReLU esté abierta , por lo tanto
  • La mayoría de las entradas harán que los gradientes fluyan hacia atrás a través de R, por lo tanto
  • Las entradas de R generalmente se actualizan a través de SGD backprop.

Ahora, suponga que durante un backprop particular, hay un gradiente de gran magnitud pasado hacia atrás a R. Dado que R estaba abierto , pasará este gran gradiente hacia atrás a sus entradas. Esto provoca un cambio relativamente grande en la función que calcula la entrada de R. Esto implica que la distribución sobre las entradas de R ha cambiado; digamos que las entradas a R ahora se distribuyen como un Gaussiano de baja varianza centrado en -0.1 .

Ahora tenemos eso:

  • La mayoría de las entradas a R son negativas , por lo tanto
  • La mayoría de las entradas harán que la puerta ReLU se cierre , por lo tanto
  • La mayoría de las entradas harán que los gradientes no fluyan hacia atrás a través de R, por lo tanto
  • Las entradas de R generalmente no se actualizan a través de SGD backprop.

¿Que pasó? Un cambio relativamente pequeño en la distribución de entrada de R (-0.2 en promedio) ha llevado a una diferencia cualitativa en el comportamiento de R. Hemos cruzado el límite cero, y R ahora está casi siempre cerrado. Y el problema es que una ReLU cerrada no puede actualizar sus parámetros de entrada , por lo que una ReLU muerta (muerta = siempre cerrada) permanece muerta.

Matemáticamente, esto se debe a que ReLU calcula la función

[matemáticas] r (x) = \ max (x, 0) [/ matemáticas]

cuyo gradiente es:

[matemáticas] \ nabla_x r (x) = \ mathbb {1} \ {x> 0 \} [/ matemáticas]

Por lo tanto, ReLU cerrará la puerta durante el backprop si y solo si cerró la puerta durante el apoyo hacia adelante. Es probable que un ReLU ̶s̶t̶a̶y̶s̶ ̶d̶e̶a̶d̶ muerto permanezca muerto.

(Editar: como han notado Liu Hu y otros, todavía existe la posibilidad de revivir el ReLU. Recuerde que muchos de los parámetros “aguas arriba” que afectan la distribución de entrada de R todavía se están actualizando a través de otras rutas en el gráfico. Por ejemplo, ” los hermanos “incluyen ReLU que están abiertos y aún pasan gradientes hacia atrás. Estas actualizaciones de los parámetros aguas arriba de R pueden hacer que la distribución de entrada de R vuelva a tener un soporte no trivial en el régimen positivo. Los detalles son un poco complejos: tenga en cuenta que, por ejemplo, en una capa afín, el vector de fila que proporciona directamente entrada a R es realmente no actualizable hasta que R se abre. Por lo tanto, un ReLU completamente muerto solo puede revivirse a través de actualizaciones a la capa de transformación lineal anterior . En particular, el 100% no puede revivir un ReLU muerto al principio capa oculta si la transformación lineal es una afinidad típica sin compartir parámetros. En cualquier caso, el asunto merece un estudio empírico).

No estoy seguro de con qué frecuencia ocurre la muerte de ReLU en la práctica, pero aparentemente con la frecuencia suficiente como para ser algo a tener en cuenta. Esperemos que pueda ver por qué una gran tasa de aprendizaje podría ser el culpable aquí. Cuanto mayor sea la magnitud promedio de las actualizaciones de los pasos SGD, mayor es el riesgo de que podamos empujar toda la distribución de las entradas de R al régimen negativo.

Finalmente, a diferencia de mi ejemplo, puede hacer esto en etapas, donde un paso SGD empuja parte de la distribución fuera del régimen positivo, y un paso SGD posterior empuja el resto de la distribución. En general, puede pensar en la distribución de entrada de R como una especie de caminata aleatoria. Si se da un paso relativamente grande, podría terminar con un ReLU muerto.

Una forma de evitar esto sería evitar las no linealidades que tienen regímenes de gradiente cero (p. Ej., “ReLU permeable”), pero no estoy totalmente seguro de si queremos / necesitamos esto. También se podría considerar tratar de “recuperar” ReLU muertos al detectarlos y reinicializar aleatoriamente sus parámetros de entrada; esto retrasaría el aprendizaje pero podría alentar un uso más eficiente de los parámetros.

No estoy totalmente de acuerdo con la descripción de “para siempre cero” o “irreversible”. De hecho, dada una unidad ReLU que no se activa en todo el conjunto de datos, la unidad tiene la oportunidad de reactivarse.

Bajo este escenario:

  1. DNN con 3 capas, todas completamente conectadas, con pesos entre [matemática] W_ {1ij}, W_ {2jk} [/ matemática], salida de cada capa [matemática] \ sigma_ {1i} [/ matemática], [matemática] \ sigma_ {2j} [/ matemáticas], [matemáticas] \ sigma_ {3k} [/ matemáticas]
  2. Cada capa usa ReLU para no linealidad
  3. Una unidad ReLU (k indexada) en la tercera capa no está activada en todo el conjunto de datos [matemáticas] \ conjunto de datos forall: \ sigma_k = ReLU (\ Sigma_j W_ {2jk} \ sigma_ {2j}) = 0 [/ matemáticas]

[math] W_ {2jk} [/ math] do no se actualizará pero [math] \ sigma_ {2j} [/ math] y [math] W_ {1ij} [/ math] tiene la oportunidad. Para una determinada [matemática] \ sigma_ {2j} [/ matemática] se recogerá el flujo de gradiente de otras unidades ReLU activadas conectadas con él en la tercera capa, por lo que se actualizarán [matemática] W_ {1ij} [/ matemática], distribución de [math] \ sigma_ {2j} [/ math] cambió y [math] \ sigma_k = [/ math] [math] ReLU (\ Sigma_j W_ {2jk} \ sigma_ {2j}) [/ math] puede saltar de ceros .

Por lo tanto, el ReLU muerto no siempre puede permanecer muerto.

Considere una neurona con dos entradas binarias.

Dejar

x = [[0,0], [0,1], [1,0], [1,1]].

y = ReLU (W * x + b)

Si W = [-1, -1] yb = [- 1], entonces la salida es

y = ReLU ([- 1, -2, -2, -3]) = [0, 0, 0, 0]

La pendiente de ReLU se utiliza para escalar y proporcionar dirección para las actualizaciones de peso. Esto se llama escalar colinas. El lado negativo de ReLU tiene pendiente cero. No hay colina para subir. Una vez que todas las entradas se vuelven negativas, no hay nada que pueda recuperarlas.

Liu tiene razón. Si las salidas de la capa anterior están cambiando, las capas muertas en el siguiente nodo podrían recuperarse. La variedad de datos puede cambiar para restaurar y matar neuronas en la siguiente capa.

En una red neuronal, cada nodo (neurona) recibe muchas entradas de la capa superior y sale a muchos nodos en su capa o la capa debajo de ella. El nodo recibe entrada, multiplica cada entrada por algún coeficiente (peso) y las salidas a sus pares. Al entrenar una red neuronal, le dice a los nodos que cambien sus coeficientes de entrada en una cantidad que se correlacione con el porcentaje de error y su distancia de los nodos de salida. Si cambia los coeficientes de los nodos para hacerlos imposiblemente grandes o imposiblemente pequeños, entonces no enviarán ninguna salida útil a los nodos aguas abajo. El nodo está efectivamente muerto y no aporta trabajo útil a la red.

Descargo de responsabilidad, la última vez que jugué con Neural Networks fue en la era BBS y la técnica de entrenamiento fue la propagación hacia atrás.