This graph shows how many times the word ______ has been mentioned throughout the history of the program.
Hola chicas y chicos, bienvenidos a DotCSV, tu canal sobre Inteligencia Artificial que
te trae todo sobre este apasionante mundo y hace tiempo que no decía esta frase a cámara
y la verdad que mola.
Hoy venimos con un nuevo capítulo de esta serie, de hecho va a ser el último capítulo
de la serie de Aprendiendo Redes Neuronales.
Este es el capítulo número 3.5 o 3.5 como lo quieras ver.
En la primera parte pues recordarán que vimos todo como era el funcionamiento de una neurona
dentro de una red neuronal, luego en la segunda parte vimos como juntando neuronas podíamos
crear este tipo de red que nos permitía codificar información más compleja y eso luego estuvimos
jugando con ese concepto en la parte 2.5 en la que estuvimos con una red neuronal viendo
un poco cuál era la intuición geométrica que reside dentro de una red neuronal, luego
en la tercera parte que la estrenamos la semana pasada, madre mía que poco tiempo entre vídeos
eh, raro en mi, en la tercera parte nos metimos a ver cómo era el entrenamiento de las redes
neuronales, cómo funcionan para que aprendan automáticamente porque al fin y al cabo son
algoritmos de machine learning, queremos que aprendan por sí solas, así que en ese vídeo
pues tuvimos un poco de acercamiento al algoritmo de back propagation, retro propagación que
es el que hace entrenar a las redes neuronales en combinación con el descenso del gradiente
y estuvimos viendo un poco cuál era la intuición de este algoritmo, como prometí en ese vídeo
ahí solamente vamos a tener una idea de cuál era el funcionamiento, de por qué lo utilizábamos
y no utilizábamos otras técnicas y la parte matemática la dejaríamos para otro vídeo
más adelante, ese vídeo es hoy, hoy vamos a centrarnos en entender la formulación matemática
del algoritmo de back propagation y como dije en el otro vídeo no hay de qué asustarse
porque la verdad es que las fórmulas más allá de que parezcan muy complejas porque
tienen mucha nomenclatura, muchas variables, mucha derivada por aquí, derivada por allá,
no tienen ninguna complejidad y lo van a ver en este vídeo, antes de comenzar quiero hacer
un repaso muy rápido de lo que vimos en el vídeo anterior, si no lo han visto pues recomiendo
ir a verlo corriendo por supuesto, pero vamos a hacer un pequeño repaso de una serie de
conceptos que quería dejar claro, lo primero que quiero recordar es para qué estamos utilizando
el algoritmo de back propagation, back propagation lo estamos utilizando como un método para
calcular las derivadas parciales de cada uno de los parámetros de nuestra red con respecto
al coste y por qué queremos tener esto, bueno porque esto es una de las componentes que
necesitamos tener para luego optimizar a la red neuronal haciendo uso del algoritmo del
descenso del gradiente, el aprendizaje, lo que es el entrenamiento real, la optimización
por la cual vamos a minimizar el coste de la red neuronal, es decir vamos a entrenar
a la red, se realiza en base al algoritmo del descenso del gradiente, pero claro para
que el descenso del gradiente pueda funcionar necesita el vector gradiente y el vector gradiente
no deja de ser un vector con las derivadas parciales de estos parámetros con respecto
al coste y esas derivadas parciales trata el algoritmo de back propagation, hasta ahí
claro ¿no? de hecho a mí me gusta pensar en esta diferencia entre back propagation
y gradient descent o el descenso del gradiente con una analogía, imaginémonos una empresa,
el organigrama de una empresa en la que hay diferentes mandos y cada uno obviamente tiene
una relación, ya puede ver que esa relación de dependencia entre trabajadores de diferente
nivel, currante, directivos medios, altos directivos, el director de la empresa pues
se podría asemejar ese organigrama a lo que tenemos en una red neuronal, al fin y al cabo
es un grafo no cíclico direccional, un DAF en inglés, ahora imaginemos que esta empresa
durante un trimestre ha tenido un mal resultado financiero, no ha tenido mejora de ganancias,
ha tenido un mal resultado ¿vale? y eso le llega al jefe de la empresa en la cúspide
de nuestro organigrama, ese jefe va a ver eso, va a ver el error que ha tenido la empresa
y se va a cabrear mucho, con lo cual le va a empezar a echar la bronca a los cargos que
tengan por debajo, el jefe se lo echará al alto directivo, el alto directivo se lo echará
al director medio, el director medio se lo echará a los jefes de departamento y los
jefes de departamento a los currantes, toda la mierda cae en cascada, lo que está pasando
aquí es que esa señal de error que se ha producido en la empresa se está retro propagando
por toda su estructura y claro cada jefe pues intentará pedirle a sus trabajadores,
a los cargos que tengan por debajo que rindan cuentas, que les preguntará ¿por qué ha
ocurrido esto? ¿qué responsabilidad tienes tú en este mal resultado? Claro, cada una
de las neuronas en nuestra analogía podrá un reporte de cuál ha sido su responsabilidad
en dicho resultado y eso se escribirá en un reporte que a lo mejor se le pasará al
departamento de recursos humanos, ese papelito, ese reporte que se le va a pasar al departamento
de recursos humanos con las responsabilidades de cada trabajador, es lo que a mí me gusta
pensar que es el gradiente en nuestro modelo, es ese documento donde se recogen todas las
responsabilidades de las neuronas de nuestra red, de nuestra empresa, con la responsabilidad
de cada uno de los nodos de trabajo, ese proceso que hemos hecho en la empresa donde hemos
sacado estos documentos es el algoritmo de backpropagation, ahora cuando cojamos esos
reportes y se lo pasemos al departamento de recursos humanos y el departamento de recursos
humanos lo lea y diga vale tal trabajador ha tenido tanta responsabilidad en estas pérdidas
con lo cual hay que despedirlo o a lo mejor hay que modificar un poco su comportamiento
porque está trabajando mal o bien, ahí el departamento de recursos humanos estaría
operando en la labor del algoritmo del descenso del gradiente ¿vale? Una vez hemos hecho
la distinción entre el algoritmo de backpropagation y el descenso del gradiente ya podemos pasar
a ver la parte de formulación matemática y si esto te suena que va a ser algo complicado
o difícil de entender déjame decirte que yo también tenía ese recuerdo de que el
algoritmo de backpropagation tenía una dificultad en entender su formulación pero quizás es
que nunca me lo habían contado de la manera en la que yo me he podido documentar y voy
a reflejarla en este vídeo, en cualquier caso si después de ver este vídeo todavía se
te generan algunas dudas o hay cosas que no entiendes en la sección de comentarios estaré
respondiendo todas las preguntas que se generan a partir de este vídeo así que no pierdas
nada por preguntar y no te quedes con ninguna duda en el tintero dicho lo cual vamos a pasar
a ver la parte de la formulación matemática imaginemos que tenemos una red neuronal la
red recién salida de la caja tiene sus parámetros inicializados de forma aleatoria significando
eso que el resultado que vamos a obtener para un input cualquiera es bueno aleatorio por
supuesto y cuando lo comparemos con el valor real veremos que probablemente la predicción
ha sido una completa basura y que la función de costel asignará un error muy elevado perfecto
vamos a usar dicho error para entrenar a la red veamos como hemos dicho lo que queremos
calcular para cada parámetro dentro de la red neuronal es la derivada parcial del coste
respecto a cada uno de los parámetros de la red si recuerdas en una red neuronal hay
dos tipos diferentes de parámetros los pesos w y el término de sesgo o vallas b esto significa
que en realidad tendremos que calcular dos tipos diferentes de derivadas parciales una
respecto al parámetro w y otra respecto al parámetro b hasta el momento bien no vale
pues como hemos dicho vamos a empezar a trabajar hacia atrás comencemos a calcular la derivada
de los parámetros de la última capa para mejor comprensión vamos a marcar con un super
índice el número de la capa a la que pertenece el parámetro si nuestra red neuronal tiene
el capaz entonces estas son las derivadas que queremos calcular para los parámetros
de la última capa y como lo calculamos pues para calcular esta derivada es importante
analizar cuál es el camino que conecta el valor del parámetro y el coste final en la
última capa este camino no es muy largo aunque aún así tiene varios pasos fíjate si
recuerdas el funcionamiento de la neurona el parámetro w participaba en una suma ponderada
a la que nos vamos a referir como zeta que luego sería pasada por la función de activación
a el resultado de las activaciones de la neurona en la última capa conformarían el resultado
de la red que luego sería evaluada por la función de costes c para determinar así
el error de la red esto que hemos descrito aquí donde el resultado de una función es
pasado por otra y por otra es lo que se denomina composición de funciones y para calcular
la derivada de una composición de funciones tenemos que tirar de una herramienta de cálculo
matemático denominado chain rule podría dar una definición muy formal que explique
la chain rule pero he encontrado un ejemplo mucho más simpático y asimilable si yo te
digo que una liebre es tres veces más rápida que un perro y un perro cinco veces más rápido
que una tortuga cuántas veces es más rápida la liebre que la tortuga efectivamente 15
veces más rápida guau eh matemática de la dura la chain rule lo que nos dice es que
para calcular la derivada de una composición de funciones simplemente tenemos que multiplicar
cada una de las derivadas intermedias entonces vamos a aplicar esto a nuestro problema nuestra
derivada w respecto al coste y b respecto al coste influyen a través de esta composición
que hemos anotado aquí así que si aplicamos la chain rule para resolver estas derivadas
necesitamos entonces calcular todas estas derivadas intermedias de aquí o vaya o sea
que ahora en vez de tener que calcular una derivada parcial tenemos que calcular tres
derivadas parciales vaya chollo pues si y es que estas tres derivadas parciales que tenemos
aquí son muy fáciles de calcular y si no fíjate derivada de la activación con respecto
al coste aquí lo que estamos hablando es cómo varía el coste de la red cuando variamos
un poco el output la activación de las neuronas en la última capa claro en la última capa
las activaciones de las neuronas es la salida de la red con lo cual lo que nos están pidiendo
es que calculemos la derivada de la función de coste con respecto al output de la red
neuronal que realmente es un cálculo muy sencillo de realizar son simplemente calculaciones
de cuarto de la eso o tercero o cuarto de la eso y si no fíjate si este por ejemplo
es nuestra función de coste el error cuadrático medio la derivada de la función con respecto
al output de la red es este de aquí puedes comprobarlo tú mismo usando papel y boli o
la derivada de aquí derivada de la activación con respecto a z o z en canario esto lo que
nos está diciendo es cómo varía el output de la neurona cuando variamos la suma ponderada
de la neurona si recuerdas lo único que se para a z con la activación de la neurona
es la función de activación con lo cual lo que nos están pidiendo realmente es que
calculemos la derivada de la función de activación si nuestra función de activación en la neurona
es una sigmoide por ejemplo esta expresión de aquí su derivada simplemente es esta de
aquí de nuevo cálculo de tercero de la eso y finalmente tenemos esta derivada de aquí
que son simplemente como varía la suma ponderada z con respecto a una variación de los parámetros
recordemos que la red neuronal tiene dos tipos de parámetros que son w los pesos y b el
término de sesgo pues simplemente tenemos que calcular esas dos derivadas la derivada
de la suma ponderada con respecto al término de sesgo es simplemente uno porque el término
sesgo es independiente con lo cual la derivada es constante uno con respecto a w la derivada
simplemente es el valor de entrada a la neurona que conecta a esa conexión para la cual el
parámetro hace referencia fíjate que en este caso los valores de entrada de la neurona
a l menos 1 se corresponde con el output con la salida de la neurona de la capa anterior
la capa l menos 1 finalmente la solución que estamos buscando para los parámetros
de la última capa se calcula computando esta fórmula de aquí donde cada una de las derivadas
parciales que hemos derivado se multiplican unas con otras ahora vamos a hacer uso de
la intuición que hemos desarrollado en el vídeo anterior este bloque de aquí representa
cómo varía el error en función del valor de z que es la suma ponderada calculada dentro
de la neurona es decir lo que nos cuenta esta derivada es en qué grado se modifica el error
el coste cuando se produce un pequeño cambio en la suma de la neurona si esta derivada
grande es que ante un pequeño cambio en el valor de la neurona este se verá reflejado
en el resultado final y por el contrario si la derivada es pequeña de igual como variamos
el valor de la suma ya que éste no afectará al error de la red es decir esta derivada
de aquí es la que nos va a contar qué responsabilidad tiene la neurona en el resultado final y por
tanto en el error esto es lo que dijimos antes si la neurona es una parte responsable del
error final entonces deberíamos utilizar esta información para achacarle parte de
ese error por esta misma lógica es por lo que se suele interpretar a esta derivada de
aquí como el error imputado a esta neurona este error de la neurona se representa con
el siguiente símbolo por tanto para simplificar podemos reestructurar nuestra expresión inicial
de esta manera en función del error de las neuronas de la capa l así por un lado tenemos
que la derivada del coste respecto al término de bayas es igual al error de las neuronas
y la derivada del coste respecto w es igual al error de las neuronas multiplicado por
la activación de la capa previa así ya hemos deducido tres expresiones diferentes que nos
permiten obtener las derivadas parciales que estamos buscando para la última capa una
que no dice cómo calcular el error de las neuronas en la última capa y otra dos para
cada una de las derivadas parciales bueno todo este trabajo para una única capa sólo
nos quedan l menos una bua vaya rollo pues no y aquí es donde mana la belleza del algoritmo
de back propagation te adelanto que aparte de estas tres expresiones sólo necesitamos
una más para poder calcular el resto de derivadas de la red no me crees fíjate qué hacemos
si ahora queremos calcular los parámetros de la capa anterior la capa l menos 1 pues
nada repitamos el mismo razonamiento en este caso al aplicar la chain rule aquí nuestra
expresión se prolonga hasta convertirse en esto tenemos el coste de la activación de
la última capa la suma ponderada la transformación a la capa anterior la función de activación
la espera un momento como estamos yendo hacia atrás esto de aquí ya lo hemos calculado
que es el error de la capa l y estas derivadas operan igual que antes uno y la activación
de la capa previa y está de aquí es la derivada de la función de la activación en esta expresión
lo único que haría falta calcular sería esta derivada que nos habla de cómo varía
la suma ponderada de una capa cuando se varía el output de una neurona en la capa previa
esta derivada también es simple de calcular y es básicamente la matriz de parámetros
w que conecta ambas capas básicamente esto lo que hace es mover el error de una capa
a la capa anterior distribuyendo el error en función de cuáles son las ponderaciones
de las conexiones con esto ya tendríamos nuevamente una expresión a partir de la cual
obtener las derivadas parciales que estamos buscando nuevamente este bloque de aquí se
convierte en esta derivada que vuelve a representar al error de las neuronas en esta capa y aquí
es donde no debemos de parar y valorar la eficacia del algoritmo de back propagation
porque lo que hemos hecho en esta capa ya es extensible al resto de las capas de la
red aplicando la misma lógica tomamos el error de la capa anterior lo multiplicamos
por la matriz de peso en una transformación que viene a representar la retro propagación
de los errores y calculamos las derivadas parciales respecto a los parámetros y así
sucesivamente recorriendo todas las capas de la red hasta el final con esto con un único
pase habríamos calculado todos los errores y las derivadas parciales de nuestra red haciendo
solo uso de cuatro expresiones estas de aquí como ves el algoritmo de back propagation simplemente
derivar cuatro expresiones que vamos a necesitar para recorrer de atrás al comienzo toda nuestra
red neuronal para calcular las derivadas parciales que estamos buscando estas expresiones son bastante
intuitivas porque simplemente nos están contando cómo tenemos que utilizar el error de la capa
anterior para calcular el error en esta capa que pasa que hay dos casos diferentes uno es en la
última capa donde el error ya pertenece a la función de coste y otros son el resto de capas
de nuestra red que dependen de otra capa y claro una vez tenemos estas dos expresiones que nos
cuentan cómo podemos calcular el error en la capa actual con respecto a la capa anterior ahora
necesitamos otras dos expresiones que nos cuenten cómo calcular a partir del error en nuestra capa
las derivadas parciales para el parámetro de vallas y el parámetro de los pesos a que parece
sencillo ahora de nuevo repito si no has entendido todos los conceptos que hemos hablado o si has
encontrado algún fallo en el vídeo hazmelo saber en los comentarios porque repito voy a estar
respondiendo todas las preguntas que surjan a partir de esto porque quiero que quede bastante
claro en cualquier caso simplemente con tener una intuición de cómo funciona el algoritmo de back
propagation yo creo que es suficiente para todo lo que vamos a hacer a partir de ahora en el canal
como ya he dicho este es el final de la serie de redes neuronales y realmente ya no queda mucho más
que ver simplemente bueno nos faltaría ver redes convolucionales o redes recurrentes o bueno también
tenemos que hablar de overfitting y sobre ajuste y regularización también tenemos que hablar claro
de cómo utilizar esto en autoencoder decoders
y