sábado, 9 de mayo de 2020

Introducción a las redes neuronales


En esta serie de artículos vamos a hacer una introducción al aprendizaje profundo con Keras, y vamos a crear y utilizar redes neuronales con Keras.
El aprendizaje profundo hace uso de clústeres informáticos y GPU potentes, y permite arquitecturas de redes neuronales más complejas.
Keras es una biblioteca para redes neuronales de Python que podemos usar para crear una variedad de modelos de aprendizaje, y se puede usar con Theano y Tensorflow.
Veremos cómo crear y utilizar redes neuronales con Keras. Específicamente, examinaremos qué son las redes neuronales, cómo configurar y utilizar Keras para construir redes. Utilizaremos Jupyter Notebooks para crear conjuntos de datos y construir redes neuronales con Keras.

Redes neuronales

Las redes neuronales artificiales, o ANN, son una serie de algoritmos que se calculan en un enfoque estructurado en capas y se utilizan para reconocer patrones.
El término neuronal se refiere a las ANN que se modelan para imitar el cerebro humano.  Cada nodo se denomina neurona y acepta una o más entradas, se procesa y produce una salida sumada. Una red neuronal artificial puede estar compuesta por muchas neuronas en múltiples capas. Las entradas suelen ser elementos que se clasifican en forma de eje x que son los datos de entrada, y el eje y es la salida esperada. La función de la red neuronal es establecer mediante aprendizaje un mapeo de pesos establecidos inicialmente de forma aleatoria y que se va ajustando con cada nueva entrada, con cada  nueva entrada, predice una etiqueta de salida. La diferencia entre la salida dada y la salida ideal es la función de pérdida, que se utiliza para reajustar los pesos de cada neurona, de modo que con cada nueva entrada la diferencia entre la salida real y la  esperada sean menores hasta que en un momento dado, la red acierte el mayor número posible de veces. 
Introducción a las redes neuronales
Esquema de una red neuronal artificial


Las entradas pueden ser imágenes, clips de sonido o textos. Cada fila de los datos de entrada se considera una neurona. Y cada neurona se conecta a la siguiente en la siguiente capa, también definida por pesos relativos de la salida generada. Cada fila se multiplica por la columna de la matriz de peso. El valor resultante se convierte en una probabilidad antes de pasar como entrada a la siguiente capa. Las capas ocultas aceptan la salida de la capa anterior como su entrada. Cada capa transformará su entrada en algo que la siguiente pueda utilizar. Si por ejemplo una ANN se utiliza para  reconocimiento facial, necesitará aprender que una cara se compone de bloques de construcción básicos, ojos, nariz, boca y oídos. Por lo tanto, cada capa se utiliza para identificar uno de estos bloques de construcción. La capa de salida sumará todas las salidas para construir lo que se reconoce como una cara. Debajo, se muestra el diagrama funcional de una neurona de la red.

Esquema de una neurona artificial
Esquema de una neurona artificial

Se acepta una entrada x con su peso correspondiente w, un sesgo representado por b. Y la función de activación f, se aplica a la suma ponderada con las entradas para normalizarlas. En este caso, es una red neuronal de avance pues los datos continúan hacia adelante de izquierda a derecha sin retroalimentarse en un bucle. La salida de una capa es la entrada de la siguiente. Las neuronas artificiales calculan una suma ponderada de sus entradas.


Agregan el  sesgo y luego decide si debe dispararse o no. Disparar significa que la suma de salida es 1 mientras que no se dispara si la suma de salida es cero. Las funciones de activación definen la salida de una neurona determinada y si la neurona debe dispararse o no, dependiendo de si la información que recibe la neurona es relevante para la información dada o si debe ignorarse. Los tres tipos más populares de funciones de activación en el diagrama inferior  van de izquierda a derecha. El primero es un sigmoide, que asigna el eje x de entrada a valores entre 0 y 1,  o entre -1 y 1. Y la unidad lineal reacia, o ReLU, solo permite valores positivos, de modo que asigna cero a todos los negativos.

Función Sigmoide
Función Sigmoide


La retropropagación consiste en tomar la salida de la función de pérdida como entrada y la retroalimenta a través de las neuronas en la capa oculta. Cuando el peso es demasiado bajo o demasiado alto, la función de pérdida, que representa el nivel de error, será alta. El peso asignado debe ser el valor óptimo para alcanzar el punto de error máximo reducido.(es decir el máximo error permitido deberá ser lo más pequeño posible).
Una red neuronal cambiará el peso de la suma y la reevaluará muchas veces hasta que logre un gradiente óptimo. Este proceso se llama descenso en gradiente. En la imagen inferior se muestra un ejemplo de una función de pérdida cuadrática, escrita en función de las salidas de la red neuronal. La ecuación de la izquierda representa el cálculo de la función sobre el número total de muestras de entrenamiento. La sigma muestra la suma  de cada ejemplo de entrenamiento individual j en este caso. Y la potencia L representa el vector de activaciones de salida de la red, por cada entrada j.

