Comment construire LSTM (version pytorch)

1. LSTM unidirectionnel

0. Importer un package

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)

Le premier paramètre input_size entre parenthèses est la dimension du vecteur d'entrée, le deuxième paramètre hidden_size est la dimension du vecteur de calque masqué et le troisième paramètre num_layers représente le nombre de couches de boucle.

Le troisième paramètre num_layers n'est pas facile à comprendre, vous pouvez le comprendre à travers la figure suivante:
Insérez la description de l'image ici
généralement num_layers par défaut à 1, lorsque num_layers est 2, c'est comme l'image ci-dessus, la sortie h_t de la première couche est utilisée comme entrée de la deuxième couche, ceci Il est développé dans l'espace, et ce que nous pouvons souvent voir est l'expansion dans le temps, comme indiqué ci-dessous (num_layers = 1 lorsqu'il est développé sur l'axe du temps):
Insérez la description de l'image ici
Par conséquent, lorsque nous appliquons l'algorithme de propagation inverse à LSTM, les deux Pour calculer la propagation de l'erreur dans le temps et la propagation de l'erreur le long de la couche, le réseau neuronal ordinaire entièrement connecté n'a besoin de calculer la propagation de l'erreur le long de la couche que lors de la propagation arrière, comme indiqué dans la figure suivante,
Insérez la description de l'image ici
vous pouvez utiliser LSTM avec un neurone entièrement connecté Le réseau fait une analogie:
Insérez la description de l'image icinous supprimons la connexion spécifique et nous pouvons voir que LSTM est très similaire au réseau de neurones entièrement connecté.LSTM étend seulement la fonction de la couche cachée ordinaire.

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

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

Générer une forme 5 3 dix 5 * 3 * 10 tenseur,éléments de tenseur qui sont soumis à un nombre aléatoire de distribution normale standard.
Voir le lien pour la compréhension populaire des tenseurs:lien. Le
deuxième lot de paramètres indique que la séquence d'entrée entière est divisée en 3 petits lots (c'est-à-dire le traitement par lots), et le premier paramètre seq_len indique que chaque petit lot nécessite plusieurs pas de temps pour le traitement Le troisième paramètre input_size est la dimension du vecteur d'entrée.
référence de lot.
Pourquoi la regrouper ici? Elle est plus pratique lors de l'utilisation de la descente de gradient. Elle n'a pas besoin de mettre à jour les paramètres à chaque fois que la plus petite unité d'une entrée est traitée. Ici, vous pouvez vous référer à la descente en petit gradient.

3. Deux initialisations

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

4. Calcul prévisionnel

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

Mettez l'entrée d'entrée et le h0, c0 initial dans rnn pour effectuer un calcul direct, calculez la sortie et hn, cn, bien sûr, rnn ici est déjà un LSTM instancié (voir le premier titre).

Insérez la description de l'image ici

LSTM à deux voies

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))

Ajoutez simplement bidirectionnel = True dans les crochets de torch.nn.LSTM () pour activer le LSTM bidirectionnel. La différence entre le LSTM bidirectionnel et le LSTM unidirectionnel est que le LSTM unidirectionnel peut uniquement utiliser les valeurs des étapes précédentes lors du calcul des valeurs pertinentes d'un pas de temps, tandis que le LSTM bidirectionnel peut utiliser les valeurs des étapes précédentes et des dernières étapes. La valeur.

Par exemple, lors de l'ajout d'une phrase:
«Je vais à __».
À l'heure actuelle, LSTM unidirectionnel peut être utilisé pour spéculer qu'un nom de lieu doit être rempli dans l'espace. Mais si la phrase résiduelle devient:
"Je veux __ école."
Ceci est basé sur les mots "Je veux". Il est difficile de déduire le contenu de l'espace, mais si vous combinez "école", vous pouvez deviner avec précision. Il s'agit du scénario d'application du LSTM bidirectionnel.

Insérez la description de l'image ici Format d'entrée et de sortie LSTM .

Publié 41 articles originaux · loué 13 · visites 6692

Je suppose que tu aimes

Origine blog.csdn.net/comli_cn/article/details/104523867
conseillé
Classement