Redes neuronales convolucionales: ¿no están las neuronas centrales sobrerrepresentadas en la salida?

30

[Esta pregunta también se planteó en el desbordamiento de la pila]

La pregunta en resumen

Estoy estudiando redes neuronales convolucionales, y creo que estas redes no tratan a cada neurona de entrada (píxel / parámetro) de manera equivalente. Imagine que tenemos una red profunda (muchas capas) que aplica convolución en alguna imagen de entrada. Las neuronas en el "medio" de la imagen tienen muchas vías únicas hacia muchas neuronas de capa más profunda, lo que significa que una pequeña variación en las neuronas medias tiene un fuerte efecto en la salida. Sin embargo, las neuronas en el borde de la imagen tienen solo vía (o, dependiendo de la implementación exacta, del orden de 1 ) vías en las que su información fluye a través del gráfico. Parece que estos están "subrepresentados".11

Estoy preocupado por esto, ya que esta discriminación de las neuronas del borde aumenta exponencialmente con la profundidad (número de capas) de la red. Incluso agregar una capa de agrupación máxima no detendrá el aumento exponencial, solo una conexión completa pone a todas las neuronas en pie de igualdad. Sin embargo, no estoy convencido de que mi razonamiento sea correcto, así que mis preguntas son:

  • ¿Tengo razón en que este efecto tiene lugar en redes convolucionales profundas?
  • ¿Hay alguna teoría sobre esto? ¿Se ha mencionado alguna vez en la literatura?
  • ¿Hay formas de superar este efecto?

Debido a que no estoy seguro de si esto proporciona suficiente información, elaboraré un poco más sobre el enunciado del problema y por qué creo que esto es una preocupación.

Explicación más detallada

Imagine que tenemos una red neuronal profunda que toma una imagen como entrada. Supongamos que aplicamos un filtro convolucional de píxeles sobre la imagen, donde cambiamos la ventana de convolución en píxeles cada vez. Esto significa que cada neurona en la entrada envía su activación a neuronas en la capa . Cada una de estas neuronas puede enviar su activación a otras , de modo que nuestra neurona superior esté representada en neuronas de salida, y así sucesivamente.64×644 42 265 265 2dieciséis×dieciséis=26522652652

Sin embargo, esto no es cierto para las neuronas en los bordes: estas pueden representarse en solo un pequeño número de ventanas de convolución, lo que hace que activen (del orden de) solo neurona en la siguiente capa. El uso de trucos como el reflejo a lo largo de los bordes no ayudará a esto: las neuronas de la segunda capa que se proyectarán todavía están en los bordes, lo que significa que las neuronas de la segunda capa estarán subrepresentadas (lo que limita la importancia de nuestras neuronas de borde también). Como se puede ver, esta discrepancia escala exponencialmente con el número de capas.1

He creado una imagen para visualizar el problema, que se puede encontrar aquí (no se me permite incluir imágenes en la publicación). Esta red tiene una ventana de convolución de tamaño . Los números al lado de las neuronas indican el número de vías hacia la neurona más profunda. La imagen recuerda al Triángulo de Pascal .3

https://www.dropbox.com/s/7rbwv7z14j4h0jr/deep_conv_problem_stackxchange.png?dl=0

¿Por qué es esto un problema?

Este efecto no parece ser un problema a primera vista: en principio, los pesos deberían ajustarse automáticamente de tal manera que la red haga su trabajo. Además, los bordes de una imagen no son tan importantes de todos modos en el reconocimiento de imágenes. Este efecto puede no ser notable en las pruebas de reconocimiento de imágenes cotidianas, pero todavía me preocupa por dos razones: 1. generalización a otras aplicaciones, y 2. problemas que surgen en el caso de redes muy profundas.

1. Puede haber otras aplicaciones, como reconocimiento de voz o sonido, donde no es cierto que las neuronas más medias sean las más importantes. La aplicación de convolución a menudo se realiza en este campo, pero no he podido encontrar ningún documento que mencione el efecto que me preocupa.

1026510

