Introducción a las RNN.

Es ampliamente conocido que las Redes Neuronales Recurrentes (Recurrent Neural Networks RNN) son la mejor elección a la hora de procesar datos secuenciales. ¿Qué tipo de datos son secuenciales? Podemos considerar para este caso texto, voz, DNA, moléculas, lineas de tiempo, etc. Como vemos este tipo de redes son muy útiles. Dos tareas comunes para trabajar con estos datos son: segmentar los datos de entrada y asignar anotación a los datos. Cada una de estas tareas se suele realizar mediante una red neuronal distinga. En la siguiente imagen vemos cómo por cada entrada xt se obtiene una salida yt donde xtX  y ytY.  

Bidirectional RNN. Fuente

Cada estado hes una unidad RNN, donde las más comunes son LSTMs o GRUs. Para capturar la mayor cantidad de contexto se suele usar dos capas de RNN. Una que lee la secuencia desde el inicio hasta el final (de x0 hasta xn, donde n es el tamaño de la secuencia) y otro desde el final hasta el inicio. Los estados de las dos RNN se concatenan y se calcula la probailidad de salida mediante una función de activación, que en la mayoría de los casos es una función tangente hiperbólica tanh. Evidentemente, el error de estas redes es calculado por una función de error y son corregidas por algún algoritmo de optimización, cómo puede ser el Algoritmo de la Gradiente Descendiente. 

Cuando intentamos separa datos en dos o más clases (por ejemplo separar hojas de árboles y hojas de pétalos) con un algoritmo de machine learning, entonces siempre es importante entender qué tipo de datos son los que tenemos. La idea básica de clasificar datos es encontrar una función g() tal qué pueda separar los datos en las regiones requeridas. Esto es bastante sencillo si lo hiciéramos con datos que se pueden separar por una línea (o con un hiperplano). Sin embargo, muchos de los datos en la realidad no se pueden separar de esta manera. Para ejemplificar datos que no son linealmente separables, utilizaremos una distribución de datos aleatorias llamada moons, o lunas, que tiene la ventaja de mostrar el problema en dos dimensiones. 

Para este estudio requeriremos:

  • sklearn
  • python3
  • numpy
  • matplotlib

Ahora vamos a usar un algoritmo llamado regresion logística para poder clasificar objetos o fenómenos en dos clases diferentes. Esto lo lograremos tomando un conjunto de entrenamiento que está marcado como clase uno o como clase dos y lo probaremos sobre datos que no conocemos con antelación. De esta manera podemos ver si nuestro modelo funciona sobre estos datos. Los resultados los comparamos con las predicciones hasta el final. Para ello usaremos regresión logística. Hay que recordar que el modelo de regresión logística únicamente puede separa datos linealmente separables, al igual que el perceptrón

En este artículo vamos a trabajo con numpy y python. Así que si gustan, de entrada debemos importar:

import numpy as np 

Notación y problema

En este ejemplo vamos a hacer la clasificación sobre el problema: ¿un dato nuevo petenece a la clase 1 o a la case dos?. Si x es el valor que se desea obtener en la clasificación, entonces:

\[ y= \begin{cases} 1 & \text{Pertenece a clase 1} \\ 0 & \text{Pertenece a clase 2} \end{cases} \]

Ahora que hemos definido las clases, debemos tomar en cuenta representar de forma matemática las características de la foto. Vamos a representar en forma de vector los pixeles en una división RGB de la imagen y la vamos a concatenar. Esto nos arrojará un gigantesco vector que contendrá todos los valores de los pixeles de la imagen en una dimensión. Con estos valores definamos nuestra notación.

Cada ejemplo es un par ordenado

\[ (x,y), x\in \mathbb{R}^{n_x}, y\in\{0,1\} \]

 donde x es un vector n dimensional de características y y es uno o cero. Para nuestro conjunto de entrenamiento se definirán m ejemplos entrenamientos tal que onbtendremos los siguientes ejemplos de entrenamiento:

\[M=\{(x^1,y^1), (x^2,y^2), \dots, (x^m,y^m)\} \]

Para facilitar el trabajo y recordando que cada x es un vector, podemos unir estos vectores en una matriz, que llamaremos X, y que tiene la forma:

\[X=[x^1,x^2,\dots,x^m], \text{ donde } X\in\mathbb{R}^{n_x\times m}\]

Ahora, las clases también se guardarán en un vector. Si recordamos, que cada x tiene asociado una y escalar, entonces el vector de todos los y es:

\[Y=[y^1,y^2,\dots,y^m], \text{ donde } Y\in\mathbb{R}^{1\times m}\]

Vamos a crear un set artificial de datos para pode mostrar lo expuesto arriba. Este set será usado para exponer todo el trabajo posterior que vamos a realizar.

