#12 Aprendizaje profundo: desmontando las redes neuronales.

  • Autor de la entrada:
En este momento estás viendo #12 Aprendizaje profundo: desmontando las redes neuronales.
Imagen de Artystarty de Getty Images en Canva

¡Buenos días y buenos datos!

Hoy toca hablar de un tema que está de rabiosa actualidad, aunque pensándolo bien, lo lleva estando desde hace más de dos tercios de siglo: el aprendizaje profundo o deep learning.

Santiago Ramón y Cajal lo sintetizaba muy bien en esta cita:

El hombre, si se lo propone, puede llegar a ser escultor de su propio cerebro.

Santiago Ramón y Cajal

En 1943, los neurocientíficos Mc Culloch y Pitt le tomaron la palabra y formularon el modelo lógico de una neurona en un intento de replicar como funciona nuestro cerebro abriendo así el camino a una realidad aumentada que nos hace más capaces, más fuertes, más rápidos, en resumen, mejores.

Dicho así, suena un reto ambicioso, y es que lo es. Por ello se ha convertido en el campo de batalla de la guerra fría de nuestro tiempo entre China y EEUU por conseguir los modelos analítico que sean capaces de procesar mayores volúmenes de datos.

Banderas_china_americana

Si quieres saber más, sigue conmigo en este viaje a través de la historia del aprendizaje profundo y las redes neuronales.

Empecemos por el qué

¿Qué es el aprendizaje profundo?

Se llama aprendizaje profundo (Deep Learning en inglés) a un subconjunto del aprendizaje automático donde los algoritmos y técnicas utilizadas son redes neuronales multicapa que facilitan el descubrimiento automático de abstracciones o características en los datos necesarias para la resolución de problemas complejos.

En general, el uso de redes neuronales facilita el autoaprendizaje a partir de los datos, el procesamiento de volúmenes muy grandes de datos para realizar tareas relacionadas con procesamiento lenguaje natural (voz, texto) y el reconocimiento de imágenes.

Historia del aprendizaje profundo
Historia simplificada de los principales hitos del Aprendizaje Profundo

Los pioneros

Todo comenzó con la formulación matemática de un modelo inspirado en el funcionamiento de una neurona biológica en 1943 por parte de los neurocientíficos Mc Culloch y Pitt . Consistía en un modelo con varias entradas, una salida y una función que las relaciona para resolver problemas lógicos sencillos (tipo «AND/Y» – conjunción, «OR/O»-disyunción y «NOT/NO»-negación).

El cómputo era limitado ya que los parámetros para combinar las entradas y la lógica para calcular la salida se establecía de forma manual.

El perceptrón

Tuvimos que esperar hasta 1957 cuando Frank Rosenblatt desarrolló un algoritmo de aprendizaje basado en la neurona que podía calcular de manera automática parámetros y funciones lógicas y aunque hubo múltiples algoritmos, el más popular es el perceptrón.

Perceptrones

Un perceptrón en los 50’s consistía en:

– Varias entradas.

– Una salida.

Conexiones con pesos y sesgos que ponderan las entradas y se recalculan en base a los errores en la salida.

Los pesos multiplican y los sesgos suman.

Haciendo una equivalencia con una regresión lineal, el peso (w) es la pendiente de la línea y el sesgo (b) es el punto donde la línea se cruza con el eje vertical.

La fórmula matemática sería algo así: Entradanodo = w*Entrada + b

Una capa simple con un nodo que contiene una función de activación para producir una salida.

En una analogía con el mundo biológico encontramos inspiración en las sinapsis donde los nodos y funciones de activación serían equivalentes a las neuronas y las conexiones.

Aunque hasta aquí llega el parecido con una neurona ya que ante el desconocimiento sobre cómo funciona el cerebro, no ha sido posible formular su comportamiento de manera exacta.

Función lineal vs función no lineal

Los perceptrones simples tenían una pega. Sólo podían resolver problemas de clasificación binaria lineales.

Es decir, pueden dividir los datos en dos grupos mediante una línea, pero no son capaces de resolver casos donde se necesiten un mayor número de divisiones y por tanto no sean lineales (imagen de la derecha).

