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.

¿Cuántas veces habéis escuchado esto de que una red neuronal es algo así como una
caja negra, donde la información entra por un lado, se procesa de alguna manera y genera
un resultado, pero donde lo que ocurre en su interior no deja de ser un misterio para
nosotros? Esto es cierto en parte. Es decir, no hay nada en esta tecnología que no te
permita observar su interior y comprobar cuáles son los valores de los parámetros que se
está activando, como operaciones matemáticas actúan, cómo se procesa la información,
pero el problema es que no sabemos cómo darle sentido a todo esto. Al final lo que estamos
viendo es un conjunto de operaciones matemáticas actuando al mismo tiempo que hace que emerja
un comportamiento que nosotros asociamos como inteligente. Pero, ¿y si te dijera que esto
no tiene que ser así? ¿Y si te dijera que las mismas operaciones matemáticas que hacen
funcionar a una red neuronal se pueden convertir en nuestras aliadas para poder entender qué
está ocurriendo dentro? ¿Y si te dijera que dentro de una neurona podemos encontrar
patrones tan interesantes como estos de aquí? Toma bien nota porque te voy a explicar los
fundamentos matemáticos tras una técnica que te va a permitir no solo generar estas
imágenes que son impresionantes, sino que también te va a dar un mejor entendimiento
del funcionamiento de la naturaleza de las redes neuronales. ¿Estás listo? Sí? Pues
le damos caña. Comenzamos.
En concreto hoy vamos a estar trabajando con redes neuronales convolucionales, que como
ya sabéis son este tipo de red neuronal que se utiliza comúnmente para hacer análisis
de imágenes. Y esto lo hacemos como continuación de la trilogía sobre redes neuronales convolucionales
que ya comenzamos con este vídeo de aquí, donde ya os expliqué pues cuál era la base
de funcionamiento de este tipo de redes. Si aún no ha visto este vídeo, pues a lo mejor
es una buena idea que le eches un vistazo. El motivo de por qué vamos a trabajar con
redes neuronales convolucionales es que al final, como se tratan de redes que tienen
que analizar grandes conjuntos de imágenes tan diferentes como sería un limón, un destornillador
o un pangolin, pues en este caso se tratará de un tipo de red que internamente habrá
aprendido un gran conjunto de patrones que también podremos visualizar como imágenes.
Así que nos vamos a centrar en este tipo de redes. Vale, sí, perfecto, genial. Pues
empecemos por el principio, pero el principio de este canal.
Febrero de 2018. ¿Recordáis este vídeo sobre el descenso del gradiente? Si recuerdas,
en aquel vídeo hablamos de una de las herramientas matemáticas más importantes del campo de
la inteligencia artificial, un algoritmo que ni más ni menos es el responsable del proceso
de entrenamiento o aprendizaje, optimización, llámalo como quieras, que suceden dentro
de estas redes neuronales. Mirad, internamente una red neuronal se compone de distintas unidades
de procesamiento que denominamos neuronas y donde se realiza una serie de operaciones
matemáticas que en realidad no son para nada complejas, sumas, multiplicaciones y transformaciones
no lineales. Y para cada neurona estas operaciones las podemos controlar para que su comportamiento
pues sea uno u otro y para que así la información que entra como input se vea modificada a otra
cosa que será el output. Esto lo hacemos a través de los parámetros y en realidad
el correcto funcionamiento de toda la red neuronal dependerá de que todos los parámetros
de cada neurona estén perfectamente ajustados para que todas las operaciones internas acaben
procesando nuestro input en el output que estamos buscando. Por ejemplo, convertir una
imagen de un gatete en un vector que nos indique que efectivamente en dicha imagen hay un gatete.
Y como te podrás imaginar encontrar esta combinación idónea de parámetros es una
tarea que no es fácil y que es imposible de realizar manualmente. Ya resulta imposible
para modelos de tamaño moderado que cuentan con miles de parámetros y menos aún para
modelos como los que estamos viendo hoy en día que tienen miles de millones de parámetros.
Es una locura. Y aquí dentro de esta locura es donde aparece el algoritmo del descenso
del gradiente a resolver la tarea. Este algoritmo trabaja sobre la siguiente idea y es, mira,
si en nuestra red solo tuviéramos un único parámetro que ir ajustando para ir cambiando
su comportamiento, podríamos ir graficando cuál sería el error de la red para distintos
valores de este parámetro. En una gráfica veríamos lo siguiente, para este valor de
aquí tendríamos este error, para este valor de aquí tendríamos este error y así sucesivamente.
Si visualizáramos toda la función veríamos cuál sería el resultado del error de nuestra
red para cada posible valor de este parámetro. Idealmente nosotros diríamos que este valor
de aquí sería el óptimo ya que es el que minimiza el error de la red. Pero esto no
es tan fácil, ya que en realidad por las limitaciones computacionales, esta búsqueda
del punto mínimo se realiza a ciegas. Es decir, en realidad no podemos estar evaluando
cuál es el error de la red para cada valor del parámetro. Esto es computacionalmente
imposible. Así que en realidad vamos a ciegas sin más información que el resultado de
dicha función en el punto que nosotros hayamos seleccionado aleatoriamente.
Y aquí es donde el descenso del gradiente nos propone lo siguiente. Oye, si parece ser
que lo que quieres hacer es ir descendiendo esta función, es decir, poco a poco ir minimizando
el error de la red, podrías calcular la derivada en el punto en el que te encuentras que al
final te va a indicar la pendiente en dicho punto y moverte un poquito hacia la dirección
en la que la pendiente descienda. Esto repetida unas cuantas veces te debería ir llevando
hacia algún punto mínimo de esta función de error e irías comprobando que poco a poco
la red va reduciendo su error en la tarea que le has propuesto. La red estaría aprendiendo
a través del método del descenso del gradiente. Y así funciona a grandes racos el entrenamiento
de una red neuronal. Pero repito, no sólo aplicado a un único parámetro, sino a una
gran cantidad de ellos, a miles y millones de parámetros que van siendo ajustados conjuntamente.
Y esto es potentísimo porque de repente contamos con una herramienta matemática que nos permite
aprovecharnos de la información que nos aportan las derivadas para poder ir moviéndonos con
cierta confianza a zonas mínimas de una función que nosotros estemos planteando, en este caso
la función de error. Este ejercicio de poder encontrar puntos mínimos o puntos máximos
de una función dada es un caso más dentro de una rama interesantísima de las matemáticas
denominada optimización. Así que ya lo sabes, cuando entrenamos una red neuronal, lo que
estamos haciendo es optimizar su función de error a partir de ajustar sus parámetros
para encontrar algún punto mínimo que nos satisfaga. Al final aquí gracias a la información
que nos aporta la derivada que podemos responder una pregunta tan interesante como, hey, si
yo realizo un pequeño cambio en el valor de este parámetro de aquí, ¿cómo afectará
eso a este otro valor de aquí, al error? Esa es la información que nos da la derivada,
la pendiente en ese punto. Y lo interesante y lo que quiero que entiendas hoy es que esta
herramienta de utilizar la derivada para poder optimizar cosas dentro de nuestra red no sólo
se puede aplicar a su entrenamiento, sino que va mucho más allá. Volvamos a las redes
convolucionales. Imaginad que contamos ya con una red neuronal
que está entrenada. Sí, ya hemos hecho todo el proceso de optimización para que la red
aprenda a clasificar imágenes. Y no, no para clasificar cinco o diez categorías diferentes
de objetos, sino cientos y cientos. De hecho, mil en total. Estamos hablando de una red
ya preentrenada sobre el complejo Dataset ImageNet, un dataset que cuenta con tal diversidad
de imágenes con apariencia tan distinta que si contamos con una red convolucional que
haya aprendido a clasificarlas correctamente con una tasa de acierto alta, pues podemos
tener la certeza de que internamente esta red habrá aprendido un montón de patrones
interesantes. ¿Quieres verlos? Mira, recordarás que dentro de una red neuronal convolucional
contamos con capas convolucionales, su nombre lo indica, donde una serie de filtros irán
escaneando nuestra imagen a la búsqueda de diferentes patrones que la red haya ido aprendiendo
a reconocer. Cada filtro convolucional en cada capa de la red generará un mapa de características
donde cada píxel que se active nos indicará que el patrón de ese filtro se ha encontrado
en esa región de la imagen. ¿Te acuerdas? Si por ejemplo yo tengo un filtro que ha aprendido
a detectar texturas rugosas y amarillas, cuando le muestro una imagen de un limón a la red,
este mapa de características se activará mucho, pues se está encontrando muchas regiones
dicho patrón. Si pongo un destornillador, pues no. Oye, ¿y cómo podrías saber qué
aprende cada filtro? Es decir, yo te estoy hablando de que este filtro ha aprendido a
detectar texturas rugosas y amarillas, pero ¿cómo podríamos saberlo? Es decir, la realidad
es que si tú te vas a visualizar este filtro de aquí, lo único que vas a ver sería el
patrón de detección que se realiza sobre la capa anterior, y no la perfecta rugosidad
amarilla de un rico limón. Entonces, ¿cómo podríamos interpretar lo que aprende cada
filtro? Pues fíjate bien porque se viene el jugo de limón de este vídeo, ¿vale? Atento
a cómo vamos a plantear este problema. Si para una capa determinada, para un filtro
de esa capa, quisiera saber qué es lo que hace que se active más dicho filtro, quizás
la pregunta que me estoy haciendo es, oye, ¿cuál sería la imagen que dada como input
a la red neuronal, maximizaría la activación del mapa de características generado por
este filtro de aquí? Uuuh, maximizarla. Esto empieza a sonar de nuevo a un problema de
optimización. Y de hecho, lo es. Si lo pensamos en clave de cómo hemos optimizado antes la
función de error, donde nos preguntábamos, oye, ¿cómo tengo que modificar los parámetros
de la red para ir minimizando el error? Aquí lo que nos estamos preguntando ahora es, oye,
si yo inicialmente a mi red le doy como input una imagen con píxeles inicializados aleatoriamente,
una imagen como esta, ¿cómo afectará la modificación del valor de cada uno de estos
píxeles a la señal de activación de este punto de la red? ¿Cómo varía la activación
de este mapa de características respecto a la variación de los píxeles de la imagen
dada como input? Una pregunta que de nuevo se puede responder a través de esta derivada.
Y si lo piensas, es con esta derivada con la que contaremos con la información necesaria
para saber cómo tenemos que ir modificando los píxeles de la imagen de entrada para
que poco a poco podamos ir maximizando la activación del filtro que nosotros queramos.
Si esto lo realizamos de manera iterativa, veremos que poco a poco los píxeles de nuestra
imagen se irán modificando para ir conformando una imagen reconocible. ¿Qué es esto? Pues
esta es la imagen que nos habrá generado la red neuronal a la hora de pedirle que nos
sintetice algo que excite al máximo el filtro que estamos investigando. Esto es equivalente
a que yo te pidiera a ti que dibujaras en una imagen pues aquello que más te boque
a una sandía. Seguramente dibujarías algo como esto, ya que esto contiene los patrones
que a ti hacen que se te disparen la señal de sandía. No sé por qué estoy hablando
tanto de fruta en el vídeo de hoy. Al final estamos accediendo a ver información del
aprendizaje que está autocontenido dentro de la red neuronal. Por ejemplo, esta imagen
de aquí se genera para excitar mucho a este filtro de aquí y de ahí concluimos que este
filtro se encargará de detectar patrones de líneas contrastadas con esta orientación
oblicua. Si por ejemplo ahora pasamos imágenes reales por la red y cogieramos aquellas que
generen una alta activación en este filtro, veríamos que la gran mayoría de imágenes
serían parecidas a esta. ¿Lo ves? O por ejemplo, un filtro que ha generado una imagen
como esta, pues podríamos pensar que es un filtro que tiene cierta obsesión en detectar
agujeros. Y si lo comprobamos de nuevo, pues efectivamente vemos que es así. Y así podemos
seguir explorando las entrañas de nuestra red neuronal. Por ejemplo, recordáis que
os dije que una red convolucional en sus capas mapajas aprende patrones muy genéricos como
bordes, esquinas y texturas, y en sus capas superiores patrones mucho más complejos y
avanzados. Vamos a verlo. Si avanzamos algunas capas hacia adelante y aplicamos la misma
técnica de visualización, nos encontramos con que por ejemplo un filtro de aquí genera
una imagen como esta, donde sin reconocer ningún objeto en concreto parece que estamos
observando algún tipo de dispositivo tecnológico. Efectivamente, esta neurona parece que se
encarga de observar partes de gadgets. Y este de aquí, venga, ¿podrías adivinarlo?
Parece que hay pelo, formas puntiagudas y ojos. ¿Podrían ser cabezas de algún tipo
de animal? Pues sí, efectivamente. Y si seguimos así, podemos ver que en las últimas capas
los filtros ya muestran trozos de objetos que son perfectamente reconocibles. A que
ya no parece tan oscura la caja negra. Esto que estamos haciendo es una técnica de interpretabilidad.
Estamos interpretando el conocimiento aprendido por nuestra red neuronal, intentando dar un
poco más de sentido a todo lo que ocurre dentro de la red. En concreto, a esta técnica se
le conoce como visualización de características, o en inglés, filter visualization, y es una
forma de decir, oye, vamos a examinar qué es lo que activa tanto a este mapa de característica
concreto dentro de mi red. Pero bueno, luego puedes experimentar con muchas cosas diferentes.
Por ejemplo, si en vez de intentar excitar solamente un mapa de características, cogiéramos
todos los mapas de características que encontramos en una única capa, podríamos realizar el
mismo proceso de optimización para hacer que emerjan todos los patrones al mismo tiempo,
dando un efecto conocido como Deep Dream. Espero que todo esto que te he contado en este
vídeo te sirva no solo para tener una nueva técnica en tu caja de herramientas, sino
para entender también más la naturaleza diferenciable de las redes neuronales. Una forma de experimentar
utilizando las derivadas y la optimización, pero en este caso no para entrenar a la red,
sino para intentar descifrar cuál es el aprendizaje que ha hecho la red previamente. Ya te digo,
entender esto es importante para dos cosas. Primero, porque se viene un tutorial donde
vamos a hacer en código exactamente esto. Te voy a enseñar cómo podemos generar nosotros
mismos, nosotros mismos, este tipo de imágenes e implementar este tipo de técnicas en vuestras
redes neuronales. Así que próximamente muy poquitos días tendréis este vídeo en el
canal. Y lo segundo, que ya estáis listos para la siguiente parte de esta trilogía
sobre redes neuronales convolucionales, donde seguiremos profundizando en el entendimiento
de esta tecnología aplicado a una de las técnicas favoritas mías dentro del campo
de Machine Learning, la transferencia de estilo y también contará con su tutorial. Así
que es un buen momento para recordar que si no queréis perderos nada de este contenido,
tenéis que estar suscritos al canal, activar la campanita y también activar las notificaciones
dentro de vuestra aplicación de YouTube. Porque si no, esta estadística de aquí,
que creo que nunca había enseñado, pero que es bastante fuerte, puede mostrar una diferencia
entre la gente que ha activado la campanita, pero no recibe notificaciones, y la gente
que ha activado la campanita y si las está recibiendo. Gente frustrada que se pierde
por el camino. Bueno, igualmente, y si queréis seguir profundizando en este tema de la visualización
de características, os voy a dejar aquí abajo en la caja de descripción un recurso
muy interesante de la gente de OpenAI que han creado lo que ellos llaman un microscopio
para poder observar estos filtros, estas visualizaciones que hemos ido viendo en este vídeo de diferentes
redes neuronales. Una aplicación súper fácil de utilizar y que yo creo que muchos de vosotros
encontraréis interesante. Por mi parte, nada más, siempre un placer traeros todo este
conocimiento y todos estos recursos a YouTube de manera gratuita para vosotros. Y ya sabéis
que si lo queréis apoyar, pues con una simple donación mensual a través de Patreon, que
también tenéis el enlace abajo en la caja de descripción, con una aportación mensual
de cinco euros, diez euros, cincuenta mil euros, lo que queráis, pues podéis apoyar
que este canal siga en funcionamiento. Sea como sea, más inteligencia artificial la
próxima semana. Pera y manzana y uvas. Quiero fruta, voy a por fruta.