Una red neuronal “aprende” al intentar resolver un problema de optimización para elegir un conjunto de parámetros que minimice una función de error, que es la suma típica de errores al cuadrado. Esta definición de aprendizaje no es exclusiva de un modelo de red neuronal. Considere, en el caso más simple, un modelo lineal de la forma [math] y = XB [/ math]. Dado un vector de datos [math] y \ in \ mathbb {R} ^ m [/ math], seleccionamos [math] B \ in \ mathbb {R} ^ n [/ math] que minimiza [math] || y -XB || _2 [/ math], donde [math] X [/ math] es una matriz de [math] m [/ math] by [math] n [/ math] con “datos de entrenamiento” en las filas. Resolver este problema de minimización de mínimos cuadrados tiene un buen resultado analítico de forma cerrada: [math] \ hat {B} = (X ^ TX) ^ {- 1} X ^ Ty [/ math]. Sin embargo, existe un compromiso entre la facilidad computacional de encontrar los parámetros óptimos del modelo y la complejidad del modelo. Esto es evidente en el caso lineal, ya que el modelo es extremadamente fácil de ajustar pero tiene una forma muy simple. La red neuronal intenta encontrar un “punto óptimo”: mientras que el modelo es altamente no lineal, su forma funcional particular permite un procedimiento de ajuste computacionalmente pulido llamado “backpropogation”. Para apreciar completamente esta idea, primero debemos definir el modelo.
- El modelo:
Una “red neuronal” es una función de [math] f: \ mathbb {R} ^ m \ rightarrow \ {- 1,1 \} [/ math]. Escribir la forma matemática en una expresión monstruosa es excesivamente feo, así que la desglosaremos con palabras y diagramas. Una red neuronal con capas [math] L [/ math] y [math] d_l [/ math] por capa se parece a lo siguiente:
La entrada a cada neurona es una combinación lineal de las salidas de cada una de las neuronas en la capa inferior. La salida de la neurona es un umbral no lineal que se aplica a su entrada: es algo que asigna la línea real a (-1,1) de una manera 1-1, de modo que “la mayoría” de la línea positiva se asigna bastante cerca de 1 y y “la mayoría” de la línea negativa se asigna bastante cerca de -1. Una opción común es la función [math] g (x) = \ frac {e ^ xe ^ {- x}} {e ^ x + e ^ {- x}} [/ math].
- ¿Qué debo aprender en los próximos diez minutos que serán útiles a lo largo de mi vida?
- ¿Es útil aprender un lenguaje ensamblador en robótica moderna o clásica?
- ¿Qué debo esperar aprender de mi primera pasantía en CS? ¿Cuáles fueron algunas de las cosas más importantes que aprendió de su experiencia de pasantía?
- En muchos sentidos, ¿aprender a programar ahora es más difícil de lo que era en el pasado (por ejemplo, los 80) cuando las cosas eran mucho más simples?
- ¿Qué es el aprendizaje del juego?
La salida final de la señal es el signo de la neurona superior. Tenga en cuenta que la capa superior está restringida para tener una sola neurona. En el ejemplo de dibujos animados anterior, tenemos 3 capas con 3 neuronas en la primera capa, 2 en la segunda y 1 en la parte superior.
2. Ajustando el modelo con “Backpropagation”
El objetivo de ajustar el modelo es encontrar un conjunto adecuado de “pesos”, que podamos designar de forma compacta como [math] w [/ math], para las entradas de cada una de las neuronas. Una forma de hacerlo es elegir un conjunto de ponderaciones que minimice la suma de los errores cuadrados para los ejemplos de entrenamiento que ya tenemos. La intuición aquí es elegir un modelo que esté “cerca” del modelo verdadero, tal como lo haríamos en una regresión lineal. Sin embargo, a diferencia de la regresión lineal, una solución analítica no es factible debido a las feas funciones de umbral, por lo que debemos recurrir a un enfoque computacional como el descenso de gradiente. La pendiente de gradiente toma pasos en la dirección de la mayor disminución de Error en el espacio del parámetro, esperando encontrar un mínimo (global). (Recuerde que, a partir del cálculo multivariable, el gradiente del campo escalar apunta en la dirección del mayor aumento de la función, y así, al caminar en la dirección opuesta apunta en la dirección de mayor disminución repitiendo el argumento con el negativo de la función).
Comience por inicializar el modelo con un conjunto arbitrario de pesos. Avanzando, dada una entrada [math] x \ in \ mathbb {R} ^ m [/ math], podemos calcular la salida como se indica arriba. Por lo tanto, podemos calcular el error [math] E = (yf (x)) ^ 2 [/ math], que es el error del primer ejemplo de entrenamiento. Ahora, calculamos el gradiente de esta función de error con respecto a los pesos.
La belleza del método es que el cálculo del gradiente del error es ingenioso y se puede hacer recursivamente usando la regla de la cadena. Para ver esto, introduciremos alguna notación. Deje que [math] k = 1 … L [/ math] indique capas, suponga que [math] s_ {jk} [/ math] es la salida de la neurona jth en la capa [math] k [/ math], [math] x_ {jk} [/ math] es la entrada a la neurona [math] j [/ math] en la capa [math] k [/ math], y [math] w_ {ijk} [/ math] es el peso de la señal entrada en la [math] j [/ math] th neurona en la capa [math] k [/ math] que proviene de la [math] i [/ math] th neuron en la capa [math] k-1 [/ math], así que que [math] x_ {jk} = \ sum_ {i = 1} ^ {d_ {k-1}} {w_ {ijk} s_ {ik-1}} [/ math] y [math] s_ {jk} = g (x_ {jk}) [/ math]. Tenga en cuenta que [math] d_ {k-1} [/ math] representa el número de neuronas en la capa [math] k-1 [/ math]. Por la regla de la cadena, [math] \ frac {\ partial E} {\ partial w_ {ijk}} = \ frac {\ partial E} {\ partial s_ {jk}} \ frac {\ partial s_ {jk}} { \ partial w_ {ijk}} [/ math]. Dado que [math] x_ {jk} [/ math] es lineal en los pesos, la parte difícil es solo en el cálculo del componente anterior del producto. Podemos recursivamente calcular esto como
[math] \ frac {\ parcial E} {\ parcial s_ {jk}} = \ frac {\ parcial E} {\ parcial x_ {jk}} \ frac {\ parcial x_ {jk}} {\ parcial s_ {jk }} = \ sum_ {i = 1} ^ {d_ {k + 1}} \ frac {\ parcial E} {\ parcial s_ {ik + 1}} \ frac {\ parcial s_ {ik + 1}} {\ parcial x_ {jk}} \ frac {\ parcial x_ {jk}} {\ parcial s_ {jk}} [/ math]
La recursión termina desde [math] \ frac {\ partial E} {\ partial x_ {1L}} = 2 (x_ {1L} -y) [/ math]. Comenzamos calculando los gradientes de la capa superior, y almacenamos los gradientes a medida que avanzamos hacia abajo en cada capa, de modo que no necesitamos volver a calcular los gradientes. Esto conduce a la eficiencia computacional.
Por lo tanto, “aprender” en una red neuronal no es más que iterar entre calcular el error utilizando los datos de entrenamiento y actualizar los pesos calculando el gradiente de la función de error.
3. Referencias
Aprendí este material del profesor Yaser Abu-Mostafa en Caltech en su curso CS156. Esto está disponible en línea en: Learning From Data – Curso en línea (MOOC). También recomendaría su libro de texto: Learning From Data MOOC