Así que estoy tratando de enseñarme a mí mismo las redes neuronales (para aplicaciones de regresión, no para clasificar imágenes de gatos).
Mis primeros experimentos fueron entrenar una red para implementar un filtro FIR y una Transformada Discreta de Fourier (entrenamiento en señales "antes" y "después"), ya que ambas son operaciones lineales que pueden ser implementadas por una sola capa sin función de activación. Ambos funcionaron bien.
Entonces, quería ver si podía agregar un abs()
y hacer que aprendiera un espectro de amplitud. Primero pensé en cuántos nodos necesitaría en la capa oculta, y me di cuenta de que 3 ReLU son suficientes para una aproximación cruda abs(x+jy) = sqrt(x² + y²)
, por lo que probé esa operación por sí sola en números complejos solitarios (2 entradas → 3 nodos ReLU capa oculta → 1 salida). Ocasionalmente funciona:
Pero la mayoría de las veces que lo intento, se atasca en un mínimo local y no encuentra la forma correcta:
He probado todos los optimizadores y variantes de ReLU en Keras, pero no hacen mucha diferencia. ¿Hay algo más que pueda hacer para que redes simples como esta converjan de manera confiable? ¿O simplemente estoy abordando esto con la actitud equivocada, y se supone que debes arrojar más nodos de los necesarios al problema y si la mitad de ellos muere, no se considera un gran problema?
Respuestas:
El resultado parece sugerir fuertemente que una o más de sus neuronas mueren (o tal vez el hiperplano de pesos de dos de sus neuronas se ha fusionado). Puedes ver que con 3 Relu, obtienes 3 divisiones oscuras en el centro cuando converges a la solución más razonable. Puede verificar fácilmente si esto es cierto al verificar los valores de salida de cada neurona para ver si permanece muerta para una gran mayoría de sus muestras. Alternativamente, puede graficar todos los pesos de neuronas 2x3 = 6, agrupados por sus respectivas neuronas, para ver si dos neuronas colapsan en el mismo par de pesos.
Sospecho que una posible causa de esto es cuando está sesgado hacia una coordenada, por ejemplo , en cuyo caso está tratando de reproducir la identidad, como entonces . Realmente no hay mucho que puedas hacer aquí para remediar esto. Una opción es agregar más neuronas como lo ha intentado. La segunda opción es probar una activación continua, como un sigmoide, o quizás algo ilimitado como un exponencial. También podría intentar abandonar (con digamos, 10% de probabilidad). Podría usar la implementación de abandono regular en keras, que es lo suficientemente inteligente como para ignorar situaciones en las que las 3 neuronas abandonan.x+iy x≫y abs(x+iy)≈x
fuente
3 shadowy splits in the center when you converge to the more reasonable solution.
Sí, esa es la aproximación cruda que quise decir; Una pirámide hexagonal invertida.or perhaps something unbounded like an exponential
Intenté elu y selu, que no funcionó mucho mejor.two neurons collapse to the same pair of weights
Ah, no había pensado en eso; Solo asumí que estaban muertos.