Esta limitación hizo que se perdiera el interés en este enfoque y empezó lo que se llamó un invierno en la Inteligencia Artificial que duró hasta los años 80 del siglo pasado.

Nubes nevando

A pesar del parón global, algunos grupos de científicos siguieron trabajando y dieron forma a las redes neuronales multicapa como la solución a los inconvenientes del perceptrón sencillo. Si seguimos con la equivalencia biológica, las neuronas no están solas sino que se conectan con otras neuronas formando redes de varias capas. Asimismo, igual que hay diferentes tipos de neuronas, puede haber diferentes tipos de funciones de activación.

De esta forma se introduce el concepto de las capas intermedias u ocultas que permiten acometer problemas más complejos que los binarios con la ayuda de las funciones de activación no lineales.

Mujer con cartel

A las redes neuronales multicapa también te las puedes encontrar con el nombre de: perceptrón multicapa, redes neuronales de avance hacia delante (feedforward neural network), redes neuronales completamente conectadas (fully connected neural networks) o por sus siglas en inglés MLP (MultiLayer Perceptron).

¡Bien! Parecía que ya podíamos presentar retos de aprendizaje importantes a las máquinas….sin embargo, la complejidad del entrenamiento de estos modelos, crecía de forma directamente proporcional al problema, lo que hacía que fueran muy difíciles de implementar.

Blackpropagation

Hasta 1986 no se vio la luz. Este año, Rumelhart y Hilton presentaron una publicación donde formulaban el algoritmo de la propagación inversa, retro-propagación (backpropagation en inglés).

La retro-propagación no era un concepto nuevo. La novedad fue que demostraron su funcionalidad de forma práctica y su planteamiento alcanzó mucha popularidad.

¿En qué consiste la backpropagation?

Básicamente es una manera de optimizar los parámetros de una red neuronal mediante una técnica de descenso por gradiente minimizando el error en cada capa (si no te acuerdas en qué consiste la optimización, lo puedes consultar aquí).

El nombre de propagación inversa proviene de que el cálculo comienza optimizando los parámetros desde el final o salida de la red neuronal hacia el principio o entrada de la red.

Las neuronas de la capa oculta solo reciben una fracción de la señal total del error, basándose aproximadamente en la contribución relativa que haya aportado cada neurona a la salida original. Este proceso se repite, capa por capa, hasta que todas las neuronas de la red hayan recibido una señal de error que describa su contribución relativa al error total.

Wikipedia

Esta aproximación hace que por un lado, el positivo, el algoritmo de retro-propagación sea muy efectivo y todavía sea uno de los más utilizados en el entrenamiento de las redes neuronales.

Por otro lado, el negativo, es altamente dependiente de la inicialización de la red, es decir, de los valores iniciales que demos a los parámetros en la red. No obtenemos los mismos resultados para diferentes valores iniciales con lo que habrá que probar escenarios distintos para conseguir las mejores métricas.

Además, en redes con muchas capas hay un riesgo de «desvanecimiento de gradiente» (vanishing gradient en inglés). Cuanta más profundidad haya, más posibilidad hay de que la señal del error con respecto al peso en el paso sea muy pequeña impidiendo que actualice el valor del peso para esa capa, parando el entrenamiento.

Redes neuronales convolucionales (CNN)

Red neuronal convolucional

Seguimos avanzando.

En 1989 se consiguieron avances importantes en el reconocimiento de imágenes a través de un nuevo modelo llamado red neuronal convolucional (CNN en sus siglas en inglés).

Imagina una imagen de 6 x 6 pixeles. Al codificar cada pixel como un dato, esta foto tiene 36 datos de entrada.

Si nos vamos a fotos de tamaño normal (10×15 cm) estaríamos hablando aproximadamente de unos 1200×1800 pixels, es decir, ¡más de 2 millones de datos de entrada y conexiones con la red neuronal!

Pensad en lo que costaría en términos de procesamiento y tiempo entrenar esta red…

Las CNN surgieron para resolver este problema. Permiten clasificar de forma óptima conjuntos de datos grandes y con formato matricial como son las imágenes.

Una red neuronal convolucional tiene dos partes diferenciadas:

  • Empezamos con una primera fase de convolución que realiza las tareas de aprendizaje y selección de características de la imagen, simplificando las entradas.
