Cómo construir LSTM (versión pytorch)

1. LSTM unidireccional

0. paquete de importación

import torch

1.rnn = torch.nn.LSTM (input_size, hidden_size, num_layers)

rnn = torch.nn.LSTM(10, 20, 2)  #(input_size,hidden_size,num_layers)

El primer parámetro input_size entre paréntesis es la dimensión del vector de entrada, el segundo parámetro hidden_size es la dimensión del vector de capa oculta, y el tercer parámetro num_layers representa el número de capas de bucle.

El tercer parámetro num_layers no es fácil de entender, puede entenderlo a través de la siguiente figura:
Inserte la descripción de la imagen aquí
generalmente num_layers tiene como valor predeterminado 1, cuando num_layers es 2, es como la imagen de arriba, la salida h_t de la primera capa se usa como entrada de la segunda capa, esto Se expande en el espacio, y lo que a menudo podemos ver es la expansión en el tiempo, como se muestra a continuación (num_layers = 1 cuando se expande en el eje del tiempo):
Inserte la descripción de la imagen aquí
Por lo tanto, cuando aplicamos el algoritmo de propagación inversa a LSTM, ambos Para calcular la propagación del error a lo largo del tiempo y la propagación del error a lo largo de la capa, la red neuronal completamente conectada ordinaria solo necesita calcular la propagación del error a lo largo de la capa al hacer la propagación inversa, como se muestra en la siguiente figura,
Inserte la descripción de la imagen aquí
puede usar LSTM con neuronal completamente conectada La red hace una analogía:
Inserte la descripción de la imagen aquíeliminamos la conexión específica y podemos ver que LSTM es muy similar a la red neuronal completamente conectada. LSTM solo expande la función de la capa oculta ordinaria.

2.input = torch.randn (seq_len, batch, input_size)

input = torch.randn(5, 3, 10)#(seq_len, batch, input_size)

Generar una forma 5 5 3 10 5 * 3 * 10 tensor, los elementos tensores que están sujetas a un número aleatorio de distribución normal estándar.
Vea el enlace para la comprensión popular de los tensores:enlace. El
segundo lote de parámetros indica que toda la secuencia de entrada se divide en 3 lotes pequeños (es decir, lotes), y el primer parámetro seq_len indica que cada lote pequeño requiere varios pasos de tiempo para el procesamiento El tercer parámetro input_size es la dimensión del vector de entrada.
referencia de lote.
¿Por qué lo agrupa aquí? Es más conveniente cuando se utiliza el descenso de gradiente. No necesita actualizar los parámetros cada vez que se procesa la unidad más pequeña de una entrada, y no necesita esperar a que se procesen todas las entradas antes de actualizar todos los parámetros. Aquí puede consultar el descenso por gradiente de lotes pequeños.

3. Dos inicializaciones

h0 = torch.randn(2, 3, 20) #(num_layers,batch,output_size)
c0 = torch.randn(2, 3, 20) #(num_layers,batch,output_size)

4. Cálculo directo

output, (hn, cn) = rnn(input, (h0, c0))

Ponga la entrada de entrada y la inicial h0, c0 en rnn para realizar el cálculo hacia adelante, calcule la salida y hn, cn, por supuesto, rnn aquí ya es un LSTM instanciado (vea el primer título).

Inserte la descripción de la imagen aquí

Dos LSTM bidireccionales

import torch
rnn = torch.nn.LSTM(input_size=10, hidden_size=20, num_layers=2,bidirectional=True)#(input_size,hidden_size,num_layers)
input = torch.randn(5, 3, 10)#(seq_len, batch, input_size)
h0 = torch.randn(4, 3, 20) #(num_layers,batch,output_size)
c0 = torch.randn(4, 3, 20) #(num_layers,batch,output_size)
output, (hn, cn) = rnn(input, (h0, c0))

Simplemente agregue bidireccional = Verdadero entre los corchetes de torch.nn.LSTM () para activar el LSTM bidireccional. La diferencia entre LSTM bidireccional y LSTM unidireccional es que LSTM unidireccional solo puede usar los valores de los pasos anteriores al calcular los valores relevantes de un paso de tiempo, mientras que LSTM bidireccional puede usar los valores de los pasos anteriores y los últimos pasos. Valor.

Por ejemplo, al agregar una oración:
"Voy a __".
En este momento, se puede usar LSTM unidireccional para especular que el nombre de un lugar debe llenarse en el espacio. Pero si la oración residual se convierte en:
"Quiero __ escuela".
Esto se basa en las palabras "Quiero". Es difícil deducir el contenido del espacio, pero si combina "escuela", puede adivinar con precisión. Este es el escenario de aplicación de LSTM bidireccional.

Inserte la descripción de la imagen aquí Formato de entrada y salida LSTM .

Publicó 41 artículos originales · elogió 13 · visitas 6692

Supongo que te gusta

Origin blog.csdn.net/comli_cn/article/details/104523867
Recomendado
Clasificación