Unidad 1: Fundamentos del Deep Learning
La idea de crear máquinas pensantes se remontan a la antigua Grecia, inspirados en figuras míticas como Pigmalión, Dédalo y Hefesto.
Sus respectivas creaciones: Galatea, Talos y Pandora, han sido considerados como las primeras formas de vida artificial.
La posibilidad de inteligencia en máquinas fue contemplada mucho antes de la existencia de las computadoras programables (Lovelace 2015).
La inteligencia artificial (IA) hoy es un campo con aplicaciones prácticas extensas y una muy prolífica agenda de investigación.
La IA moderna busca automatizar tareas rutinarias, interpretar el habla e imágenes, apoyar diagnósticos médicos y fomentar la investigación científica.
Los primeros avances en IA resolvieron problemas complejos para humanos pero simples para computadoras, definidos por reglas matemáticas formales.
El gran reto de la IA es resolver tareas intuitivas humanas, como el reconocimiento de voz o de rostros, que son difíciles de expresar con reglas formales.
Considerada la primera programadora de la historia por su trabajo en el algoritmo destinado a ser procesado por la máquina analítica de Charles Babbage. Lovelace anticipó la capacidad de las computadoras para ir más allá del simple cálculo numérico, sugiriendo que podrían crear arte y música si se les proporcionaban las instrucciones correctas.
Acá algunos artículos que pueden ser de interés para profundizar en el tema:
Matemático y lógico británico, es uno de los padres de la informática y pionero en la inteligencia artificial. Desarrolló el concepto de la “máquina de Turing”, un dispositivo teórico que puede simular cualquier algoritmo. También es conocido por el “Test de Turing”, un criterio para evaluar la inteligencia de una máquina según su capacidad para exhibir un comportamiento indistinguible del de un humano.
Algunos artículos de interés:
Psicólogo cognitivo y científico informático británico-canadiense, a menudo llamado “el padrino del deep learning”. Hinton ha sido una figura clave en el desarrollo de redes neuronales y algoritmos de aprendizaje profundo, contribuyendo al renacimiento del interés en la inteligencia artificial en el siglo XXI con sus avances en redes neuronales profundas.
Algunos artículos de interés:
Learning representations by back-propagating errors (Rumelhart, Hinton, y Williams 1986).
La extensa cantidad de artículos desarrollados por Hinton puede ser revisada en Google Scholar.
Los primeros éxitos de la IA ocurrieron en entornos formales y simples, como el ajedrez; por ejemplo, Deep Blue de IBM venció a Garry Kasparov en 1997.
El ajedrez, aunque estratégicamente complejo para los humanos, es simple para las computadoras debido a sus reglas formales y bien definidas.
Las tareas abstractas y formales, difíciles para los humanos, suelen ser fáciles para las computadoras, como jugar al ajedrez a nivel de campeonato.
Garry Kasparov vs Deep Blue
Las habilidades humanas promedio para reconocer objetos o el habla han sido un desafío más significativo para la IA.
La vida cotidiana de una persona involucra conocimiento subjetivo e intuitivo sobre el mundo, difícil de codificar en reglas formales para las computadoras. Una gran dificultad en IA es la incorporación de este conocimiento informal en las computadoras.
Algunos proyectos de IA han intentado codificar conocimiento del mundo en lenguajes formales. Un computador puede ser entrenado para reaccionar automáticamente a sentencias establecidas en este lenguaje formal, conocido como línea base de conocimientos (knowledge base, en inglés), pero han tenido un éxito limitado.
Ejemplo: Cyc, uno de los proyectos más conocidos (Lenat y Guha 1990), utiliza un motor de inferencia y una base de datos de afirmaciones en un lenguaje llamado CycL, pero ha enfrentado desafíos, como comprender historias simples del mundo real.
Los sistemas de IA necesitan poder adquirir su propio conocimiento extrayendo patrones de datos sin procesar. Esta habilidad se denomina aprendizaje automático (machine learning), que ha permitido a las computadoras manejar problemas complejos y tomar decisiones subjetivas.
Algunos ejemplos:
La regresión logística es un algoritmo de aprendizaje automático que puede recomendar partos por cesárea.
El algoritmo de clasificación de naive Bayes es capaz de distinguir entre correos electrónicos legítimos y spam.
Las Máquinas de Soporte Vectorial (SVM, del inglés Support Vector Machines), pueden ser útiles para la clasificación y regresión en datos de alta dimensión. Un ejemplo de aplicación es la clasificación de géneros de música o películas basada en las características del contenido como frecuencias de sonido, tipos de instrumentos, o palabras clave en las reseñas.
El rendimiento de los algoritmos de aprendizaje automático depende de la representación de los datos que se les proporciona
En el caso de la regresión logística aplicada a decisiones médicas, se confía en la información relevante proporcionada por el médico, no en un examen directo del paciente.
Cada pieza de información utilizada en la regresión logística se llama característica (o en inglés feature) y el algoritmo aprende la correlación de estas con los resultados.
La regresión logística no puede definir ni influir en cómo se definen las características y no es efectiva con datos no estructurados como los píxeles de una resonancia magnética.
Esta dependencia de las representaciones es un fenómeno general que es muy ocurrente dentro de la ciencia de computación, incluso en la vida diaria.
La elección de la representación de los datos tiene un efecto significativo en el desempeño de los algoritmos de machine learning.
Ejemplo
Muchas tareas relacionadas con inteligencia artificial pueden ser resueltas al diseñar el conjunto correcto de características (features) que deben ser extraídas para dicha tarea, y luego poder entregar estas características a algún algoritmo de machine learning.
Para muchas tareas, se hace difícil el saber qué características deben ser extraídas.
Una solución para este problema es usar machine learning para descubrir no solo el mapeo de la representación a la salida (output), sino también la representación misma.
Este enfoque se conoce como aprendizaje de representación (representation learning).
Las representaciones aprendidas a menudo resultan en un rendimiento mucho mejor que el que se puede obtener con representaciones diseñadas manualmente.
Permiten a los sistemas de IA adaptarse rápidamente a nuevas tareas, con una mínima intervención humana.
Un algoritmo de aprendizaje de representación puede descubrir un buen conjunto de características para una tarea simple en minutos o para una tarea compleja en horas o meses.
Diseñar manualmente características para una tarea compleja requiere una gran cantidad de tiempo y esfuerzo humano; puede llevar décadas para toda una comunidad de investigadores.
Ejemplo:
Un ejemplo por excelencia de un algoritmo de aprendizaje de representación es el autoencoder. Un autoencoder es la combinación de:
una función de codificador, que convierte los datos de entrada en una representación diferente, y
una función de decodificador, que convierte la nueva representación de nuevo al formato original.
Los autoencoders están entrenados para preservar tanta información como sea posible cuando una entrada se ejecuta a través del codificador y luego del decodificador, pero también están entrenados para hacer que la nueva representación tenga varias propiedades deseables.
Diferentes tipos de autoencoders buscan lograr diferentes tipos de propiedades.
Al diseñar características o algoritmos para aprender características (feature engineering), nuestro objetivo generalmente es separar los factores de variación que explican los datos observados.
En este contexto, usamos la palabra factores
simplemente para referirnos a fuentes separadas de influencia; los factores generalmente no se combinan por multiplicación.
Los factores a menudo no son cantidades que se observan directamente, pueden existir como objetos no observados o fuerzas no observadas en el mundo físico que afectan cantidades observables.
Pueden existir como construcciones en la mente humana que proporcionan explicaciones simplificadoras útiles o causas inferidas de los datos observados.
Pueden considerarse como conceptos o abstracciones que nos ayudan a dar sentido a la rica variabilidad en los datos.
Ejemplo:
Al analizar una grabación de voz, los factores de variación incluyen la edad del hablante, su sexo, su acento y las palabras que está diciendo.
Ejemplo:
Al analizar una imagen de un automóvil, los factores de variación podrían incluir la posición del automóvil, su color y el ángulo y brillo del sol.
Una fuente importante de dificultad en muchas aplicaciones de inteligencia artificial del mundo real es que muchos de los factores de variación influyen en cada pieza de datos que podemos observar.
Los píxeles individuales en una imagen de un automóvil rojo podrían estar muy cerca del negro por la noche.
La forma de la silueta del automóvil depende del ángulo de visión.
La mayoría de las aplicaciones requieren que se analizen en profundidad (y desenredemos) los factores de variación y descartemos aquellos que no nos importan.
Puede ser muy difícil extraer tales características abstractas y de alto nivel de datos sin procesar.
Muchos de estos factores de variación, como el acento de un hablante, solo se pueden identificar utilizando una comprensión de los datos sofisticada y casi al nivel humano.
Cuando es casi tan difícil obtener una representación como resolver el problema original, el aprendizaje de representación no parece, a primera vista, ser de mucha ayuda.
Definiciones
Rama del campo de la inteligencia artificial que se enfoca en el desarrollo y entrenamiento de modelos de redes neuronales artificiales de múltiples capas. Estos modelos tienen la capacidad de aprender y extraer representaciones de alto nivel a partir de datos brutos, lo que les permite abordar tareas complejas como el reconocimiento de imágenes, el procesamiento del lenguaje natural y la toma de decisiones
El Aprendizaje Profundo (Deep Learning) resuelve el problema central en el aprendizaje de representaciones introduciendo representaciones que se expresan en términos de otras representaciones más simples.
El aprendizaje profundo permite que el modelo construya conceptos complejos a partir de conceptos más simples.
Esquema de como un sistema de aprendizaje profundo puede representar el concepto de una imagen de una persona combinando conceptos más simples, como esquinas y contornos, que a su vez se definen en términos de bordes.
Ejemplo:
Uno de los modelos más utilizados en deep learning es la red profunda hacia adelante (deep feed forward network)o perceptrón multicapa (multilayer perceptron, MLP).
Un MLP puede ser visto como una función matemática que mapea un conjunto de valores de entrada a valores de salida.
La función se forma componiendo muchas funciones más simples. Podemos pensar en cada aplicación de una función matemática diferente como proporcionando una nueva representación de la entrada.
Las redes más profundas pueden ejecutar más instrucciones en secuencia, permitiendo referencias a resultados de cálculos previos.
No toda la información en las activaciones de una capa representa factores de variación; también almacena información de estado para ejecutar programas que procesan la entrada.
La profundidad de un modelo puede medirse por:
la cantidad de instrucciones secuenciales necesarias para evaluar la arquitectura, o
la longitud del camino más largo en un diagrama de flujo que describe el cálculo de las salidas.
La profundidad percibida de un modelo puede variar dependiendo del “lenguaje” o funciones que se elijan para representar la arquitectura en un diagrama de flujo.
Ejemplo: Regresión logística
La profundidad de un modelo no tiene un valor único o correcto, ya que la percepción de la profundidad depende de la elección de los elementos básicos utilizados para construir los gráficos.
No hay consenso sobre cuánta profundidad se necesita para que un modelo sea considerado como “profundo”.
El aprendizaje profundo se puede considerar como el estudio de modelos que involucran una mayor cantidad de composición de funciones o conceptos aprendidos en comparación con el aprendizaje automático tradicional.
El aprendizaje profundo es una técnica de aprendizaje automático que permite a los sistemas informáticos mejorar con la experiencia y los datos.
Se sostiene que el aprendizaje automático es el único enfoque viable para construir sistemas de IA que puedan operar en entornos del mundo real complicados.
Entonces…
Los modelos de Deep Learning pueden ser vistos como un tipo particular de Machine Learning, más potente y flexible al poder representar los distintos problemas que se analizan a través de una jerarquía anidada de conceptos, con cada concepto definido en relación a conceptos más simples, y así sucesivamente.
Algunos conceptos claves en la historia de la evolución del Deep Learning
Ha tenido muchos nombres a lo largo de la historia, a partir de diferentes puntos de vista filosóficos. Esto tambien ha hecho que su popularidad haya presentado variaciones.
Se ha vuelto más útil a medida que ha aumentado la cantidad de datos de entrenamiento disponibles.
Los modelos han crecido en tamaño a lo largo del tiempo a medida que la infraestructura informática (tanto hardware como software) para el aprendizaje profundo ha mejorado.
Ha resuelto aplicaciones cada vez más complicadas con una precisión creciente con el tiempo.
Los primeros predecesores de lo que conocemos hoy como Deep Learning fueron modelos mucho más simples, motivados desde una perspectiva neurocientífica.
Estos modelos fueron diseñados para tomar un set de valores de entrada (inputs) \(x_1, \ldots, x_n\) y luego asociarlos con un valor de salida (output) \(y\). Estos modelos podrían aprender un set de pesos (weights) \(w_1, \ldots, w_n\) y computar el valor de salida \(f(\mathbf{x}, \mathbf{y} ) = x_1 w_1, \ldots, x_n w_n\).
1958, Frank Rosenblatt creó el perceptrón.
1962, primer algoritmo de entrenamiento para el perceptrón: \(\mbox{Cambio de Peso} = (\mbox{Valor de línea de Peso Previo})\frac{\mbox{Error}}{\mbox{Número de Entradas}}\)
Alrededor de la misma época, un artículo afirmó que no podría ser una extensión de la red neuronal de una sola capa a una red neuronal de múltiples capas.
La primera red multicapa se desarrolló en 1975, siendo una red no supervisada.
Entre 1980-1986 se crearon arquitecturas de múltiples capas, el problema principal era la falta de un algoritmo de entrenamiento.
1986, tres grupos independientes de investigadores, incluyendo a Rumelhart y otros, propusieron el algoritmo de retropropagación.
1989: Las redes multicapa feedforward son aproximaciones universales.
1986-2005 se encontraron varios retos computacionales, de estabilidad y de sobreajuste en el uso de este algoritmo.
2006, Hinton, Salakhutdinov, Osindero y Teh demostraron que las redes neuronales feedforward de múltiples capas podían preentrenarse eficazmente una capa a la vez, comenzando la era del aprendizaje profundo.
2009 las redes neuronales de aprendizaje profundo fueron entrenadas con unidades de procesamiento gráfico (GPU) de Nvidia.
Desde entonces, múltiples arquitecturas han sido reconsideradas y creadas resolviendo problemas específicos.
Para más detalles, se puede revisar el libro de Deep Learning (ver Goodfellow, Bengio, y Courville 2016, 12-26).
Hay muchos recursos en internet para encontrar información histórica asociada a Deep Learning, por ejemplo:
Infografía Data never sleeps de Domo
Número de neuronas asociado a la complejidad de los modelos de DL (Goodfellow, Bengio, y Courville 2016).
Resultados del error obtenido por los ganadores de la competencia de clasificación ImageNet, figura extraída de Dean (2019).
Un algoritmo de aprendizaje automático es un algoritmo capaz de aprender desde los datos.
Se dice que un algoritmo computacional aprende desde la experiencia \(E\) con respecto a una clase de tareas \(T\) y una medida de desempeño \(P\), si su desempeño en tareas \(T\), medido por \(P\), mejora con la experiencia \(E\) (Mitchell 1997)1.
Clasificación En esta tarea, el algoritmo debe especificar a cuál de un set de \(k\) categorías pertenece un input determinado.
Cuando \(f = f(\mathbf{x})\), el modelo asigna un input descrito por el vector \(\mathbf{x}\) a una categoría identificada por un código numérico \(y\).
También, donde \(f\) tiene una salida asociada a una distribución de probabilidad de todas las clases.
Regresión En esta tarea, el algoritmo debe predecir un valor numérico dado algún valor de entrada (input).
Para evaluar las habilidades de los algoritmos de aprendizaje, se debe diseñar una medida cuantitativa de su desempeño. Usualmente, esta medida de desempeñp \(P\) es específica a la tarea \(T\) llevada a cabo por el algoritmo.
Para tareas como clasificación, usualmente se emplea la exactitud (accuracy) del modelo, que representa la proporción de ejemplos en los que el modelo produce la salida correcta. También se puede obtener información equivalente al medir la tasa de error, o la proporción de ejemplos erróneamente clasificados.
En tareas de regresión, se debe buscar una métrica distinta que entregue un valor contínuo para cada ejemplo.
Estamos interesados en como el algoritmo se desempeña en datos que no ha visto antes, ya que esto determina qué tan bien funcionará el modelo en el mundo real.
Las medidas de desempeño se evalúan usando un conjunto de datos de prueba (test set), que es separado de los datos empleados para el entrenamiento del modelo.
Los algoritmos de aprendizaje automático pueden ser categorizados como supervisados o no supervisados. Dependiendo de qué tipo de experiencia tienen permitido utilizar durante el proceso de aprendizaje del modelo.
Aprendizaje supervisado
Datos etiquetados
Retroalimentación directa
Predecir resultados/futuro
Aprendizaje no supervisado
No hay etiquetas
No hay retroalimentación
Encontrar estructura oculta en los datos
Aprendizaje reforzado
Proceso de decisión
Sistema de recompensas
Aprender una serie de acciones
Los datos consisten en algunos puntos y una etiqueta o valor objetivo asociado a ellos.
El objetivo de los algoritmos es encontrar alguna manera de estimar ese valor objetivo.
Usualmente utilizados como etapa final de algún proyecto de ciencia de datos, asociado a clasificación o regresión.
En este caso, solo se tiene datos en bruto, sin ninguna etiqueta ni objetivo a ser predicho.
Los algoritmos no supervisados se emplean para encontrar patrones en los datos, buscando en su estructura subyacente.
Usualmente usados como parte del pre procesamiento de los datos.
Algoritmos de agrupamiento (clustering), por ejemplo, intentan separar los datos en agrupaciones naturales.
Algoritmos más utilizados: Q-learning y DQN (Deep Q network)
Ejemplos de entornos donde se utiliza:
Juegos
Manejo de recursos
Recomendaciones personalizadas
Robótica
Los factores que determinan la capacidad de desempeño de in algoritmo de aprendizaje automático son las habilidades para:
Hacer el error de entrenamiento lo más pequeño posible
Hacer que la brecha entre error de entrenamiento y prueba sea lo más pequeño posible
Zona de infraajuste: En el extremo izquierdo del gráfico, donde ambos errores, de entrenamiento y de generalización, son altos.
Capacidad óptima: Punto en el eje de capacidad donde el error de generalización es mínimo antes de que comience a aumentar nuevamente.
Brecha de generalización: La diferencia entre el error de entrenamiento y el error de generalización; se amplía a medida que la capacidad excede la óptima.
Zona de sobreajuste: Área a la derecha de la línea roja vertical, donde la capacidad es demasiado grande y el error de generalización es más alto debido a una brecha de generalización más amplia.
Teorema: No hay almuerzo gratis (No free lunch Theorem)
El teorema no hay almuerzo gratis para el aprendizaje automático (Wolpert 1996) establece que, promediado sobre todas las posibles distribuciones generadoras de datos, cada algoritmo de clasificación tiene la misma tasa de error al clasificar puntos previamente no observados. En otras palabras, en cierto sentido, ningún algoritmo de aprendizaje automático es universalmente mejor que cualquier otro. El algoritmo más sofisticado que podamos concebir tiene el mismo rendimiento promedio (sobre todas las posibles tareas) que simplemente predecir que cada punto pertenece a la misma clase.
Cualquier modelo que afirme ofrecer una flexibilidad superior en el análisis de los patrones de datos generalmente lo hace a costa de introducir suposiciones adicionales, o al sacrificar la generalización en situaciones importantes.
Debido a que no hay un algoritmo superior en todos los escenarios, la elección del algoritmo de aprendizaje automático debe basarse en el conocimiento previo específico del problema y la naturaleza de los datos con los que se está trabajando.
Algunos algoritmos funcionarán mejor en ciertos problemas y otros serán superiores en diferentes contextos.
Si un algoritmo tiene un buen desempeño en una tarea específica, es porque las suposiciones implícitas en el modelo se alinean bien con la distribución de los datos de esa tarea.
Cuando se elige o se diseña un algoritmo de aprendizaje automático para una tarea específica, se debe considerar cómo se relacionan las propiedades del algoritmo con los datos y la tarea en cuestión. No existe una estrategia única que sea la mejor, sino que la elección se debe adaptar al problema específico.
Definición
La regularización es cualquier modificación que se hace en un algoritmo de aprendizaje que tiene como objetivo reducir su error de generalización pero no su error de entrenamiento. En otras palabras, ayuda a que el modelo pueda generalizar de mejor manera.
El concepto de regularización en el aprendizaje automático se refiere a técnicas aplicadas a modelos para prevenir el sobreajuste, i.e. cuando un modelo es tan complejo que aprende el ruido del conjunto de datos de entrenamiento, reduciendo su capacidad para generalizar bien a nuevos datos.
Al regularizar, se agrega información (usualmente en forma de una penalización a la complejidad del modelo) para disuadir al algoritmo de aprendizaje de ajustarse demasiado a los datos de entrenamiento. Esto se hace a menudo añadiendo un término adicional a la función de pérdida durante el entrenamiento que penaliza los pesos grandes (en el caso de la regularización L1 o L2), mediante métodos como la parada temprana, donde el entrenamiento se detiene antes de que el sobreajuste pueda comenzar, o el dropout donde algunas neuronas se “desactivan” aleatoriamente, es decir, se les asigna un valor de cero.
El objetivo final es mejorar el rendimiento del modelo en datos no vistos previamente, sin mejorar su rendimiento en los datos de entrenamiento.
Esquema de una red neuronal profunda (Deep Feed Forward Networks, DFFN)
Esquema de una red neuronal convolucional (Convolutional Neural Networks, CNN)
Esquema de una red neuronal Long Short Term Memory (LSTM)
Esquema de una red generativa adversarial (Generative Adversarial Network, GAN)
En general, instalaremos alguna distribución de Python, que podremos usar directamente a través de algún IDE (como Spyder).
También es posible ejecutar código de Python en R a través de la librería reticulate
. Para ello, tendremos que indicar a R la ruta de acceso a alguna distribución de Python que tengamos instalada en nuestro computador.
Luego, necesitaremos las siguientes plataformas de desarrollo para Deep Learning:
Lo primero sería descargar la distribución de Anaconda
Luego, dependiendo si se cuenta con GPU (Graphic Processor Unit, i.e. Tarjeta de video dedicada), se pueden seguir dos caminos:
Instalar Tensorflow y Keras con GPU
Instalar Tensorflow y Keras sin GPU (o dicho de otra forma, instalar con CPU)
Acá un tutorial en video en español de cómo instalar TensorFlow dentro de un entorno virtual de Anaconda
RStudio proporciona una guía para comenzar con TensorFlow
y Keras
en R.
Se puede instalar el paquete de tensorflow directamente desde GitHub y luego utilizar la función install_tensorflow()
para instalar TensorFlow
en un entorno virtual llamado “r-tensorflow
”.
Después, instalar Keras
utilizando la función install_keras()
, que instalará TensorFlow
y algunas dependencias de Python comúnmente utilizadas.
La instalación sería algo así:
# Instalar el paquete tensorflow desde GitHub
remotes::install_github("rstudio/tensorflow")
# Asegurarte de que Python está instalado o instalarlo con reticulate
reticulate::install_python()
# Instalar TensorFlow
library(tensorflow)
install_tensorflow(envname = "r-tensorflow")
# Instalar Keras
install.packages("keras")
library(keras)
install_keras()
También podremos emplear Google Colab para ejecutar nuestro código de manera online. Esto tiene algunas ventajas y desventajas.