Fase de convolución
Ejemplo sencillo de fase de convolución basado en vídeo Neural Networks Part 8 de Statquest

La imagen ilustra una convolución que reduce el número de entradas de 81 a 4.

Veámoslo en más detalle:

  1. Primero se aplica un filtro de menor tamaño sobre la imagen cuyos parámetros se calculan con backpropagation.

2. El filtro se superpone sobre la imagen y se hace una multiplicación escalar de las matrices solapadas. Así se consigue un valor numérico que represente las características de esta parte de la imagen cubierta por el filtro.

Esta combinación es lo que da el nombre de convolución a este modelo.

3. El valor resultante de la multiplicación escalar se incluye en una matriz de características (Feature Map) tras un ajuste paramétrico que no cambia la información pero que ayuda a mejorar el funcionamiento del algoritmo.

Hasta aquí hemos conseguido una nueva matriz donde cada valor contiene la información de un pixel y de sus vecinos.

Y con ello, conseguimos mantener la información de localidad de los pixeles, tan importante en las imágenes.

4. Repetimos y repetimos moviendo el filtro sobre la imagen hasta barrerla por completo y completar la matriz de características.

5. Finalmente aplicamos una función de activación para añadir una mayor no linealidad y agrupamos por zonas (pooling).

¡Voila! Hemos conseguido reducir significativamente la matriz de características y hemos mantenido la información de la imagen y su localidad.

Y esto tan sencillo…, es la convolución.

  • Tras la fase de convolución, pasaríamos a una red neuronal común. Conectamos todas las características que han quedado con todas (ya mucho más manejables) a través de un perceptrón multicapa para realizar la función de clasificación y finalizar el entrenamiento de la red.
Salida red convolucional

En resumen, lo que hace óptimas a la redes neuronales convolucionales es:

– Por un lado hacen el entrenamiento más eficiente reduciendo el número de nodos de entrada.

– Por otro lado, aprovecha correlaciones y datos entre «vecinos» y extrae características locales que capturan mejor las dependencias entre datos.

Conseguimos redes más robustas que siguen clasificando bien ante pequeños desplazamientos sobre la imagen.

Redes neuronales recurrentes (RNN)

Red neuronal recurrente

Según surgían los casos de uso, aparecían nuevos modelos.

Ahora nos vamos a buscar soluciones para interpretar el lenguaje natural, texto y voz.

Las redes neuronales multicapa y las convolucionales sólo se mueven en una dirección, hacia delante. Por un lado son buenas para reconocer patrones pero por otros, están limitadas a la hora de procesar datos que siguen una secuencia como es el lenguaje.

Realmente se podría ver una red recurrente como una red neuronal «hacia delante» múltiple que tiene una pequeña memoria para guardar y poder pasar información del estado de la red. A estos estados se les llama estados ocultos (hidden states en inglés) y normalmente los verás representados como h0, h1, h2,…, ht donde cada elemento mantiene las información del dato anterior en la secuencia.

Desafortunadamente, la redes con muchos elementos en la secuencia no funcionan bien, tienen un problema de desvanecimiento de gradiente. Realmente no es tan raro que pase esto con el lenguaje. Para saber qué palabra viene a continuación en un texto, muchas veces necesitamos conocer muchas de las palabras anteriores. Es decir, dependemos de un contexto grande.

Debido a esto, aunque la redes neuronales recurrentes estuvieron disponibles desde los 80’s, no se hicieron populares hasta los 90’s con las redes neuronales de memoria a corto o largo plazo (LSTM) que son capaces de aprender contextos mayores.

Los modelos LSTM incluyen unas celdas o nodos de memoria que «recuerdan» los datos por largos periodos porque priorizan la información que «les interesa», gestionando las entradas y salidas de los nodos de la red según dicha memoria.

Funcionan muy bien para una gran variedad de problemas como traducción automática, anotación de imágenes o reconocimiento del voz por lo que se siguen utilizando en muchos escenarios.

A finales de los 90’s y hasta mitad de los 2000’s, empezó otro invierno en el aprendizaje profundo.

