En el post anterior aprendimos a construir la red neuronal. En este post aprenderemos acerca del algoritmo de backpropagation usado para machine learning.
Acerca del tema de este post
Si no viste el post anterior, puedes leerlo aqui:
Automatiza decisiones con Inteligencia Artificial en Excel (instructivo para novatos. Parte 1)
Si una calculadora normal usa aritmética para hacer cálculos, lo que llamamos "inteligencia artificial" o IA (en inglés AI), usa estadística y cálculo. Y en un lugar donde esto se refleja de manera clara es en el algoritmo de back propagation.
Normalmente las explicaciones que verás parecen un nudo lleno de matemáticas incomprensibles, y la renuencia a explicar le da a los conocedores de IA ese aire de arrogancia de que el conocedor es un genio. Pero hoy vamos a derribar ese mito. Voy a mostrar los pasos del algoritmo de back propagation que en realidad es muy simple.
Siempre hay un poco de matemáticas, pero no es el nudo mental que hacen otros.
Cabe notar que aunque he usado Excel, para ejemplos ilustrativos porque casi todo el mundo lo tiene, Excel no es la herramienta más eficiente para este algoritmo. Lo mejor es usar C++ para obtener el mejor desempeño.
Hay muchas maneras de "enseñar" a (ajustar coeficientes de) una red neuronal. Uno de ellos es backpropagation, que usa cálculo y estadística para hacerlo.
En este post no voy a ver ejemplos. Me limitaré a explicar el algoritmo para que el post no sea muy extenso.
¿Y por qué backpropagation si hay otros métodos para ajustar coeficientes? Porque es un método muy elegante, a pesar de que recarga mucho el procesador cuando tienes redes muy grandes y muchos datos.
Construir la red es la mitad de la programación de una IA. La otra mitad es programarle con datos, y este algoritmo incorpora esos datos en la red neuronal y ajusta los coeficientes.
Conceptos preliminares
Antes de ver el algoritmo necesitamos comprender algunos conceptos para que la notación sea clara. En el post anterior vimos que tenemos una srie de datos de entrada x, unos pesos w y una salida y. También tenemos una función que se aplica a la suma de productos x * w, a la que llamaremos "función de activación".
Tienes datos x, que se multiplican por pesos w y se suman los productos xw. Al resultado le aplicas la función de activación para obtener y
Y una neurona se vería similar a esto:
y = función (x1 * w1 + x2 * w2 + x3 * w3 +....+ b)
Técnicamente hablando, el error b en realidad es un numero (que generalmente se inicializa en 1) multiplicado por un peso w. Si tienes n número de entradas en una neurona, tendrás pesos w que se numeran desde 0 hasta n-1. El peso w con el subíndice n es el que corresponde al error. Esto sirve cuando vayamos a ajustar los pesos w de la neurona.
Ahora que ya vimos los componentes de una neurona, pasemos a ver la notación que usaremos para identificar las neuronas. La notación usada por distintos libros de textos y autores es la parte más confusa de comprender.
Como puedes ver, k identifica la capa (layer) de neuronas, y h identifica el número de neurona en esa capa.. Tenemos variables de entrada en el layer 0 y output, datos de salida. También tenemos un símbolo que denota error. Y como vamos a tener que calcular error para cada una de las neuronas, hemos numerado los errores usando k y h. Entonces lo que tenemos con estos índices es un sistema de coordenadas para ubicarnos en un lugar de la red.
La última capa es la capa 3. esta capa sería el "output layer".
Las otras capas anteriores, capas 1 y 2 son capas ocultas o "hidden layers"
El algoritmo de backpropagation se usa cuando tienes datos de entrada y sabes cuales son los resultados que deberías obtener, pero no sabes los valores de los coeficientes para que esto suceda. Backpropagation hace aproximaciones sucesivas para calcular los coeficientes o pesos w hasta alcanzar un punto cercano al óptimo. La red neuronal debería arrojar entonces resultados muy cercanos a los esperados.
Ahora que ya entendimos la nomenclatura, empecemos.
Ahora que ya vimos los componentes de una neurona, pasemos a ver la notación que usaremos para identificar las neuronas. La notación usada por distintos libros de textos y autores es la parte más confusa de comprender.
Como puedes ver, k identifica la capa (layer) de neuronas, y h identifica el número de neurona en esa capa.. Tenemos variables de entrada en el layer 0 y output, datos de salida. También tenemos un símbolo que denota error. Y como vamos a tener que calcular error para cada una de las neuronas, hemos numerado los errores usando k y h. Entonces lo que tenemos con estos índices es un sistema de coordenadas para ubicarnos en un lugar de la red.
La última capa es la capa 3. esta capa sería el "output layer".
Las otras capas anteriores, capas 1 y 2 son capas ocultas o "hidden layers"
El algoritmo de backpropagation se usa cuando tienes datos de entrada y sabes cuales son los resultados que deberías obtener, pero no sabes los valores de los coeficientes para que esto suceda. Backpropagation hace aproximaciones sucesivas para calcular los coeficientes o pesos w hasta alcanzar un punto cercano al óptimo. La red neuronal debería arrojar entonces resultados muy cercanos a los esperados.
Ahora que ya entendimos la nomenclatura, empecemos.
Pasos del algoritmo de backpropagation
Debes seguir los siguientes pasos:
- Alimenta la red neuronal con datos. Los coeficientes (pesos) w pueden ser generados aleatoriamente para comenzar.
- Calculas el Mean Square Error MSE.
- Calcula el error para cada neurona de output layer
- Iterativamente calculas el error de las hidden layers
- Aplicas la regla delta
- Ajustas los pesos w.
Paso 1. Alimentar la red con datos
Alimentamos la red neuronal con los datos x. Tenemos los resultados esperados o y el resultado de aplicar las fórmulas y.
Paso 2. Calcular el Mean Square Error (MSE)
Como hay dos outputs, n = 2
Como puedes ver, la fórmula usa una sumatoria de la diferencia entre valores esperados y obtenidos, elevados al cuadrado. El MSE es el promedio de estos valores..
Como puedes ver no hay gran magia en esto. Si buscas información del back propagation probablemente las variables reciban distintos nombres, pero la formula es la misma.
Paso 3. Calcular el error de cada neurona de salida
El valor del error es el resultado de multiplicar la derivada de la funcion de activación de la neurona de salida y se multiplica por el error obtenido (la diferencia entre el valor esperado y el obtenido). Si ya se que es una molestia tener que averiguar las derivadas de las funciones de activación.
Error neurona = Derivada de funcion de activacion * Error de output
Cabe aclarar que las neuronas de salida en este caso son las de layer 3. Así se vería un ejemplo de la fórmula del error si las neuronas usaran función sigmoide.
Y si, ya lo sé. Ya se que es fastidioso buscar la derivada de la función de activación. Debes usar la derivada de la función de activación que estés usando en cada neurona, y vas neurona por neurona calculando los errores para el ouput layer.
Como se trata del output layer que es el layer 3, entonces k = 3.
Paso 4. Iterativamente calcula el error para las hidden layers
Ya que calculamos el error para las neuronas del output layer, ahora calculamos el error para los layers, yendo hacia atrás (por eso es que se llama backpropagation). Primero calculamos errores para la capa 2 y luego la capa 1.
Se sigue usando la fórmula de error pero la manera de calcular el output error cambia.
En este ejemplo, la neurona también usa sigmoide, así que le calculamos la derivada. En la segunda parte, lo que tenemos es una fórmula que suma el producto de los pesos w por los errores de las neuronas de la siguiente capa.
Como puedes ver, la salida de una neurona se convierte en un valor x para las neuronas de la capa siguiente. Cada x tiene su peso w correspondiente en esa neurona de la siguiente capa. Y es ese valor w el que usamos para calcular el error en la neurona de la capa anterior, porque backpropagation indica que estamos moviéndonos hacia atrás en la red neuronal.
A mayor peso, más se propaga el error.
Paso 5. Aplicas la regla delta
La regla delta te dice cuanto vas a hacer que cambie el coeficiente de peso w. El valor i indica el número de monomio donde se encuentra el peso w dentro de la neurona.
y = función (x1 * w1 + x2 * w2 + x3 * w3 +....+ b)
Por ejemplo, i = 2 para w2.
Como puedes ver existe un coeficiente de aprendizaje que se aplica a toda la red, que normalmente tiene un valor de 0.5. Pero puede requerir ajustarse. Si los cambios en los pesos son muy grandes debe disminuirse, y si los cambios son muy pequeños, debe aumentarse su valor.
Esto sucede porque si los cambios son muy grandes, los valores aportados por la neurona arrojar resultados subóptimos porque se salta las posibles mejores soluciones, pero si son muy pequeños, puede tardar mucho en encontrar el punto óptimo. Podemos pensar en este coeficiente como la resolución que vamos a tomar para hacer el barrido de las fotos del fondo del mar para encontrar al Titanic. Actualmente un pixel de los mapas del fondo del mar es de 1.5km. Así no vamos a encontrar al Titanic.
Si al encontrar el Titanic usáramos una IA con un coeficiente de aprendizaje, está claro que deberíamos disminuir el coeficiente para tener más resolución en los resultados. Hacer eso es como hacer una revisión más exhaustiva del fondo del mar, lo cual consume más recursos.
Paso 6. Aplicas los pesos
Tomas cada uno de los pesos y le aplicas el valor que calculaste con la regla delta.
Si los pasos son tan simples, te preguntas por qué Excel no sirve demasiado para redes neuronales grandes. La razón es simple. Cada vez que alimentas con datos x y sigues todos los pasos, ocurren pequeños cambios en los coeficientes w de las neuronas.
Normalmente un proceso de aprendizaje puede requerir cientos o miles de datos para alcanzar valores que podemos considerar como óptimos.
Corolario
Si quieres ver graficamente que es lo que sucede cuando aplicas este algoritmo, puedes ver estos videos.
VIDEO: Backpropagation calculus
VIDEO: What is backpropagation really doing?
El problema de estos videos es que no te dan los pasos para que construyas una IA.
Si miras que otro autor usa nombres diferentes para denotar lo que se ha mostrado aquí, lo que tienes que hacer es traducir lo visto aquí a la nueva notación. Pero el concepto es el mismo.
Seguramente ahora querrás aplicarle inteligencia artificial a todo. creerás lo que dice el marketing que te hace creer que la IA es casi un oráculo del conocimiento. Pero no es así. La IA es una calculadora de bolsillo nada más. Muy sofisticada, pero igual es una calculadora.
Si crees que vas a perder tu empleo porque una AI hace maravillas, en el mundo real, las posibilidades de perder el empleo por creerle a una IA a ciegas, sin verificar que los resultados que arrojan sean fiables, son mayores que los de perder el empleo por tener una IA muy competente. Lo que pasa es que si los datos que tenías te daban que la realidad era lineal, pero no tenías datos que te decían que la realidad es una curva, entonces los cálculos extrapolados por la IA, van a arrojar una recta y no una curva.
Hay muchas maneras de obtener bugs en la IA, y los resultados son muy desagradables. Así que mientras te entretienes jugando con la IA, no le creas todo. Si los datos no tienen el cisne negro, la IA no lo va a encontrar. Y si los datos sólo tienen cisnes negros, la IA no va a mostrarte la mayoría de los cisnes blancos. Y si encima la red neuronal esta mal modelada, porque el creador no consideró algo, tendrías un desastre entre manos.
Igual que el software normal necesita testing, asimismo la IA también lo necesita. Sólo puede haber errores en dos lugares. En la red neuronal o en los datos. Un buen matemático normalmente sabe los rangos dentro de los cuales va a caer un resultado. Si sumas 90 y 80, sabes que te da más de 100 y menos de 200. Algo similar debe suceder cuando usas la IA.
Normalmente saber el comportamiento de los datos es una capacidad que deberías tener mientras no tengas una IA fiable. Así la IA es una especie de asesor que sugiere algo, que en principio parece bien, pero que hay que verificar por cuenta propia.