Función de pérdida cuadrática
Función de pérdida cuadrática

El diagrama de la derecha muestra el ciclo de retroalimentación que crea la propagación hacia atrás para pasar los valores sumados de las salidas a lo largo de las capas ocultas y alimentarlos nuevamente a través de la red como entradas. 

Redes neuronales con Keras

Keras tiene varios tipos de capas para realizar diferentes funciones. Y cada capa contribuye a la red neuronal de manera que conduce a escenarios de aprendizaje complejos, lo que permite una funcionalidad avanzada. Las capas pueden comprender una o más neuronas, y la capa de salida final generalmente consiste en una sola neurona. Esta salida es la predicción de una clasificación hecha por un modelo. Esta última capa se llama capa densa,  y es la capa más comúnmente conectada en una red neuronal. Se invoca utilizando la función keras.layers.Dense y tiene una serie de argumentos que pueden invocarse manipulando los datos a medida que fluyen. Algunos argumentos son unidades, indicando el número de neuronas que contiene la capa. La activación, es la función de activación que debe usar la capa. Esta es la función de transferencia que la red utiliza para asignar la salida de una capa a la siguiente. Las más utilizadas son las sigmoides, tanh y lineal reacia (reluctant linear) , o RELU. También podemos poner como parámetro use_bias, que es una expresión booleana (sí-no), que proporciona el sesgo para el modelo. La forma de entrada especificada en una capa densa es el tensor enviado a la primera capa oculta y debe tener la misma forma que los datos de entrenamiento. La forma de salida de una capa densa se formula mediante un cálculo del tamaño del lote y el número de unidades. Al agregar una salida a una capa, establecemos aleatoriamente una fracción especificada de unidades de entrada a cero en cada actualización en el proceso de capacitación, lo que ayuda a evitar un ajuste excesivo.


Tipos de redes: 

Redes convolucionales

Las redes neuronales convolucionales o CNN son una categoría de redes neuronales que se utilizan para el reconocimiento y la clasificación de imágenes. Una red neuronal normal no puede escalar bien a las imágenes. Una imagen de 32 píxeles cuadrados y el uso de tres canales de color requiere 3.072 pesos aplicados para el cálculo. De modo que, grandes cantidades de imágenes de gran tamaño requieren un enorme rendimiento computacional para analizar y clasificar. 

Esquema de una red convolucional

Las CNN que se construyen estrictamente para imágenes se pueden diseñar de manera diferente. Pueden aceptar capas tridimensionales. En una CNN, la capa de entrada acepta los píxeles sin procesar de la imagen, el ancho, la altura y los tres canales de color. La capa de convolución calcula la salida de neuronas conectadas a regiones en la entrada. Por lo tanto, estos se conocen como filtros, donde un filtro selecciona una pequeña parte de la imagen y la asigna. Esta serie de mapas se pasan a través de cada capa, diezmando los datos a medida que avanzan. Una convolución expresa la cantidad de superposición de un filtro a medida que se desplaza sobre el siguiente, combinando cada función o desplazamiento con el anterior. La capa completamente conectada calcula los puntajes de la clase al tener cada neurona conectada a todas las activaciones en la capa anterior. Entonces, usando estas etapas, la CNN transforma la imagen original a través de cada capa. Desde el valor de píxel original a una puntuación de clase final que utiliza para clasificar imágenes.


Redes neuronales convolucionales


Tienen capas que de tres dimensiones, ancho, alto y profundidad. Las neuronas en cada capa no se conectan a todas las neuronas en la siguiente capa, sino solo a una pequeña parte de la capa. El resultado final se reduce a una única probabilidad. Las capas convolucionales no utilizan unidades para su salida, sino que usan filtros. Un filtro, o núcleo (son términos intercambiables),  es la región de la imagen que se analiza desglosada en una matriz. Si el conjunto de datos esta compuesto por imágenes que tienen un tamaño de 32 píxeles por 32 píxeles y 3 colores, entonces el tamaño del filtro debe ser de 5 por 5 por 3, lo que significa que cada convolución  analiza un área de tamaño 5 por 5 píxeles y  3 colores.

Redes Convolucionales con Keras

Stride es del tamaño del paso que mueve el filtro de convolución cada vez que procesa. Por lo general, sería uno, lo que significa que el filtro se mueve por píxeles individuales. Si se aumenta el tamaño del paso, el filtro se mueve con un intervalo mayor y tiene menos superposición entre las celdas.

