Fonction torch.nn.LSTM de PyTorch
Manuel de référence torch.nn de PyTorch
torch.nn.LSTMIl s'agit d'un module de PyTorch pour les réseaux Long Short-Term Memory.
LSTM est un type spécial de réseau de neurones récurrent capable d'apprendre des dépendances à long terme et est largement utilisé dans les tâches de modélisation de séquences.
Définition de fonction
torch.nn.LSTM(input_size, hidden_size, num_layers=1, bias=True, batch_first=True, dropout=0, bidirectional=False)
Description des paramètres :
input_size(int) : dimension des caractéristiques d'entrée.hidden_size(int) : dimension de l'état caché.num_layers(int) : nombre de couches LSTM. La valeur par défaut est 1.bias(bool) : indique s'il faut utiliser un biais. La valeur par défaut est True.batch_first(bool): Si True, la forme de l'entrée et de la sortie est (batch, seq, feature). La valeur par défaut est True.dropout(float): Dropout utilisé pour les couches non finales. La valeur par défaut est 0.bidirectional(bool): Indique s'il faut utiliser un LSTM bidirectionnel. La valeur par défaut est False.
Entrées et sorties
Entrées :
input: Tenseur de forme (batch, seq_len, input_size)h_0: État caché initial, de forme (num_layers * num_directions, batch, hidden_size)c_0: État de cellule initial, de forme (num_layers * num_directions, batch, hidden_size)
Sorties :
output: La sortie de la dernière couche cachée, de forme (batch, seq_len, num_directions * hidden_size)h_n: Le dernier état caché de toutes les couchesc_n: Le dernier état de cellule de toutes les couches
Exemples d'utilisation
Exemple 1 : Utilisation de base
Créer et utiliser un LSTM :
Exemple
import torch.nn as nn
# Créer un LSTM : dimension d'entrée 256, dimension cachée 512, 2 couches
lstm = nn.LSTM(input_size=256, hidden_size=512, num_layers=2, batch_first=True)
# Créer une entrée : batch=4, longueur de séquence=10, dimension d'entrée=256
input_tensor = torch.randn(4, 10, 256)
# Passe avant
output, (h_n, c_n) = lstm(input_tensor)
print("Forme de l'entrée :", input_tensor.shape)
print("Forme de sortie :", output.shape) # (4, 10, 512)
print("Forme de l'état caché :", h_n.shape) # (2, 4, 512)
print("Forme de l'état de cellule :", c_n.shape) # (2, 4, 512)
Exemple 2 : LSTM bidirectionnel
Utiliser un LSTM bidirectionnel pour capturer le contexte bidirectionnel :
Exemple
import torch.nn as nn
# LSTM bidirectionnel
bilstm = nn.LSTM(input_size=256, hidden_size=256, num_layers=2, batch_first=True, bidirectional=True)
input_tensor = torch.randn(4, 10, 256)
output, (h_n, c_n) = bilstm(input_tensor)
print("Forme de sortie du LSTM bidirectionnel :", output.shape) # (4, 10, 512) = 256*2
print("Forme de l'état caché :", h_n.shape) # (4, 4, 256) = 2 couches * 2 directions
print("État caché de la dernière couche :", h_n[-2:, :, :].shape) # Propagation avant et rétropropagation
Exemple 3 : Initialisation de l'état caché
Initialiser manuellement l'état caché :
Exemple
import torch.nn as nn
lstm = nn.LSTM(input_size=256, hidden_size=512, batch_first=True)
# Créer manuellement l'état caché initial
batch_size = 4
num_layers = 2
hidden_size = 512
h_0 = torch.zeros(num_layers, batch_size, hidden_size)
c_0 = torch.zeros(num_layers, batch_size, hidden_size)
# Passer l'état initial
input_tensor = torch.randn(4, 10, 256)
output, (h_n, c_n) = lstm(input_tensor, (h_0, c_0))
print("Terminé avec un état initial personnalisé")
print("Forme de sortie :", output.shape)
Exemple 4 : Modèle complet de classification de sentiments
Classification de texte basée sur LSTM :
Exemple
import torch.nn as nn
class LSTMClassifier(nn.Module):
def __init__(self, vocab_size, embed_dim, hidden_dim, num_classes=2):
super(LSTMClassifier, self).__init__()
# Couche d'embedding
self.embedding = nn.Embedding(vocab_size, embed_dim, padding_idx=0)
# Couche LSTM
self.lstm = nn.LSTM(
input_size=embed_dim,
hidden_size=hidden_dim,
num_layers=2,
batch_first=True,
bidirectional=True,
dropout=0.3
)
# Couche de classification entièrement connectée
self.fc = nn.Linear(hidden_dim * 2, num_classes)
def forward(self, x):
# x: (batch, seq_len)
embedded = self.embedding(x) # (batch, seq_len, embed_dim)
# Sortie LSTM
output, (hidden, cell) = self.lstm(embedded)
# Concaténer les états cachés de la dernière couche bidirectionnelle
# hidden : (4, batch, hidden_dim) - 2 couches * 2 directions
hidden = torch.cat([hidden[-2], hidden[-1]], dim=1) # (batch, hidden_dim*2)
# Classification
logits = self.fc(hidden)
return logits
# Instancier le modèle
vocab_size = 10000
model = LSTMClassifier(vocab_size=vocab_size, embed_dim=128, hidden_dim=128, num_classes=2)
# Entrée de test : batch=8, longueur de séquence=50
input_ids = torch.randint(1, vocab_size, (8, 50))
output = model(input_ids)
print("Structure du modèle:")
print(model)
print("nForme d'entrée :", input_ids.shape)
print("Forme de sortie :", output.shape) # (8, 2)
Exemple 5 : LSTM empilé multicouche
Réseau LSTM profond :
Exemple
import torch.nn as nn
# LSTM empilé à 4 couches avec dropout
deep_lstm = nn.LSTM(
input_size=256,
hidden_size=512,
num_layers=4,
batch_first=True,
dropout=0.4 # Dropout entre les couches
)
input_tensor = torch.randn(2, 20, 256)
output, (h_n, c_n) = deep_lstm(input_tensor)
print("Forme de sortie du LSTM à 4 couches :", output.shape)
print("Forme de l'état caché (4 couches) :", h_n.shape)
print("Forme de l'état de la cellule (4 couches) :", c_n.shape)
Concept des portes LSTM
Le LSTM contrôle le flux d'informations à travers trois portes :
- Porte d'oubli: Détermine la quantité d'informations de l'étape temporelle précédente à conserver
- Porte d'entrée: Détermine la quantité de nouvelles informations à ajouter
- Porte de sortie: Détermine la quantité d'informations à émettre en sortie
FAQ
Q1 : Que signifie batch_first=True ?
La première dimension des tenseurs d'entrée et de sortie est batch_size. Si False, la première dimension est la longueur de la séquence.
Q2 : Quand faut-il utiliser un LSTM bidirectionnel ?
Les tâches qui nécessitent un contexte bidirectionnel, comme l'étiquetage de séquences et l'analyse des sentiments. La traduction automatique utilise souvent l'architecture encodeur-décodeur.
Q3 : Comment choisir la taille de la couche cachée ?
Généralement 128-512, ajustée selon la complexité de la tâche et le volume de données. Trop petite conduit au sous-apprentissage, trop grande au surapprentissage.
Cas d'utilisation
nn.LSTMLes principaux scénarios d'application incluent :
- Traitement du langage naturel: Classification de texte, reconnaissance d'entités nommées
- Prédiction de séries temporelles: Prédiction boursière, reconnaissance vocale
- Tâches séquence à séquence: Traduction automatique, génération de texte
Astuce : Lors de l'utilisation de bidirectional=True, la dimension de sortie devient hidden_size * 2.
Autres extensions