X = np.matrix(
        [[1.,3.,2.,2.,0.],
        [2.,0.,3.,1.,1.],
        [3.,2.,2.,1.,2.],
        [0.,1.,2.,8.,2.],
        [2.,4.,3.,2.,4.],
        [3.,1.,4.,0.,3.],
        [4.,3.,1.,2.,2.],
        [0.,2.,1.,1.,3.],

        [8.,7., -2.,12.,5.],
        [7.,5.,  0.,21.,4.],
        [8.,0.,-12.,18.,4.],
        [9.,5., -2.,18.,6.],
        [6.,4.,  0.,22.,5.],
        [7.,1., -1.,11.,3.],
        [8.,5.,  1.,23.,6.],
        [3.,5., -3.,12.,4.]]
    )

Y = np.matrix([[1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]])

 

Ahora que hemos definido la notación que vamos a usar, es hora de plantear el problema. Nosotros queremos encontrar una función que data una entrada x nos pueda generar una estimación de y, tal que:

 

\[\hat{y}=P(y=1|x) \text{ y los parámetros } w\in\mathbb{R}^{n_x}, b\in\mathbb{R}\]
 

La Regresión Logística

 

 ¿Pero qué función logrará definir mejor el comportamiento de nuestra salida para definir la probabilidad de y? Es posible generar una función lineal con la multiplicación de wTx+b , pero esto tendría algunos problemas. El primero de ellos es que al ser lineal puede adquirir valores negativos y positivos superiores a 1. Pero al ser una probabilidad la que necesitamos regresar, esto no tendría sentido. La función que necesitamos generar debe encontrarse entre 0<=y<=0, por lo que usaremos una función sigmoide. Esta se comporta de la siguiente manera:

En recientes años se ha podido observar un decremento en la capacidad de predicción por parte de las encuestas tradicionales. Esto se debe a que en parte las personas han establecido nuevas relaciones por las redes sociales y también se han visto infuenciados por estas. Sin embargo, medir las redes sociales en la tendencia electoral no es una tarea fácil. En el caso de las elecciones para presidente de México del año 2018, hemos entrenado de NLP (Procesamiento de Lenguaje Natural), para clasificar los sentimientos que expresan las personas al momento de opinar sobre los principales candidatos, e las redes sociales, en concreto usamos Twitter. Los datos son analizados y reportados directo a nuestro portal en www.stat.eenube.com para su acceso en tiempo real. Las actualizaciónes que se realizan son cada 15 minutos, para tener un márgen suficiente de tweets para estalecer tendencias. Iniciamos con las mediciones desde el 9 de enero de 2018 y seguirá corriendo hasta el final del proceso electoral y continuará si es que existiese algún conflicto post electoral. 

Cómo se muestra en la imágen anterior, es posible realcionar eventos concretos, o declaraciones directo sobre la opinión de las personas. Esto se expersará en un cambio de tendencia. Conforme se colecten más datos se podrá analizar también la tendencia general de las opiniones de los usuarios por días y presentar análsis cuantitativos sobre los candidatos. Todo esto lo publicaremos en esta página. Para resumir:

  • Sentimientos respecto a los candidatos expresado por usuarios en twitter.

  • Uso de algoritmos Deep Learning del estado del arte.

  • Actualizaciones en tiempo real.

 

Para ver el estudio en tiempo real, se puede encontrar en el siguiente link:

www.stat.eenube.com

  

 

Por otro lado, su ustedes gustan de saber el mecanismo con el cuál se hacen las predicciones, a continuación se explicará. Se utiliza un Red Neuronal Recurrente (RNN) con un modelo encoder decoder. Para mejorar la clasificación se incluye además un mecanismo de atención. Las neuronas utilizadas son GRU y el algoritmo de optimización es un adam. El corpus con el cuál se entrenó fue recolectado y anotado por el quipo de eenube. Si tienen más preguntas acerca de la metodología utilizada con gusto pueden escribir a la página o preguntarnos en redes sociales. Esperamos esta herramienta sea útil en su seguimiento de las elecciones del presente año. 

 

En este artículo daremos una breve introducción a la ciencia de datos y cómo comenzar en su estudio. En primer lugar debemos pensar en los datos como un cúmulo de información (más adelante daremos una definición más formal), sobre los cuales queremos obtener información o conclusiones. Esto no es fácil, dado que los datos que tenemos no siempre son el total de los que queremos estudiar (población), o son demasiado grandes para utilizar métodos comunes en estadística (mas de cien variables, por ejemplo). Otro problema es que los fenómenos que pretendemos estudiar no siempre corresponden a una distribución normal, por lo que métodos estadísticos "comunes" no son aplicables. Si bien, la persona que conoce de estadística no paramétrica y multivariante podría dar algunas respuestas a los problemas planteados, es necesario hacer notar que existe una amplia gama de análisis que pueden ser aplicados a los datos. La ciencia de datos se ha convertido en una pujante área que intersecta estadística y ciencias de la computación y por lo tanto se ha convertido en algo muy importante para un programador.

Share This