Las redes neuronales perdieron su interés en parte por la popularidad de otros tipos de algoritmos de aprendizaje automático y porque eran muy costosas de entrenar con los medios del momento.

Volvieron a resurgir a partir del concurso ImageNet de 2012 cuando Hinton y su equipo demostraron que una red neuronal convolucional se acercaba sustancialmente a la capacidad del ojo humano en reconocimiento de imágenes.

Empezó la explosión de la inteligencia artificial tal y como la conocemos ahora.

En el estudio se utilizaron GPUs (Graphical Process Units) como unidad de procesamiento y este acabó siendo el espaldarazo definitivo para la disciplina.

Las GPUs ya usaban para el tratamiento de imágenes porque eran mucho más eficientes para trabajar con formatos vectoriales y matrices que las CPUs.

Aunque había un problema. No es un hardware especialmente económico. En realidad su popularidad llegó cuando empresas como Google o Amazon facilitaron su disponibilidad en la nube.

En cualquier caso, entrenar una red neuronal con cientos de capas, sigue siendo bastante costoso. Un verdadero reto para los investigadores avezados y los no tanto.

Hemos llegado a 2006 y con ello, a un nuevo hito: las DBM (Deep Belief Machines) con preasignación de pesos.

Utilizar pesos aleatorios al inicializar las redes es una mala idea: un ejemplo es que al utilizar Backpropagation con Descenso por gradiente muchas veces se caía en mínimos locales, sin lograr optimizar los pesos. Mejor será utilizar una asignación de pesos inteligente mediante un preentrenamiento de las capas de la red (pretrain en inglés)

Aprendemachinelearning.com

La selección de mejores valores de inicialización se realiza a través de un modelo no supervisado basado en Autoencoders o en una Máquina de Boltzman profunda restringida.

Las redes neuronales seguían avanzando sin pena ni gloria.

Su empuje definitivo fue a principios de los 2010’s cuando consiguieron batir a cualquier otro algoritmo de aprendizaje automático en problemas de clasificación de imágenes.

Redes neuronales generativas antagónicas (GAN)

Redes generativas antagonicas

La carrera se acelera y en 2014 comienza la era de las imágenes hiperrealistas generadas artificialmente con la publicación del estudio de Ian Goodfellow et al. sobre un nuevo tipo de redes neuronales que facilitan la creación de datos: la redes generativas antagónicas o GAN en sus siglas en inglés (Generative Adversarial Networks).

Las GAN son una clase de algoritmos de inteligencia artificial que se utilizan en el aprendizaje no supervisado, implementadas por un sistema de dos redes neuronales que compiten mutuamente en una especie de juego de suma cero.

Wikipedia

Goodfellow y sus colaboradores proponen una arquitectura basada en dos redes neuronales con objetivos contrapuestos:

  • El generador de datos que busca crear datos artificiales (falsos) tan buenos que engañen al discriminador para que los clasifique como reales.
  • Un discriminador que «juzga» si el dato que le llega es real o falso y persigue distinguir cada vez mejor los datos reales de los generados.

Pero, ¿por qué son necesarias dos redes? ¿No valdría con el generador?

En una GAN, el módulo discriminador dirige al generador para que sepa qué imagen crear, al tiempo que le proporciona pistas sobre las características de una imagen real. Sin esta orientación, la red generadora solo produciría ruido.

El proceso de entrenamiento es complejo, porque tenemos que conseguir que cada red (generador y discriminador), por separado y en conjunto, sea lo más óptima posible.

Para ello, como buscamos resolver un problema de optimización, el algoritmo utilizado en el aprendizaje de los parámetros vuelve a ser el archiconocido descenso por gradiente en un proceso iterativo (ilustrado en la primera figura de la página 4 de la publicación de Goodfellow):

– En un primer paso, se entrena al discriminador para que identifique correctamente las imágenes reales del conjunto de datos de entrenamiento, sin modificar la red neuronal generadora (inicializado previamente a partir de un ruido aleatorio).

– En el segundo paso, se entrena al discriminador para que identifique correctamente las imágenes generadas por el generador como “falsas”, sin seguir modificando el generador.

– En otro tercer paso, no se modifica el discriminador, y se entrena al generador con el objetivo de que equivoque al discriminador para que haga una clasificación errónea y clasifique las imágenes falsas que ha generado como «reales».