Ahora, a medida que se aplica cada filtro de paso, las dimensiones espaciales pasadas a la siguiente capa disminuyen. En las primeras capas, los datos deben mantenerse lo más intactos posible con una pérdida mínima para aumentar la precisión de la clasificación. El relleno agrega un borde de ceros alrededor del exterior de la imagen, lo que obliga al modelo a mantener la mayor parte de la imagen original intacta posible.  

Redes recurrentes

Las redes recurrentes utilizan el concepto de memoria. La entrada para la siguiente capa del modelo es una combinación de los datos de entrada.

Red Recurrente.
Red Recurrente.


y la salida de la capa oculta en el estado temporal anterior de forma recursiva. Las RNN se pueden usar para predecir la siguiente palabra en una oración o analizar patrones de palabras para determinar el sentimiento. Lo hacen mapeando palabras que frecuentemente aparecen antes y después de una palabra objetivo y luego generan una secuencia. Entonces, este diagrama ilustra dónde a es el tiempo actual, a-1 es la activación anterior y a + 1 es la siguiente activación. La capa oculta acepta la entrada de la capa de entrada y una capa oculta de la activación anterior. a acepta la entrada de la capa oculta de a-1 antes y después de que ocurra la activación. Y luego proporciona su propia salida sumada como entradas antes y después de la activación de las capas ocultas en un + 1. Entonces cada uno de estos resultados sumados podría ser una palabra en la oración. Agregando sesgo para confirmar que en la oración, el gato dormía, la palabra ‘el’ viene antes que ‘gato’ pero no después de ‘dormía’.

Redes Recurrentes con Keras

Una celda en una RNN es un bloque de memoria que contiene información que se puede almacenar, escribir o leer. Cuando la información se repite, se envía a una celda y luego se lee como entrada para la siguiente capa de cálculo. Los argumentos para la capa recurrente permiten que se agreguen o no secuencias de retorno y estados de retorno. El argumento booleano return_sequences hará que el modelo devuelva la última salida de la secuencia de salida o la secuencia completa. return_state también es booleano e indicará al modelo si debe devolver el último estado además de la salida. El argumento go_backwards por defecto o no especificado se convertirá en falso. Si se establece en verdadero, procesará la secuencia de entrada hacia atrás y devolverá la secuencia invertida. Las dimensiones y la longitud de entrada se utilizan para manipular los datos que entran en el modelo, de modo que las capas recurrentes puedan entenderlo. El entero input_dim se requiere para la primera capa del modelo y especifica la forma de la entrada. Input_length es la longitud de las secuencias de entrada y debe especificarse en la capa de entrada, si la capa recurrente no es la primera capa del modelo.

La versión más simple de una RNN, es una red neuronal recurrente, donde la salida se retroalimenta directamente a la entrada. Una unidad recurrente cerrada que utiliza funciones lógicas, es una adición reciente al campo de las redes neuronales, se ha demostrado que proporcionan mejores resultados cuando se utilizan en modelos de música y habla. LSTM, o memoria a corto y largo plazo, utiliza puertas lógicas para contener información fuera del flujo del RNN que se puede introducir en el modelo cuando sea relevante. Las puertas son analógicas y actúan sobre la información recibida de las neuronas en el modelo para decidir cuándo debe abrirse o cerrarse, permitiendo que el modelo acceda a la información contenida en las células externamente. 


Las palabras incrustadas en las redes neuronales son un tipo de enfoque para representar palabras como vectores. Se asigna la palabra a una representación vectorial y, al hacerlo, la red aprende la ubicación y la distancia de letras y palabras en relación entre sí. Keras ofrece una capa de incrustación que asigna cada palabra a un número entero único. Cuando esos enteros se inicializan con pesos aleatorios, entrena el conjunto de datos para reconocer las secuencias de letras y palabras para construir oraciones. Los datos se pueden almacenar y utilizar en otras redes. La capa de incrustación debe ser la primera de las capas ocultas en una red.

Keras dispone de capas adicionales que realizan funciones más especializadas e incluso incluye la capacidad de escribir sus propias capas definiendo un requisito. Por lo tanto, estas capas deben explorarse y comprenderse antes de definir la red para garantizar que se va a encontrar el mejor ajuste antes de perder el tiempo en calcular un modelo de bajo rendimiento. Ejemplos de capas adicionales comunes son las capas de normalización. Estas intentan normalizar las activaciones de la capa anterior mediante la aplicación de una transformación que sigue siendo la activación media lo más cercana posible a cero y la desviación estándar lo más cercana posible a uno. Keras también dispone de capas de agrupación, que reducen las dimensiones espaciales de una representación para reducir el número de parámetros y cálculos en la red. Hay varias capas de activación avanzadas que se basan en los tres activadores principales, sigmoide, tanh y reacia lineal, o RELU, pero introducen características adicionales para realizar análisis más especializados.


No hay comentarios:

Publicar un comentario