Pytorch_Red neuronal recursiva RNN
RNN es la abreviatura de Recurrent Neural Networks, que suele utilizarse para resolver problemas secuenciales. RNN tiene una función de memoria y utiliza el contexto como base para la predicción además de la entrada actual. Se usa comúnmente en reconocimiento de voz, traducción y otros escenarios.
RNN es la base del modelo de secuencia. Aunque los algoritmos RNN ya preparados se pueden llamar directamente, muchas redes complejas posteriores se construyen en redes RNN. Por ejemplo, el método de Atención requiere el uso de la capa oculta. datos RNN. El principio de RNN no es complicado, pero debido a que contiene bucles, es difícil describirlo con palabras o dibujos. La mejor manera es hacerlo manualmente. La mejor manera es escribir una red RNN usted mismo. Este artículo presentará los principios y la implementación de las redes RNN.
Antes de comprender las redes neuronales recurrentes, comprendamos primero qué es una secuencia. Una secuencia, abreviada como seq, es un conjunto de datos secuenciales. El procesamiento del lenguaje natural es el problema de secuencia más típico. Por ejemplo, al traducir una oración a otra, el significado de una palabra depende no solo de sí misma, sino también de varias palabras anteriores y posteriores. Del mismo modo, si se quiere predecir el desarrollo argumental de una película, éste no solo está relacionado con la escena actual, sino también con una serie de antecedentes de la situación actual. En el proceso de pronóstico utilizando modelos de secuencia, la entrada es una secuencia y la salida son uno o más valores predichos.
Cuando se utilizan modelos de aprendizaje profundo para resolver problemas de secuencia, la confusión más común es entre la secuencia y los elementos de la secuencia. En diferentes escenarios de aplicación, la definición de secuencia es diferente; cuando se analiza el sentimiento de una palabra, una palabra es una secuencia; cuando se analiza el sentimiento de una oración, una oración es una secuencia, en la que cada palabra es una secuencia. elemento en; y al analizar el sentimiento de un artículo, un artículo es una secuencia. En pocas palabras, una secuencia son los datos de entrada que finalmente utiliza el modelo y consta de una secuencia de elementos.
Al analizar el color emocional de una oración, la oración es secuencial. El significado de las palabras contenidas en la oración y la relación entre las palabras son objetos de análisis específico. los elementos de la secuencia y cada cada palabra puede tener características multidimensionales. El método de extraer características de las palabras se introducirá más adelante en el procesamiento del lenguaje natural.
RNN tiene muchas formas, incluidas entrada única, entrada única, entrada múltiple, salida múltiple, entrada única y salida múltiple, etc.
Tome el ejemplo más simple: se utiliza un modelo para predecir el color emocional de una frase de cuatro caracteres. La entrada son cuatro elementos X={x1,x2,x3,x4} y la salida es un. valor Y= {y1}. El orden de las palabras es importante; por ejemplo, "de bueno a malo" y "de malo a bueno" significan exactamente lo contrario. La razón por la que no es necesario que el número de entradas y salidas corresponda uno a uno es porque las capas ocultas en el medio almacenan información intermedia de diferentes maneras.
Si piensa en el modelo como una caja negra, se verá así:
Si el modelo utiliza una red completamente conectada, entonces, en cada iteración, el modelo calcula cada elemento. número de características f1,x2... en x1,x2....f1,f2....
La red RNN es más compleja dentro del modelo, no ingresa las características de todos los elementos de la secuencia en el modelo a la vez, sino que ingresa las características de un solo elemento de la secuencia en el modelo. siempre. La siguiente figura describe el proceso de procesamiento de datos de RNN. El lado izquierdo es una demostración paso a paso y el lado derecho resume todos los pasos de tiempo en un módulo.
Paso 1: Características f1, f2 del primer elemento x1...
Paso 2: Ingrese las características del segundo elemento x2 en el modelo, y el modelo La h generado en el paso anterior se calcula nuevamente para la capa oculta h, y así sucesivamente para otros elementos.
Paso 3: Ingrese las características del último elemento xn en el modelo, y el modelo calculará la capa oculta h y el valor predicho y en función de la entrada yh generados en el paso anterior. La capa oculta también se puede pasar desde el exterior como entrada del modelo y también se puede devolver a la llamada externa como salida del modelo.
Este ejemplo todavía utiliza los datos de secuencia de pasajeros de la aerolínea del artículo anterior e implementa RNN de dos maneras: escribiendo un programa para implementar el modelo RNN y llamando al modelo RNN proporcionado por Pytorch. El primer método se utiliza principalmente para analizar el principio y el último método se utiliza para demostrar los métodos de llamada más utilizados.
Primero, importe el archivo de encabezado, lea los datos del pasajero, realice el procesamiento de normalización y divida los datos en un conjunto de prueba y un conjunto de entrenamiento. La diferencia con el anterior es que se agrega la función create_dataset. generar datos de secuencia En la parte de entrada de la secuencia, cada elemento incluye dos características: el número de pasajeros en el mes anterior anterior y el valor del mes mon. El valor del mes no es una característica clave y se utiliza principalmente en las rutinas. El valor del mes aquí no es una característica clave, se usa principalmente para demostrar cómo usar múltiples funciones en la rutina.
Paso 1: Implementar la clase modelo. El modelo RNN en este ejemplo genera una capa oculta además de la capa completamente conectada y combina la salida de la capa oculta con los datos de entrada, que luego se sustituyen en el modelo en el siguiente paso hacia adelante.
En el segundo paso, el modelo se entrena 500 veces utilizando todos los datos. Durante cada proceso de entrenamiento, el bucle for interno reemplaza cada elemento de la secuencia en el modelo y oculta la salida de la capa del modelo. a la siguiente iteración junto con el siguiente elemento.
Paso 3: Predecir y dibujar gráficos. El proceso de predicción es el mismo que el de entrenamiento. Divida todos los datos en elementos y sustitúyalos en el modelo. Almacene los resultados de cada predicción en una matriz y dibuje gráficos.
Vale la pena señalar que durante el proceso de entrenamiento y predicción, la capa oculta se restablecerá cada vez antes de comenzar a ingresar una nueva secuencia. Esto se debe a que el contenido de la capa oculta solo está relacionado con la actual. secuencia. No hay continuidad.
El resultado del programa es el siguiente:
Después de 500 iteraciones, los resultados obtenidos usando RNN son significativamente mejores que el ajuste obtenido usando la red completamente conectada en los resultados del artículo anterior y se puede optimizar aún más ajustando los hiperparámetros y seleccionando diferentes funciones.
Usando el modelo RNN proporcionado por Pytorch, puede usar directamente la clase torch.nn.RNN, que es la solución más utilizada para redes recurrentes. RNN, LSTM, GRU y otras redes recurrentes se implementan en el mismo archivo de código fuente torch/nn/modules/rnn.py.
Paso 1: cree el modelo, que consta de dos partes. La primera parte es la capa RNN proporcionada por Pytorch y la segunda parte es la capa completamente conectada, que se utiliza para convertir la salida. RNN en la dimensión del objetivo de salida.
La propagación hacia adelante RNN de Pytorch permite pasar los datos de la capa oculta h como parámetros al modelo y devolver los h e y producidos por el modelo como retornos de la función. Por ejemplo: pred, h_state = model(x, h_state)
¿Cuándo necesita recibir el estado h_state de la capa oculta e ingresar a la siguiente iteración? Cuando se procesa una sola secuencia, h se pasa hacia adelante internamente; cuando también hay dependencias hacia adelante y hacia atrás entre secuencias, h_state se puede recibir y pasar a la siguiente iteración. Además, cuando el modelo es complejo, como el modelo LSTM que contiene muchos parámetros, pasarlos aumentará la complejidad del modelo y ralentizará el proceso de entrenamiento. Este ejemplo no mueve la capa oculta fuera del modelo. Esto se debe a que el modelo procesa internamente la secuencia completa en lugar de elementos individuales y no hay continuidad entre las secuencias en cada reemplazo.
Paso 2: Entrena el modelo. A diferencia del ejemplo anterior, que reemplazó los elementos de la secuencia en el modelo uno por uno, este ejemplo reemplaza toda la secuencia en el modelo de una vez, por lo que solo hay un bucle for.
Pythorch admite el procesamiento por lotes. El formato de los datos de entrada de la transmisión directa es [seq_len, batch_size, input_dim). la dimensión de cada elemento es el número de características, el tamaño del lote es el número de secuencias que se entrenarán y el seq_len es la longitud de la secuencia.
len es la longitud de la secuencia, aquí se utiliza el 70% como datos de entrenamiento y seq_len es 100. Si el orden de las dimensiones de los datos no coincide con los requisitos, generalmente se utiliza la transformación por transposición.
Paso 3: Pronóstico y gráfico, conecte todos los datos al modelo como una serie y registre los valores predichos.
El resultado del programa se muestra en la siguiente figura:
Se puede ver que después de 500 iteraciones, el efecto de ajuste es bueno en el conjunto de entrenamiento de los primeros 100 elementos, pero el El efecto no es bueno en el conjunto de prueba. Bueno, puede haber sobreajuste.