Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Aprendizaje profundo
1. Deep Learning: Concepto
La inteligencia artificial está compuesta por diferentes campos y el área más estudiada
en la actualidad es el aprendizaje automático. En este curso vamos a ver ampliamente
las posibles aplicaciones y las técnicas basadas en este campo que pretenden imitar a
la inteligencia humana y cada vez se acercan más a nuestra forma de pensar. El
aprendizaje profundo o Deep Learning se trata de una subárea específica dentro del
aprendizaje automático que se basa en las técnicas que utilizamos los humanos para
aprender y en las que se analiza información con el objetivo de sacar diferentes
conclusiones. Estas conclusiones dependen de muchos factores, entre ellos del
conocimiento previo. El aprendizaje profundo intenta replicar el funcionamiento de las
miles de neuronas que se conectan en nuestro sistema nervioso haciendo uso de lo
que llamamos redes neuronales.
Las técnicas de aprendizaje profundo o Deep Learning utilizan estructuras que imitan
al sistema nervioso y se organizan en varias capas. Cada una de estas capas está
formada por neuronas y cada neurona realiza una tarea concreta. El sistema nervioso
tiene una estructura característica formada por diferentes áreas y cada una se encarga
de una tarea específica. Por ejemplo, hay muchos científicos que creen que cada lado
del cerebro humano está especializado en unas funciones concretas: el hemisferio
izquierdo es más lógico o analítico y el hemisferio derecho es más emocional y
creativo.
Machine learning generar modelos que nos permitan predecir, encontrando patrones en
los datos. Nosotros estraemos las características
Deep learning la máquina las estrae ella… son modelos más potentes
2. Redes neuronales
2.1. Definición
Una red neuronal se compone por una o más neuronas distribuidas en varios niveles o
capas. Cada neurona está conectada con otras de nivel posterior y anterior mediante
las conexiones. En los primeros niveles se aprenden las tareas más simples y se
envían a los siguientes niveles para realizar aprendizajes cada vez más complejos
hasta llegar a la capa de salida. Una red neuronal artificial es una representación
simple que pretende imitar el modo en el que un cerebro humano procesa e interpreta
la información que le llega del mundo exterior.
Figura 3: Red neuronal con varias capas. Fuente: Subida por Gengiskanhg a
Wikipedia., CC BY-SA 3.0 <http://creativecommons.org/licenses/by-sa/3.0/>, en
Wikimedia Commons
Una red neuronal normalmente se divide es tres partes:
Capas ocultas: Las entradas conectan con una o varias capas, llamadas
capas ocultas que realizan un procesado de la señal mediante funciones
matemáticas. A esta parte de la red se le suele denominar también con el
término de “caja negra” porque una vez diseñada la red neuronal ya no es
necesario conocer en detalle los cálculos realizados para entrenarla y
comprobar su funcionamiento.
Cada uno de los nodos puede tener una o varias entradas a donde llegan las señales
o parámetros de entrada (x1, x2,...etc.). Cada señal que llega se multiplica por un valor
que representa la intensidad de esa señal. A la salida de nuestra neurona tenemos la
suma ponderada de cada uno de los datos de entrada y multiplicados por la intensidad
de cada una de ellas. Este modelos es muy parecido al modelo de regresión lineal que
vimos en el anterior curso de aprendizaje automático.
Los valores con los que trabaja una neurona suelen ser valores binarios (0 y 1) por lo
que antes de enviar la señal a otra neurona se realiza un cálculo que transforma la
señal de entrada y se activa la salida. La representación se suele hacer mediante
puertas lógicas que son operaciones matemáticas con número binarios. Este es un
ejemplo del comportamiento de una neurona cuyo funcionamiento se representa como
una puerta lógica OR.
Conexiones
Para solucionar problemas complejos concatenamos varias neuronas que transmiten
la información mediante conexiones. Cada conexión tiene su peso o intensidad, cuyo
valor se asigna al azar de acuerdo a la importancia que considere el diseñador.
Posteriormente, durante el entrenamiento, se estos valores se pueden modificar.
Peso
El peso es la importancia de cada señal de entrada a la neurona. La fuerza de las
señales de entrada se regula modificando estas variables (w1, w2, ...etc.). El objetivo
del entrenamiento es reducir el error al máximo posible y para ello se modifican estos
valores hasta conseguir el punto óptimo.
Sesgo
El sesgo o Bias es una entrada adicional que siempre tiene valor 1 y que se utiliza
para activar la neurona aunque ninguna de las demás entradas nos proporcionen valor
a la entrada. El peso de esta entrada se representa con la letra “b”.
Función de activación
Las neuronas tienen, como hemos visto anteriormente, una respuesta lineal y cuando
conectamos varias neuronas en capas, la respuesta será también una línea recta.
Para obtener salidas diferentes y permitir la resolución de problemas complejos se
añade una función de activación que puede ser de varios tipos según el resultado que
deseemos. Esta función hace que la respuesta total del sistema se convierta en no
lineal y se ajuste de una manera más real a la salida. Lo que hace realmente es
distorsionar el plano de la salida de la neurona para que al sumarse con el resto de
respuestas neuronales forme la figura de nuestra respuesta deseada. Algunas de las
funciones de activación más utilizadas en el diseño de modelos de aprendizaje
profundo son las siguientes:
Sigmoide: Esta función tiene como entrada cualquier valor real. El rango de
valores de salida de esta función está ente el valor 0 y el valor 1. Cuanto mas
grande sea el valor de entrada, más cerca del valor 1 estará la salida. El valor
de e es una constante matemática que se utiliza como base para los logaritmos
naturales.
TanH: La función de tangente hiperbólica es muy parecida a la anterior. El
rango de valores de salida para esta función es cualquier valor que se
encuentre entre -1 y +1. La gráfica de su respuesta tiene forma se S y su valor
aumenta cuanto mayor es el valor de la entrada.
Se utiliza una función de activación para cada capa de la red neuronal y la elección de
esta función es parte del diseño. En las capas ocultas de la red controlará el
aprendizaje durante la la fase de entrenamiento y en la capa de salida nos
proporcionará diferentes tipos de predicciones del modelo. Por esta razón, la elección
de la función de activación es una parte importante del diseño de nuestra red neuronal
artificial que debemos tener muy en cuenta.
2.3. Tipos de neuronas artificiales
Las neuronas artificiales se pueden clasificar dependiendo del tipo de salida que son
capaces de proporcionar. Las salidas de las neuronas pueden ser binarias si a la
salida solo dan los valores 0 y 1 o pueden ser reales si su valor está comprendido
entre 0 y 1. Otra forma de clasificar a las neuronas es teniendo en cuanta si son
lineales o no lineales.
Neuronas lineales
Como hemos visto anteriormente, el funcionamiento de una neurona o nodo de una
red neuronal es muy similar al modelo de regresión lineal que nos da una recta como
salida. La función de la recta depende de las señales de entrada a esa neurona. El
funcionamiento a la salida de una neurona lineal se suele representar con la siguiente
función, en la que b es el sesgo, las w son los pesos y las X son las señales de
entrada.
Uno de los problemas que puede presentar este tipo de neuronas es que con
variaciones pequeñas en las señales de entrada, nuestra recta de salida puede sufrir
grandes variaciones de señal. Además, esta neurona no se podrá adaptar a todo tipo
de señales por las limitaciones del modelo lineal.
Neuronas no lineales
Cuando nuestra salida no depende exclusivamente de las señales de entrada, no sufre
una variación tan brusca al ser modificada la intensidad de estas señales. Si utilizamos
alguna de las funciones de activación que acabamos de ver, nuestra respuesta ya no
será lineal y se podrá acotar la salida a los valores que queramos. Por ejemplo, si
utilizamos la función sigmoide, nuestra salida estará acotada entre los valores 0 y 1
para cualquier valor que tomen las entradas.
Las utilización de redes neuronales conlleva una serie de ventajas entre las que
podemos destacar:
Por nombrar alguna desventaja de utilizar estas redes podríamos decir que el
tiempo de aprendizaje necesario en algunas ocasiones es muy elevado. Se
requiere mucho tiempo para reconocer gran cantidad de patrones para
clasificar cuando la variedad de los datos de entrada es muy abundante.
El proceso de entrenamiento de una red neuronal hace que el modelo sea capaz de
responder de manera autónoma al ser estimulado mediante diferentes valores de
entrada. Lo que se realiza exactamente es el ajuste de los pesos correspondientes a
las entradas de cada una de las células o nodos. La respuesta en las neuronas de la
capa de salida debe ser lo más parecida posible a los valores esperados y así
conseguir que el error cometido sea el mínimo. Al principio todas las entradas tienen
valores iniciales sin ajustar y la respuesta de la red puede que no tener mucho sentido.
Durante el entrenamiento el modelo va aprendiendo y proporcionará respuestas cada
vez más adecuadas.
La red examina cada uno de los valores individualmente y genera una predicción.
Cuando esta predicción es incorrecta realiza los ajustes necesarios modificando los
pesos de algunas neuronas para, de esta manera, ajustar la salida. La repetición de
este proceso se realiza las veces que sean necesarias hasta mejorar la respuesta y
reducir el error al mínimo valor establecido. Cuando haya terminado el entrenamiento
el modelo será capaz de dar respuesta correctas a los problemas o a entradas cuya
respuesta correcta sea conocida previamente.
La función de activación de cada neurona debe tener una señal con forma y rango
establecidos según el tipo de función utilizada. En el momento en el que la señal
analizada no es como esperábamos, es cuando esa neurona reconfigura los pesos de
sus entradas y se vuelve a repetir todo el proceso. Las funciones de activación
estudiadas han sido elegidas, entre otros motivos, porque tienen una derivada de
primer orden fácilmente calculable para un valor de entrada. Esta última característica
es importante ya que, como veremos más adelante, para el entrenamiento de redes
neuronales se suele utilizar el algoritmo de retropropagación en el que se necesita
calcular la función derivada del error de predicción antes de modificar los pesos.
Para disminuir el error cometido se realiza una estimación del ajuste que se debería
hacer en los valores de entrada. Esta estimación se hace por el método del descenso
del gradiente que calcula la pendiente hasta un error cero por medio de las derivadas.
El valor del gradiente o derivada se le resta al peso y con este cálculos se va
reduciendo el valor de error. En cada iteración el valor de predicción de la red se
acerca cada vez más al valor real.
3.4. Optimización
Después de lo que hemos visto y de saber que los parámetros iniciales en las
entradas de las neuronas se asignan al azar, podemos suponer que la primera
predicción que haga nuestro modelo no será demasiado precisa. Para que nuestro
diseño tenga una calidad aceptable debe tener una tasa de acierto que puede variar
dependiendo del problema a resolver. No es lo mismo reconocer emociones para lo
que nos bastaría con un 90% de confianza, que realizar otras tareas más críticas como
la detección del cáncer o los test de embarazos que deberían ser lo más precisas
posible.
Playgraund.tensorflow.org
Este tipo de redes poseen una arquitectura compleja que procesa los datos recibidos
en la numerosas capas que la forman. Cada capa se encarga de una tarea concreta
como reconocer colores, bordes, formas, sombras,...etc. Actualmente son las
estructuras más efectivas para reconocimiento de imágenes o procesado de audios.
Están basadas en la arquitectura de las redes neuronales tradicionales pero se
añaden algunas capas al principio de la red para facilitar el trabajo con los pixeles que
forman las imágenes. Las capas más importantes son las siguientes:
Capa pooling: Esta capa selecciona los pixeles que mas representan a la
imagen y los agrupa para mejorar la respuesta.
Capa ReLU: Se suele colocar una capa no lineal después de cada capa de
convolución. La función que se suele utilizar es la función ReLU porque permite
un rápido entrenamiento manteniendo una buena precisión a la salida.
La visión por ordenador es un área que ha evolucionado muy rápido gracias a las
redes neuronales convolucionales. Los avances mas importantes en esta área son:
Clasificación de imágenes: Es la tarea que mejor resuelven este tipo de
redes. A partir de muchas imágenes son capaces de encontrar características
similares y clasificarlas por categorías. ¿Es un perro?, ¿hay un coche? ¿está
triste?. Cada capa oculta de la red se encarga de detectar una característica
específica del objeto que se quiere clasificar y la respuesta dependerá de que
muchas las características que sean similares al objeto dado. Por ejemplo, si
queremos clasificar frutas y le enseñamos un limón a la red, existirá una capa
que detecte su forma ovalada, habrá otra para detectar el color amarillo, otra
para la textura de la corteza,...etc. En el siguiente vídeo se puede ver la
arquitectura de las capas de un modelo de red neuronal convolucional para
detección de imágenes que necesitó semanas de entrenamiento.
1 .- Data collection
2- model creation
4.- visualization
Vídeo 5: Tráfico
La operación de convolución
En definitiva, los filtros de nuestro modelos van aprendiendo a detectar patrones con el
entrenamiento. Para obtener cada uno de estos filtros se realizan diferentes cálculos
matemáticos sobre los pixeles de la imagen de entrada, entre ellos la operación de
convolución.
Las redes neuronales que hemos visto hasta ahora tienen un flujo de datos que
siempre va en la misma dirección, desde la capa de entrada hacia la capa de salida.
También existen redes en las cuales la información se transmite desde una capa hacia
las capas anteriores. La neuronas de una capa oculta pueden tener una conexión a las
neuronas de entrada y, a la vez, a las neuronas de su misma capa. De esta manera la
red puede modificar una respuesta dependiendo de las respuestas que ha tenido
anteriormente. Este tipo de red se utiliza para calcular secuencias de datos en el
tiempo y dotan de “memoria” al modelo.
Una de las aplicaciones de estas redes es para el análisis de textos. Por ejemplo, para
detectar si una frase tiene un significado positivo o negativo, la red va obteniendo y
modificando la respuesta mientras escribimos las frase. El último resultado tendrá en
cuenta los resultados anteriores que se han calculado antes de terminar la frase. Con
estas predicciones la red está utilizando su memoria para predecir la misma salida
pero en momentos diferentes.
Anteriormente vimos el algoritmo de retropropagación que se utiliza en el
entrenamiento de redes neuronales. Para las redes recurrentes no es posible utilizar
este algoritmo directamente por las conexiones que existen con las capas anteriores.
Se pueden utilizar otros algoritmos de optimización para entrenar este tipo de redes
aunque no son tan eficientes como el de retropropagación. Por esta razón una de las
soluciones es adaptar el algoritmo de retropropagación. La adaptación de este
algoritmo convierte la red recurrente en una red de una sola dirección y recibe el
nombre de algoritmo de retropropagación en el tiempo.
Codificador automático
Es un tipo de arquitectura de red en la que primero se obtiene toda la secuencia de
datos de entrada y cuando se ha terminado es cuando se genera la respuesta del
modelo. Las redes neuronales recurrente suelen utilizar esta configuración, ya que se
utilizan principalmente para trabajar con secuencias de datos. Se le llama codificador a
la primera parte de la red y decodificador a la segunda parte. El decodificador es el
encargado de crear la secuencia de salida que dependerá de los datos que ha recibido
del codificador.
Un ejemplo de esto podría ser una IA que genera imágenes nuevas de objetos a partir
de, solamente, algunas indicaciones. Si le indicamos que genere una foto de una casa
con chimenea en el campo a la primera de las redes, la red generadora, creará una
imagen que se parezca lo máximo posible a una casa con esas características. La
segunda red, la red discriminadora, va a recibir la imagen generada y va a comprobar
si lo que muestra en ella se parece a la foto de una casa o no.
Este tipo de redes se entrenan con millones de imágenes diferentes para que la red
que discrimina sea capaz de reconocer una casa real de una casa generada por
ordenador. En el ejemplo anterior tendríamos a la entrada del modelo muchísimas
fotos de casas con diferentes chimeneas y en lugares de la naturaleza diferentes. En
un principio, para la segunda red es fácil acertar porque la primera red genera
imágenes de casas al azar y sin mucha precisión. Pero con el tiempo, la red
generativa va aprendiendo y compone fotos cada vez más realistas con lo que la tarea
de la red discriminadora se va complicando. Como vemos, en la fase de entrenamiento
las dos redes aprenden al mismo tiempo mejorando ambas su respuesta.
La empresa Nvidia utiliza las redes generativas adversarias para mejorar la calidad e
imagen de las videoconferencias en sus productos. Al recibir un vídeo se ocupa mucho
espacio del ancho de banda de la conexión. Con este método solamente es necesario
enviar alguna imagen de la persona que se va a conectar al principio de la conexión y
la red le añade los cambios faciales para hablar, moverse o reír. Lo que realmente se
transmite son puntos de referencia, que ocupan mucho menos espacio, y
posteriormente, la red neuronal se encará de aplicar los cambios a la foto enviada
inicialmente.
5. Herramientas
Hasta ahora hemos visto en qué consiste el aprendizaje automático y los tipos de
redes neuronales que podemos utilizar. Para entrenar a estas redes e implementar
nuestros diseños necesitaremos además, una serie de herramientas o elementos que
nos van a facilitar la tarea. El entrenamiento de modelos con aprendizaje profundo es
complejo y requiere de una inversión considerable de tiempo así que, se utilizan
modelos prediseñados y preentrenados para ahorrar tiempo al diseño.
Como hemos visto, entrenamiento de una red neuronal consiste en ajustar los pesos
de las entradas a las neuronas y, una vez entrenado el modelo, estos valores quedan
guardados. Cuando hacemos uso del aprendizaje por transferencia estamos enviando
todos estos valores a otra red neuronal diferente. Existen varios tipos de transferencia
pero el más utilizado es incluir en nuestro proyecto un modelo ya preentrenado. Este
modelo ha sido creado por otra persona y de esta manera, no tenemos que empezar a
construir nuestro modelo desde cero.
Existen numerosos modelos que ya han sido entrenados previamente y que podemos
utilizar en nuestros diseños. Cada modelo se ha especializado en una tarea concreta y
se ha optimizado para proporcionar el mejor resultado posible. Las tareas pueden ser
de lo más variopintas como clasificar verduras o mantener una conversación escrita.
Vamos a nombrar solamente algunos ejemplos:
VGG-16: Red neuronal convolucional preentrenada con imágenes y que cuenta con 16
capas. Esta red fue entrenada para la clasificación de 1000 tipos de imágenes, entre
ellas muchos tipos de animales situados en diferentes escenarios. El conjunto de
datos que se utilizó para el entrenamiento y test se llama ImageNet y cuenta con más
de 1 millón de fotografías. En el vídeo que vimos anteriormente sobre la clasificación
de frutas y verduras se utilizó este modelo preentrenado.
Otra forma más sencilla, es copiar una platilla directamente con los datos de entrada
preparados y en la que podremos realizar cambios para adaptar nuestro modelo antes
de entrenarlo. En este caso tendremos menos cantidad de modelos a elegir y
podremos modificar o añadir etiquetas antes de comenzar con la fase de
entrenamiento.
Keras
Si nos atrevemos a programar en Python, uno de los lenguaje de programación mas
utilizados para aprendizaje automático, disponemos de esta biblioteca compatible y de
código abierto con numerosas redes neuronales. Esta herramienta está especialmente
diseñada para trabajar con redes de aprendizaje profundo. Con Keras podemos
entrenar y validar redes neuronales convolucionales y redes neuronales recurrentes.
No es necesario entender el funcionamiento que hay detrás porque se trabaja a nivel
de modelos, proporcionando bloques para construir redes complejas de aprendizaje
profundo. Un ejemplo del código utilizado para crear y entrenar un modelo se muestra
a continuación:
Figura 10: Código para crear y entrenar una red neuronal utilizando Keras. Fuente:
Código modificado y extraído de developers.google.com
TensorFlow
En las primeras líneas del código anterior, hemos importado el paquete de TensorFlow
que previamente deberíamos haber descargado. Este es un sistema de aprendizaje
automático desarrollado por Google y de código abierto. Con esta herramienta
podemos realizar cálculos numéricos complejos para crear y entrenar redes
neuronales. Si queremos, podremos diseñar una red desde cero en lugar de utilizar la
biblioteca anterior y programando línea a línea todo el código.
6. Uso en el aula
https://cproviedo.es/sonidos-en-el-aire-herramientas-tic-educativas-para-crear-sonido-
con-inteligencia-articificial
Todas la técnicas que hemos visto en este curso han hecho posible los grandes
avances en conducción autónoma de estos últimos años. La detección de objetos se
utiliza para diferenciar a otros vehículos, a peatones y a los semáforos. Las
arquitecturas de redes neuronales de aprendizaje profundo se utilizan en la visión
artificial, tecnología que los coches autónomos utilizan para poder ver a su alrededor.
Una actividad interesante que se puede realizar en el aula es el diseño de un coche
autónomo. Con lenguaje Python y una placa Arduino puedes hacer que un coche
cambie su dirección cuando encuentre un obstáculo sin necesidad de ninguna
indicación humana. A la entrada de la red tendrá los datos obtenidos de dos sensores,
uno de distancia al obstáculo y otro para saber si el obstáculos se encuentra a la
derecha o a la izquierda. A la salida, la red decidirá si gira a derecha, a izquierda o si
cambia de dirección cuando detecta un obstáculo. En el siguiente enlace tienen más
información por si te decides a implementar el proyecto en el aula.
https://www.aprendemachinelearning.com/programa-un-coche-arduino-con-
inteligencia-artificial/
7. Información adicional
Conjuntos de datos https://www.kaggle.com/datasets
Librería de Python https://keras.io/
Aplicaciones de Google https://experiments.withgoogle.com/collection/ai