En este cuaderno se entrenan redes neuronales convolucionales y recurrentes para clasificar secuencias. Las secuencias utilizadas son el resultado de la vectorización de mensajes obtenidos del conjunto de datos 20NewsGroup que contiene 20000 mensajes tomados de 20 newsgroup.
Los mensajes tienen varios encabezados en la parte superior. Uno de ellos es el campo de categoría que establece la etiqueta o la clase de la observación. La clase también puede estar presente en otros campos de los encabezados, a saber, Followup-to o Subject.
> things which are eternal. Jesus is a subset of God. Therefore
>:> Jesus belongs to the set of things which are eter
Al leer los archivos, se elimina cualquier encabezado con una mención de la clase correspondiente. Además, también se eliminan los encabezados Path y Xref y los encabezados que contienen direcciones de correo electrónico.
Los textos se dividen para formar un conjunto de datos de entrenamiento y uno de validación.
Uso train_test_split para estratificar la división y tener una distribución proporcional de categorías entre ambos conjuntos, y se deja la última observación fuera del conjunto de datos de entrenamiento para hacer una predicción al final con fines de representación.
He escrito un vectorizador para transformar los textos en secuencias. El método es simple, primero se instancia un objeto, configurado en este caso con una longitud máxima por secuencia de 200 tokens y un vocabulario con un número máximo de tokens de 20000.
Luego, el método .fit del objeto toma la matriz de entrenamiento como argumento para formar el vocabulario que se usará cada vez que se pase una matriz al método transform`. Transformar una matriz es tokenizar una cadena de caracteres y vectorizarla mapeando desde el vocabulario.
Las matrices de secuencias resultantes junto con sus correspondientes clases se pasan a TwentyNewsDataset para instanciar dos objetos torch.utils.data.Dataset, que se utilizarán en el entrenamiento de las redes neuronales.
Se puede encontrar un menor sobreajuste al conjunto de entrenamiento y, por lo tanto, una mayor precisión de validación, aumentando la longitud máxima de la secuencia. Por razones de rendimiento, he establecido una longitud relativamente baja.
Modelado
En esta sección se entrenan cuatro modelos, dos redes convolucionales y dos redes recurrentes, usando estas funciones.
Todos los modelos implementados comparten un flujo de trabajo similar, es decir, una representación multidimensional de las secuencias, un proceso de aprendizaje de características de alto nivel en los datos y una última fase de clasificación de las estimaciones.
Por eso he escrito una simple clase que instanciaré en cada modelo y que reunirá los diferentes módulos a utilizar.
Embeddings
La siguiente clase se utilizará para aplicar una transformación multidimensional a las secuencias en el forward pass. El backward pass solo alterará los parámetros de las embeddings si no están previamente entrenados.
Al utilizar parámetros previamente entrenados en una de las redes neuronales convolucionales más adelante, descargo un índice GloVe (822 MB) con todos los pesos y creo un tensor de (20002, 100) o (N_TOKENS, GLOVE_EMBEDDING_DIM). Es decir, una matriz con todas las palabras del vocabulario más dos caracteres especiales y las 100 dimensiones correspondientes a cada token.
Si el índice GloVe no contiene un token del vocabulario, cada dimensión de ese token será igual a cero.
A más del 90% de los tokens se les ha asignado parámetros previamente entrenados, algunos de los tokens no encontrados en el índice de GloVe se muestran arriba.
Clasificador
He definido dos clasificadores, uno con una capa completamente conectada y otro con dos. Ambos incluyen un argumento de dropout para poner a cero aleatoriamente un porcentaje de los elementos del tensor de entrada al clasificador.
CNN
Se entrenan dos modelos simples con redes convolucionales:
la primera versión es una red con tres capas de convolución de una dimensión con max pooling, que usa como embeddings de entrada parámetros ya entrenados de 100 dimensiones, y que tiene en la salida un clasificador de dos capas.
la segunda versión es una red con cuatro capas de convolución 1-d con max pooling, una capa de embeddings de entrada de 128-d y en la salida un clasificador de una capa.
He establecido regularización L2 y un 50 % y un 40 % de dropout en cada clasificador respectivamente, para tratar de solucionar un problema del sobreajuste del conjunto de entrenamiento. Esto tiene un mejor resultado en la segunda red convolucional.
Los hiper parámetros se enumeran en la parte superior de cada celda de código correspondiente.
Por último, he entrenado dos redes neuronales recurrentes:
una con un LSTM monocapa bidireccional y un mecanismo de autoatención.
y otra con GRU monocapa bidireccional y mecanismo de autoatención.
Ambos tienen una capa de embeddings de 128 dimensiones y un clasificador de una capa. Sin embargo, solo he configurado dropout en el LSTM.
Logramos una mejor precisión de validación con las redes recurrentes, aunque también hay un sobreajuste notable, como podemos ver en los gráficos a continuación durante el proceso de aprendizaje.
Aumentar la regularización no soluciona este problema. Por tanto, una solución podría ser aumentar la longitud de las secuencias.
Predicción
A continuación podemos ver el flujo de trabajo utilizado para realizar una única predicción:
'Subject: Re: After 2000 years, can we say that Christian Morality is\nDate: 24 Apr 1993 14:03:44 -0700\nOrganization: EIT\nLines: 126\nNNTP-Posting-Host: squick.eitech.com\n\n>#>Ordinarily, it is also a *value* judgement, though it needn\'t be (one \n>#>could "do science" without believing it was worth a damn in any context, \n>#>though that hardly seems sensible).\n>#No, you\'re just overloading the word "value" again. It is an\n>#estimation of probability of correctness, not an estimation of "worth."\n>#Sh'
Regresión de precios en el conjunto de datos Ames housing prices
¿Preparado para #buidl?
¿Está interesado en Web3 o en las sinergias entre la tecnología blockchain, la inteligencia artificial y el conocimiento cero?. Entonces, no dude en contactarme por e-mail o en mi perfil de LinkedIn. También me puede encontrar en GitHub.