Repetimos hasta que el generador produzca imágenes realistas y el discriminador alcance convergencia en equilibrio de Nash, es decir, que estime que la Probabilidad «imagen real» = Probabilidad «imagen generada» = 50%.

Como comentaba antes, el entrenar a las dos redes en paralelo no es sencillo y tiene sus problemas:

  • Primero, que el discriminador se convierta en una red neuronal muy potente haciendo que el generador deje de aprender y no se finalice el proceso. Y, esto no es raro, porque el discriminador está resolviendo un problema de clasificación que siempre es más sencillos que los que generación de datos desde 0.
  • Segundo, cada modelo actualiza su función de pérdida de manera independiente, sin tener en cuenta a la otra parte, con lo que no se puede asegurar convergencia.
  • Tercero, los espacios de los imágenes «real» y «generada», se concentran en pocas dimensiones. Si las funciones son disjuntas, el discriminador siempre va a ser capaz de diferenciarlas provocando una red inestable.
  • Por último, es común que el generador colapse a un estado de baja diversidad (mode collapse en inglés) donde siempre produzca las misma salida porque no consigue aprender las distribuciones de datos del mundo real.

Por ello, hay que hacer un poco de «tuneo» y modificar las funciones de pérdida durante el proceso de entrenamiento para evitar o reducir al máximo los riesgos (más detalle aquí).

Finalmente, aunque las redes neuronales que componen la red generativa antagónica pueden ser de cualquier tipo (multicapa, convolucionales, recurrentes, etc.), las más extendidas, son las redes convolucionales, referencia para tratamiento de imágenes.

Imagen generada artificialmente
Esta persona no existe. Generada por una GAN (Dec 2019) en Thispersondoesn´t exist

Transformers

¿Te suenan los transformers? A mi personalmente me encanta el nombre porque a riesgo de parecer viejuna, me recuerdan a un capítulo de Los Caballeros del Zodiaco. En fin….

Los transformers son otra arquitectura basada en un mecanismo de auto-atención para procesamiento de lenguaje natural.

Son los últimos modelos relevantes que han surgido en aprendizaje profundo y desde 2018 hasta ahora, son los que acaparan las páginas de noticias en el ámbito de la inteligencia artificial. Es más, sus avances son los que están dando el espaldarazo a los sistemas de reconocimiento de texto y voz.

Sobre estos, la auto-atención y en general procesamiento de lenguaje natural hablaré en la siguiente publicación así que no me voy a extender más y sobre todo, no te la pierdas.

Aunque antes de irme comparto unas consideraciones a tener en cuenta cuando trabajamos con redes neuronales.

Las propiedades de nuestro problema determinan la arquitectura de la red

Una característica clave de la inteligencia humana es la capacidad de hacer un «uso infinito de medios finitos»

Humbolt (1836) y Chomsky (1965)

Humbolt y Chomsky quisieron sintetizar con esta cita las cualidades humanas que nos permiten generalizar sobre entidades conocidas para abstraer nuevas estructuras reconocibles. Un ejemplo es el empleo del lenguaje natural, donde con un número finito de palabras podemos componer nuevas oraciones ilimitadas.

Para asimilar este tipo de comportamientos en inteligencia artificial necesitamos ciertas estructuras de información y con ello definir arquitecturas de aprendizaje profundo según el caso que se busca resolver (es decir introduciendo sesgo inductivo relacional):

1) Para procesamiento de datos en forma tabla donde los parámetros mantienen independencia entre sí no hay restricciones en cuanto a como se relaciona la información. Podemos utilizar una arquitectura multicapa (MLP) que conecta todos los datos con todos.

Por ejemplo, cuando queremos clasificar tipos de gatos basándonos en una tabla con sus características, da igual el orden de los datos de entrada para realizar el entrenamiento. No es relevante que las características están ordenadas de una forma («pelo largo», «color negro», «ojos azules») que de otra («color negro», «ojos azules», «pelo largo»).

Aun así, recuerda que una vez inicializado el proceso, los parámetros de la red serán calculados para ese orden de características. Si se cambia, el resultado sería diferente y habría que volver a reentrenar.

