logo

Dot CSV

Inteligencia Artificial, Tecnología, Ciencia y Futuro! Bienvenidos a la 4ª Revolución Industrial 🚀 Inteligencia Artificial, Tecnología, Ciencia y Futuro! Bienvenidos a la 4ª Revolución Industrial 🚀

Transcribed podcasts: 213
Time transcribed: 5d 22h 50m 3s

This graph shows how many times the word ______ has been mentioned throughout the history of the program.

Si recuerdan el vídeo sobre recreción lineal, se acordarán que vimos cómo podíamos entrenar
a este modelo a partir de nuestros datos.
La estrategia básicamente era plantearlo de forma matemática, y buscar mediante el método
de mínimos cuadrados una fórmula que nos dijera exactamente cuál era el punto mínimo
de la función de coste, fácil y sencillo.
Sin embargo, si las cosas fueran tan sencillas, este campo no sería tan emocionante.
Como vimos, el método de cuadrados ordinarios estaba limitado a ese modelo y esa función
de coste.
Hoy veremos el método del descenso del gradiente, o gradient descent, un algoritmo clave dentro
del campo del machine learning, y que se encuentra en el corazón de la gran mayoría de los
sistemas de inteligencia artificial que se desarrollan hoy en día.
Tengo ya tu atención?
Genial.
Punto de partida.
En un modelo cualquiera, ya sea de recreción lineal u otra cosa, tenemos unos parámetros,
y si modificamos esos parámetros, podemos variar el error de nuestro modelo.
La función de coste será la que nos diga cuál es el error para cada una de las combinaciones
de nuestros parámetros, y matemáticamente esto es, bueno, una función, ya lo dice su
nombre, función de coste.
Por tanto, vamos a ver un poco de teoría matemática sobre funciones.
Mira, esto de aquí es una función convexa.
La definición geométrica que define como convexa una función la dejaremos a lado.
Lo que quiero que conozcas de este tipo de funciones es una propiedad que nos dice que
de encontrar un punto mínimo, por ejemplo este de aquí, podemos estar seguros de que
dicho punto será un mínimo global de la función.
Es decir, no encontraremos un punto de la función que sea inferior a este de aquí.
Intuitivamente vemos que este tipo de funciones tendrá normalmente forma de cuenco.
Por otro lado, tenemos esto de aquí, que es una función cóncava.
A efectos prácticos una función cóncava, si la invertimos añadiendole un símbolo negativo,
se nos convertiría en una función convexa, así que realmente no nos interesa.
La mandamos a tomar viento.
Y finalmente tenemos esta función de aquí, que son… bueno, que son un problema.
A ver, no me entiendas mal, es un problema sí, pero es el problema que queremos resolver.
A estas funciones se le denominan no-convexas, y más allá de su nombre tan poco original,
el problema surge porque ya no se cumple la propiedad que nos interesaba de las funciones
convexas.
Aquí es posible encontrarnos con un punto mínimo que no sea el mínimo global de la
función.
Por ejemplo, este punto local de aquí no es el global, ya que como vemos, este punto
de aquí es inferior.
El motivo de por qué es un problema es el siguiente.
Fíjate, ¿te acuerdas cómo hacemos para encontrar estos mínimos?
Sabemos que si derivamos una función, la derivada nos indica la pendiente de la función
en ese punto.
Visualiza esta operación matemática como si fuera un nivel de carpintero, con el que
podemos medir la inclinación en cada tramo de nuestra función.
Lo que hacemos con la derivada es igualar la pendiente a cero y resolver dicha ecuación
para así encontrar el punto donde la pendiente es nula.
Con las funciones convexas sabemos que solo hay un punto mínimo, y por tanto, solo tendremos
que resolver una ecuación.
Pero con las funciones no convexas, podemos encontrarnos con múltiples puntos mínimos,
y por tanto, múltiples ecuaciones que resolver.
Y no solo eso, ahora podemos tener otras zonas de la función con pendiente nula, por ejemplo
máximos locales, puntos de inflexión o puntos de silla.
Un sistema de ecuaciones enorme que es bastante ineficiente de resolver.
Vamos, un rollo.
Cuando resolvimos el modelo de regresión lineal, forzamos a que la función de coste
fuera el error cuadrático medio, porque así podíamos obtener una función con una forma
convexa, y por tanto, fácil de calcular.
Pero la diversidad de modelos y funciones de coste en el mundo del machine learning
nos obliga a encontrar una solución para las funciones no convexas.
Vamos a pensar juntos una solución.
Lo que vamos a hacer es aprovechar la información que nos proporciona el cálculo de la derivada
para ayudarnos a encontrar los mínimos locales.
Recuerda, la derivada nos informa de la pendiente de nuestra función.
Te voy a presentar un ejemplo, pero para que sea más intuitivo, vamos a imaginarnos este
mismo escenario en 3 dimensiones.
Nuestras funciones con máximos y mínimos se convierten ahora en figuras tridimensionales,
en un terreno abrupto de colinas, valles y montañas.
Imagínate que te colocan en un punto cualquiera de este terreno, y que tu misión es la de
llegar a la zona más baja de toda esta superficie.
Sin embargo, tú no tienes acceso al mapa del terreno y ni siquiera puedes observar
a tu alrededor.
Vas con los ojos cerrados.
En esta situación lo único que podrías hacer sería ir tanteando con el pie a la
inclinación del sitio en el que te encuentras.
Y tendría lógica que si queremos descender al punto mínimo, pues nos movamos en la dirección
hacia donde la pendiente descienda con mayor intensidad.
Por tanto, primero evaluamos la inclinación para encontrar la mayor pendiente, luego caminamos
una distancia en esa dirección y después nos paramos.
En la nueva posición volvemos a repetir el proceso, evaluamos la pendiente, detectamos
la dirección y avanzamos, y así iterativamente.
Esta es la lógica del algoritmo del descenso del gradiente.
Vamos a ver ahora cómo traducimos a las matemáticas esta intuición que acabamos de desarrollar.
Imagínate que esto de aquí es nuestra función de coste.
Se trata de una superficie tridimensional en el que los ejes X, Z son nuestros dos parámetros
y la Y el error de nuestro modelo.
Usamos dos parámetros para poderlo visualizar bien, en tres dimensiones, pero recuerda que
en Machine Learning solemos trabajar con modelos con miles y miles de parámetros.
Como cuando iniciamos el entrenamiento, nuestros parámetros se inicializan con un valor aleatorio,
esto equivale a iniciar en un punto cualquiera de este terreno.
Ahora apliquemos lo que hemos visto antes.
Queremos descender y no conocemos el terreno, pero sí podemos evaluar la pendiente en la
posición en la que estamos.
Como hemos visto, esto equivale a calcular la derivada de la función en dicho punto.
Como nuestra función es multidimensional, tendremos que calcular derivadas parciales
para cada uno de nuestros parámetros, y cada uno de estos valores nos dirá cuál es la
pendiente en el eje de dicho parámetro.
Sería como obtener las direcciones en un mapa para el eje norte-sur y este oeste.
Conjuntamente todas estas direcciones, es decir, todas las derivadas parciales, conforman un
vector que nos indica la dirección hacia la que la pendiente asciende.
Este vector se denomina el gradiente.
Lo que queremos hacer es descender, así que podemos utilizar este vector para tomar el
sentido opuesto.
Es decir, si el gradiente nos indica cómo tendríamos que actualizar nuestros parámetros
para subir, lo que haremos entonces será restarlo.
Esto notaría un nuevo conjunto de parámetros y por tanto nos llevaría a un nuevo lugar
de nuestra función, donde repetiremos el proceso múltiples veces, hasta llegar a una zona
donde movernos ya nos suponga una variación notable del coste.
Es decir, la pendiente es próxima a nula y lo más probable es que estemos en un mínimo
local.
Hemos por tanto minimizado el coste del modelo.
Mira, aquí tenemos el algoritmo que acabamos de deducir, pero para que realmente esté
completo todavía nos falta añadir un parámetro más, el ratio de aprendizaje.
El ratio de aprendizaje lo que hace es definir cuánto afecta el gradiente a la actualización
de nuestros parámetros en cada iteración, o lo que es lo mismo, cuánto avanzamos en
cada paso.
Esto es muy importante porque va a definir completamente el comportamiento de nuestro
algoritmo.
Para entenderlo mejor, vamos a ver un último ejemplo.
Esto que estás viendo en imagen representa una superficie tridimensional similar a la
que hemos visto antes, pero en este caso la observamos desde la parte superior.
Cada curva de nivel representa una altura en la que el coste es igual, y con ellas podemos
intuir los desniveles de nuestra función de coste.
Las cuatro áreas con niveles más estrechos representan los mínimos hacia donde debería
dirigirse nuestro punto.
Esta forma de visualizar las funciones es muy habitual en el campo del machine learning,
así que dedícale un tiempo a saber cómo interpretarlas.
Si ejecutamos el algoritmo, vemos cómo efectivamente el punto va avanzando en cada iteración hasta
aproximarse a uno de las zonas de mínimo coste.
Parece por tanto que el algoritmo funciona a la perfección para este valor del ratio
de aprendizaje.
Vamos a probar otros valores para ver cómo puede afectar al comportamiento del algoritmo.
Si probamos con un valor muy pequeño, vemos que poco a poco el punto se aproxima a la
zona de mínimo coste, aunque a costa de calcular muchas iteraciones.
Esto podría ser ineficiente al algoritmo, y también podría hacer que el punto quedara
atrapado con mayor facilidad en un punto local más ineficiente.
Por el contrario, si le asignamos un valor muy elevado, vemos cómo en cada iteración
los pasos que da son tan largos que el punto es incapaz de introducirse dentro de la zona
de mínimo coste, siendo imposible para el algoritmo converger en dicho punto, y causando
que el proceso de optimización quede en un bucle infinito.
Como vemos, la correcta configuración del ratio de aprendizaje es fundamental para poder
hacer que el algoritmo funcione bien.
Hay diferentes técnicas que sirven para ajustar este parámetro de forma dinámica, al igual
que hay mejoras en las fórmulas que hemos visto para que el movimiento del punto sea
más eficiente.
Todas estas técnicas las iremos viendo en futuros vídeos, para así poco a poco ir ampliando
nuestro conocimiento en el campo de la optimización de funciones no convexas.
Un campo fundamental en el universo del machine learning, y que como veremos en el próximo
vídeo es un componente clave en el algoritmo de redes neuronales.
Espera un momento, ¿he dicho redes neuronales en el próximo vídeo?
Sí, ¡empieza lo bueno!