Implementación y ejemplos de redes neuronales funcionando
Clase 9 de 9 • Curso de Redes Neuronales y Backpropagation 2017
Traduzcamos las ecuaciones matemáticas en código solamente utilizando Numpy como nuestro motor de algebra lineal. Las redes neuronales son entrenadas en un loop en el cual cada iteración presenta datos de entrada ya calibrados a la red.
En este pequeño ejemplo, consideremos todo el dataset en cada iteración. Los cálculos del paso de Propagación hacia adelante, función de costo o pérdida, y Propagación hacia atrás conducen a obtener una buena generalización ya que actualizaremos los parámetros entrenables (matrices W1 and W2 en el código) con sus correspondientes gradientes (matrices dL_dw1 and dL_dw2) en cada ciclo.
El código está almacenado en este repositorio: https://github.com/omar-florez/scratch_mlp
¡Ejecutemos esto!
Mire abajo algunas redes neuronales entrenadas para aproximar la función XOR en múltiple iteraciones.
Izquierda: Exactitud. Centro: Borde de decisión aprendido. Derecha: Función Loss.
Primero veamos como una red neuronal con 3 neuronas en la capa escondida tiene una pequeña capacidad. Este modelo aprende a separar dos clases con un simple borde de decisión que empieza una línea recta, pero luego muestra un comportamiento no lineal. La función de costo en la derecha suavemente se reduce mientras el proceso de aprendizaje ocurre.
Teniendo 50 neuronas en la capa escondida notablemente incremental el poder del modelo para aprender bordes de decisión mas complejos. Esto podría no solo producir resultados mas exactos, pero también explotar las gradientes, un problema notable cuando se entrena redes neuronales. Esto sucede cuando gradientes muy grandes multiplican pesos durante la propagación hacia atrás y así generan pesos actualizados muy grandes. Esta es la razón por la que los valores de la función de costo repentinamente se incrementan durante los últimos pasos del entrenamiento (step > 90). El componente de regularización de la función de costo calcula los valores cuadrados de los pesos que ya tienen valores muy altos (sum(W^2)/2N).
Este problema puede ser evitado reduciendo la velocidad de aprendizaje como puede ver abajo, implementado una política que reduzca la velocidad de aprendizaje con el tiempo, o imponiendo una regularización mas fuerte, quizás L1 en vez de L2. Los gradientes que explotan y se desvanecen son interesantes fenómenos y haremos un análisis detallada de eso en otra ocasión.