Ahora imagine que perturbamos todas las neuronas en una pequeña cantidad. Las neuronas centrales harán que la salida cambie más fuertemente en varios órdenes de magnitud, en comparación con las neuronas de borde. Creo que para aplicaciones generales, y para redes muy profundas, ¿deberían encontrarse formas de solucionar mi problema?

Koen
fuente
8
No puedo responder completamente su pregunta, pero encontré este documento: cs.utoronto.ca/~kriz/conv-cifar10-aug2010.pdf que aborda su problema. Hablan sobre diferentes soluciones, 1) rellenando los bordes de las entradas con ceros, 2) agregando componentes conectados aleatoriamente a nivel mundial, o 3) arreglando y propagando hacia adelante los bordes para que no se pierda información de los bordes. Recientemente tuve curiosidad sobre el mismo problema y encontré su pregunta. Todavía estoy leyendo los detalles de ese documento. Espero eso ayude.
nfmcclure
¡Gracias, esto era exactamente lo que estaba buscando! Impresionante que esto se nota con tan solo 2 capas. Para aquellos TL; DR'ing todo el documento: se encontró que usar una combinación de 1) (relleno cero) y 2) (conexiones globales aleatorias) era el mejor remedio.
Koen
Tengo curiosidad, ¿no es suficiente usar un desplazamiento no superpuesto? Entonces, en su ejemplo, tiene parches de 64x64 y mueve su entrada de 64 píxeles cada vez que aplica la convolución. (su 'turno' es mi 'desplazamiento'). ¿Cuál es, supongo, lo mismo que hacer relleno cero?
Renthal
1
Perdón por no responder por un tiempo, ya no estoy trabajando en NN. Sin embargo, creo que podría responder las preguntas, aunque me doy cuenta de que mi objetivo principal era comprender mejor lo que está sucediendo (que todavía no entiendo). 1) Este efecto parece tener lugar de hecho. 2) El documento vinculado anteriormente lo describe y 3) también explora formas de superarlo. Para Renthal: los parches no superpuestos (eligiendo offset = tamaño conv.) Deberían superar mi problema, pero las personas a menudo encuentran parches superpuestos para funcionar mejor. Para EngrStudent, lo siento, no estoy familiarizado con el remuestreo de Bootstrap.
Koen

Respuestas:

4

Se esperan representaciones dispersas en modelos jerárquicos. Posiblemente, lo que está descubriendo es un problema intrínseco a la estructura jerárquica de los modelos de aprendizaje profundo. Encontrará bastantes artículos científicos sobre "representaciones dispersas", especialmente en la investigación de la memoria.

Creo que se beneficiaría al leer sobre "campos receptores" en la corteza visual. No solo hay células de ENCENDIDO y APAGADO en el cerebro de los mamíferos, sino también células de RF que se activan tanto durante el encendido como el apagado. Tal vez el problema de borde / escasez podría evitarse actualizando el modelo para reflejar la neurociencia actual sobre la visión, especialmente en modelos animales.

noumenal
fuente
3

Tiene razón en que esto es un problema si la convolución opera solo en los píxeles de la imagen, pero el problema desaparece si pone a cero las imágenes (como generalmente se recomienda). Esto asegura que la convolución aplicará el filtro la misma cantidad de veces a cada píxel.

jon_simon
fuente
1
No estoy convencido todavía. El relleno cero solo creará más píxeles de salida alrededor de los píxeles "centrales" que se encuentran sin relleno. Los valores de los píxeles "centrales" son exactamente los mismos, sin importar el relleno de cero que se use.
Koen
1
Si la ventana convolucional es de tamaño , al rellenar todos los bordes con n - 1 muchos ceros, garantizará que la convolución actuará en los píxeles del borde tantas veces como los píxeles internos (suponiendo que haga esto en cada capa convolucional de la red). Sin embargo, en la práctica, no tener un relleno tan agresivo y, en cambio, atenuar la importancia de los píxeles del borde en finos, ya que es mucho más probable que la información importante se ubique cerca del centro de la imagen. norte×nortenorte-1
jon_simon
La visualización de convolución a mitad de esta página puede ayudar a transmitir la intuición: cs231n.github.io/convolutional-networks
jon_simon