[MÚSICA] [MÚSICA] [MÚSICA] Empecemos repasando cómo calculábamos la pérdida en una regresión logÃstica. Si recuerdan de videos anteriores, definimos a z como el resultado de x por w más b, donde x son nuestras distintas variables independientes a las que multiplicábamos por un peso w en este caso, va a ser w1, w2, hasta wm, dependiendo de la cantidad de variables independientes que tengamos, y a lo cual le sumábamos una constante b. Para convertir esto en una regresión logÃstica que nos resuelva un problema de clasificación binaria 01, pasamos todo el resultado de z por una activación sigmoida, que nos daba como resultado un resultado de y sombrero, que puede ser o 0 o 1. Esto si lo miramos para una sola observación, podemos calcular el cálculo de la pérdida donde comparábamos a y sombrero, que era nuestra estimación en nuestro algoritmo, con el verdadero y de esa observación usando esta función escrita aquÃ. Grafiquemos ahora el gráfico computacional usando un ejemplo. Supongamos que ahora tenemos dos variables independientes, x1 y x2, a lo cual multiplicamos por sus ponderadores w1 y w2, y tenemos nuestra constante b. Si pasamos esto a nuestra función z, tendrÃamos la siguiente ecuación que luego nos permitirÃa calcular nuestro y sombrero, pasando por la función sigmoida al resultado de z. Todo esto nos permite calcular para cada una de las observaciones la función de pérdida de y sombrero y de y. Esto es lo que vamos a llamar forward propagation, es decir, la propagación hacia adelante desde los valores de input hasta el resultado final. Lo que buscamos optimizar es la minimización de esta pérdida y para poder lograr eso lo que vamos a hacer es modificar los pesos que tiene, el valor que tiene w1, w2 y b hasta que logremos esa minimización. Para minimizarlo usaremos el descenso del gradiente como vimos hasta ahora. El siguiente paso va a ser calcular las derivadas para nuestro gráfico computacional. Vamos a repetir nuevamente el gráfico del slide pasado, y vamos a empezar a calcular las distintas derivadas yendo desde el final hasta el principio. Comenzando por la derivada de la pérdida, la derivada de pérdida y sombrero, y, en relación a la derivada de y sombrero. Es decir, cómo cambia nuestra pérdida en función a pequeños cambios en y sombrero. A esta derivada la vamos a llamar la derivada de y sombrero. El siguiente paso es ir un poco más atrás y ver cómo impacta a nuestra función de pérdida un pequeño cambio en z, es decir, en la función que multiplica nuestras variables independientes por los pesos de w más b. A esta segunda derivada la vamos a llamar la derivada de z. Finalmente, porque nuestro objetivo final es llegar a calcular cómo afecta la derivada en cada uno de los parámetros que queremos utilizar, w1, w2, y b. Para esto, lo que vamos a calcular es la derivada de la pérdida en función de la derivada de w1, es decir, cómo afectan pequeños cambios de w1 a nuestra pérdida. Recordemos que w1 es la ponderación que multiplica a x1 que es nuestra primera variable independiente. Con lo cual, lo que estarÃamos afectando con w1 serÃa cómo pesa x1 dentro de nuestra regresión. A esta derivada la vamos a llamar la derivada de w1. De forma similar, vamos a ver la derivada de nuestra pérdida en función de la derivada de w2. Lo cual vamos a llamar derivada de w2, que recuerden, impacta sobre x2, con lo cual vamos a ver cómo afecta un cambio en la poderación de x2, en la función de pérdida que tenemos para esta regresión. Por último, también vamos a hacer lo mismo para nuestra constante. Y vamos a calcular la derivada de nuestra pérdida en función de la derivada de nuestra constante. Y a esto le vamos a llamar derivada de b. Todo esto lo vamos a ir actualizando estos parámetros de la misma forma que vimos en los videos pasados, cuando a w1 lo actualizábamos restando nuestro ratio de aprendizaje multiplicado por la derivada de w1, a nuestro parámetro w2, lo autorizamos restando el ratio de aprendizaje por la derivada de w2, y de la misma forma a nuestra constante b la actualizamos restándole el ratio de aprendizaje multiplicado por la derivada de b. Solo un pequeño comentario para los que estén un poco asustados, un poco perdidos con tanta notación matemática. Si no entienden de todo esto, pueden volver a repasarlo más tranquilos, y viendo los videos pasados. Pero no se preocupen si todavÃa no quedan las cosas del todo claras. Una vez que veamos esto aplicado en la práctica van a entender un poquito mejor por qué se usan y cómo funcionan y ahà va a ser bastante más claro que viéndolo solamente en la notación matemática. Hasta ahora, vimos cómo realizar todos los cálculos necesarios para actualizar la ponderación de nuestros parámetros para una sola observación. Ahora bien, dado que nuestro data set tiene n observaciones o n ejemplos, ¿cómo podemos hacer para calcular la pérdida sobre todo de los ejemplos, y el tener un mejor aprendizaje de la función que estamos tratando de representar? Recordemos nuestra función de costo que la definÃamos como J de w, b, que era igual al promedio, es decir, 1 sobre n de la sumatoria, de nuestra pérdida en cada una de las observaciones. Recuerden la pérdida como y sombrero, y, y que es el valor realmente observado, nuestra predicción y el valor realmente observado. Resulta ser que la derivada de un parámetro solo, sin la derivada de la pérdida, para w1 sobre todo en data set, es igual al promedio, es decir, a la sumatoria dividido n, de la derivada de la pérdida de w1 para cada una de las observaciones. Es decir, para cada uno de los parámetros de w, podemos calcular la pérdida para dw de 1, del primer parámetro, en cada una de las observaciones, y luego sacar el promedio. Esto lo podemos hacer a través, por ejemplo, de un loop con for, que vamos a ver a continuación. Vamos a ver ahora cómo calcularlo programáticamente. Empecemospor definir nuestros parámetros J, la derivada de w1, la derivada de w2, y la derivada de nuestra constante, todo como 0. Vamos a hacer un loop de for que va a arrancar desde 1, y va a ir hasta n que es la cantidad de observaciones que tiene nuestra data set. Vamos a calcular en cada iteración el z que le corresponde a esa observación, es decir, w por los x, más b. Vamos a aplicar la función sigmoida sobre ese resultado, y vamos a ir acumulando J el error que tenemos a un lado en cada una de las iteraciones. Además, calculamos dz como la diferencia entre y sombrero, que es nuestra predicción, menos el resultado real que es y de cada observación. Vamos a acumular en la derivada de w1 a x1 para cada una de las observaciones, multiplicado por dz para esa observación, en la derivada de w2, lo mismo con la segunda variable, y en la derivada de nuestra constante. Simplemente vamos sumando el error de dz, la derivada de dz. Hay que tener en cuenta que acá simplemente estamos acumulando cada uno de estos parámetros, y si lo que queremos obtener es el promedio como lo vimos en la clase anterior, vamos a tener que dividir cada uno de estos parámetros que estamos acumulando por m que es la cantidad de observaciones que tiene nuestra data set. Ahora bien, cuando tenemos calculadas estas derivadas promedio, lo que you podemos aplicar es la [INCOMPRENSIBLE] de descenso del gradiente, usando la fórmula que vimos en el video anterior, donde actualizamos el peso de w1 como w1 menos el factor de aprendizaje, multiplicado por la derivada de w1, lo mismo para w2, y lo mismo para la constante. Este serÃa el proceso completo para aplicar la regresión logÃstica sobre el ejemplo optimizándolo con descenso de gradiente. Si se fijan, estamos utilizando dos for loops, uno que está explÃcitamente expuesto acá, que es una iteración por cada una de las observaciones que estamos haciendo de este data set, y un segundo for loop que es por la cantidad de parámetros que tenemos. Tengan en cuenta que en este ejemplo por simplicidad solamente estamos trabajando con dos variables independientes, x1 y x2, con sus correspondientes pesos, w1 y w2. Sin embargo, podemos trabajar con ejemplos donde tengan miles de parámetros de entradas o hasta millones inclusive, con lo cual es mucho más eficiente en cuanto al código trabajar cada uno de esos parámetros con una iteración de for, donde hagamos este mismo cálculo iterativamente. Y ese for va a tener el tamaño de d1 hasta m, que esa es la cantidad de parámetros y variables independientes que vamos a trabajar, más 1, que serÃa nuestra constante. Como vamos a ver en los próximos videos, trabajar en Python con For Loops que iteren sobre muchas observaciones y muchos parámetros, termina siendo sumamente lento. En estos dÃas donde la teorÃa del deep learning es trabajar con data set cada vez más grandes, y en algoritmo que trabaje con cada vez más parámetros, esto no parece ser lo más eficiente. Para eso, vamos a implementar otra técnica que se llama vectorización que va a hacer mucho más rápida y eficiente este procesamiento, y nos va a ayudar a trabajar de esta forma mucho más rápido. [MÚSICA]