2) Si queremos procesar datos que tienen que mantener la localidad o relación con sus vecinos, necesitamos esta característica que nos proporcionan las redes convolucionales.

El caso claro es el de las imágenes donde no se puede cambiar el orden de los pixels sin que se modifique la foto.

3) Para procesamiento de datos que necesitan secuencialidad como el lenguaje de texto o hablado necesitamos el orden y contexto que nos dan las redes recurrentes.

Aquí, las palabras significan una cosa u otra, o tienen sentido o no según el orden en el que se establezcan.

En general, las redes que funcionan con una estructura establecida, como son las redes convolucionales (localidad) o las recurrentes (secuencialidad), son más fáciles de entrenar que las que tienen mayor número de opciones como son la multicapa.

Hacer una inteligencia artificial que se comporte como un humano consiste en resolver varios problemas al mismo tiempo (General Artificial Intelligence), con múltiples arquitecturas simultaneas. Y esto no es sencillo.

Por ello, actualmente, lo que vemos mayoritariamente son inteligencias artificiales «estrechas» (Narrow Artificial Intelligence) buenas sólo para resolver un tipo de problemas.

Si te interesa profundizar más sobre sesgos inductivos, te recomiendo que leas la publicación Relational inductive biases, deep learning, and graph networks realizada por diferentes científicos de Deep Mind, Google Brain, MIT y la Universidad de Edimburgo.

Cuándo NO USAR los modelos de aprendizaje profundo

Las redes neuronales tienen ciertas especificidades que es importante tener en cuenta cuando te enfrentas con un problema en el mundo real:

  • Necesitan gran cantidad de datos para funcionar correctamente.

En general se utilizan para procesar recursos que tienen muchas características como son las imágenes o la voz.

Esto hace que el conjunto de registros o datos de entrada tenga que ser muy elevado para no generar sobreentrenamiento.

Si tienes pocos datos, una red neuronal no es tu solución. No mates moscas a cañonazos.

  • Alto coste de entrenamiento

Y cuando digo, coste, me refiero a dinero y a consumo de recursos y energía que a su vez repercuten en el medioambiente.

Hay modelos como los Tansformers, que sólo pueden ser entrenados en grandes empresas por la capacidad de cómputo que necesitan.

Ten esto en cuenta porque es posible que el coste del proyecto no compense los beneficios.

Una curiosidad, Google va a empezar a informar a sus cliente de la huella de carbono que generan con el uso de su plataforma de Cloud.

  • Las redes neuronales son cajas negras.

Son tan complejas que no sabemos exactamente como llegan a las soluciones que proponen.

Una red neuronal no es la mejor solución si necesitas que tu modelo sea altamente explicativo.

Por ejemplo, no serían la mejor solución en una evaluación de riesgo de impago donde te piden explicar porqué concedes un crédito o no.

Aunque ya existen algoritmos que ayudan a interpretar y explicar la predicciones, como en todo, lo mejor es aplicar la regla del menos es mas.

Si necesitas explicar los resultado obtenidos, mi recomendación es que no empieces con una red neuronal. Comienza con un modelo más sencillo porque puede que resuelva el problema sin tener que hacer desarrollos más complicados que luego haya que mantener.

Ahora sí que sí me voy, aunque con un sabor agridulce. No te lo creerás pero no he podido entrar en todo el detalle que me hubiera gustado por eso te he dejado tantas referencias.

En cualquier caso, espero que este repaso de los hitos más relevantes del aprendizaje profundo haya servido para poner algo de contexto a todo el bombardeo de noticias y publicaciones sobre el tema que vivimos actualmente.

Espero que hayas disfrutado y si te ha gustado, compártelo en redes y dímelo en comentarios.

Te espero en las siguientes entregas de «La época de la información» donde aprenderemos cómo enseñamos a las máquinas a comunicarse en nuestro lenguaje.

Bibliografía y referencias

Como siempre, te dejo mi selección particular de los artículos y vídeos sobre este tema:

Recuerda que si el vídeo está en inglés, Youtube facilita la traducción simultanea a otro idioma. Para activar la traducción simultanea al español, sigue estos pasos: ¿Cómo activar la traducción simultanea en Youtube?