Red neuronal divergente en lugar de convergente

9

He implementado una red neuronal (usando CUDA) con 2 capas. (2 neuronas por capa). Estoy tratando de hacer que aprenda 2 funciones polinómicas cuadráticas simples usando la propagación hacia atrás .

Pero en lugar de converger, es divergente (la salida se está convirtiendo en infinito)

Aquí hay más detalles sobre lo que he probado:

  • Había establecido los pesos iniciales en 0, pero como era divergente, aleatoricé los pesos iniciales (Rango: -0.5 a 0.5)
  • Leí que una red neuronal podría divergir si la tasa de aprendizaje es demasiado alta, así que reduje la tasa de aprendizaje a 0.000001
  • Las dos funciones que estoy tratando de agregar son: 3 * i + 7 * j + 9 y j * j + i * i + 24 (estoy dando la capa i y j como entrada)
  • Lo había implementado como una sola capa anteriormente y eso podría aproximar las funciones polinómicas mejor de lo que lo está haciendo ahora
  • Estoy pensando en implementar el impulso en esta red, pero no estoy seguro de que pueda ayudarlo a aprender
  • Estoy usando una función de activación lineal (como en no)
  • Hay una oscilación al principio, pero la salida comienza a divergir en el momento en que cualquiera de los pesos se vuelve mayor que 1

He comprobado y vuelto a comprobar mi código, pero no parece haber ningún tipo de problema con él.

Así que aquí está mi pregunta: ¿qué está mal aquí?

Cualquier puntero será apreciado.

Shayan RC
fuente

Respuestas:

8
  1. Con las redes neuronales, siempre debe inicializar aleatoriamente sus pesos para romper la simetría.
  2. Si no utiliza una función de activación no lineal en las unidades ocultas, también podría haberse quedado con una sola capa. Su red ahora es solo una composición de dos funciones lineales, que por supuesto es solo otra función lineal.
  3. Esa tasa de aprendizaje parece excesivamente pequeña. Si estoy usando una tasa de aprendizaje fija, normalmente encuentro un valor entre 0.1 y 0.0001 para que funcione bien para la mayoría de los problemas. Obviamente, esto depende del problema, así que aproveche mi experiencia para lo que es.
  4. Además de comparar su código con las matemáticas que ha aprendido, al hacer una optimización basada en gradientes, puede ser muy útil calcular analíticamente los gradientes requeridos utilizando diferencias finitas y compararlos con los valores que está calculando en su código. Vea aquí para una discusión sobre cómo puede hacer esto. He detectado muchos errores de esta manera y ver pasar este tipo de pruebas siempre me ayuda a sentirme mucho más seguro de la corrección del código.
Alto
fuente