Je suis nouveau dans l'apprentissage en profondeur et je travaille actuellement sur l'utilisation de LSTM pour la modélisation de langage. Je regardais la documentation de Pytorch et j'étais confuse.
Si je crée un
nn.LSTM(input_size, hidden_size, num_layers)
où hidden_size = 4 et num_layers = 2, je pense que j'aurai une architecture quelque chose comme:
op0 op1 ....
LSTM -> LSTM -> h3
LSTM -> LSTM -> h2
LSTM -> LSTM -> h1
LSTM -> LSTM -> h0
x0 x1 .....
Si je fais quelque chose comme
nn.LSTM(input_size, hidden_size, 1)
nn.LSTM(input_size, hidden_size, 1)
Je pense que l'architecture du réseau ressemblera exactement à celle ci-dessus. Ai-je tort? Et si oui, quelle est la différence entre ces deux?
Le LSTM multicouche est mieux connu sous le nom de LSTM empilé où plusieurs couches de LSTM sont empilées les unes sur les autres.
Votre compréhension est correcte. Les deux définitions suivantes de LSTM empilées sont identiques.
nn.LSTM(input_size, hidden_size, 2)
et
nn.Sequential(OrderedDict([
('LSTM1', nn.LSTM(input_size, hidden_size, 1),
('LSTM2', nn.LSTM(hidden_size, hidden_size, 1)
]))
Ici, l'entrée est introduite dans la couche la plus basse de LSTM, puis la sortie de la couche la plus basse est transmise à la couche suivante et ainsi de suite. Veuillez noter que la taille de sortie de la couche LSTM la plus basse et le reste de la taille d'entrée de la couche LSTM est hidden_size
.
Cependant, vous avez peut-être vu des personnes définir LSTM empilées de la manière suivante:
rnns = nn.ModuleList()
for i in range(nlayers):
input_size = input_size if i == 0 else hidden_size
rnns.append(nn.LSTM(input_size, hidden_size, 1))
La raison pour laquelle les gens utilisent parfois l'approche ci-dessus est que si vous créez un LSTM empilé en utilisant les deux premières approches, vous ne pouvez pas obtenir les états masqués de chaque couche individuelle. Découvrez ce que LSTM retourne dans PyTorch.
Donc, si vous souhaitez avoir les états masqués de la couche intermédia, vous devez déclarer chaque couche LSTM individuelle comme un seul LSTM et exécuter une boucle pour imiter les opérations LSTM multicouches. Par exemple:
outputs = []
for i in range(nlayers):
if i != 0:
sent_variable = F.dropout(sent_variable, p=0.2, training=True)
output, hidden = rnns[i](sent_variable)
outputs.append(output)
sent_variable = output
Au final, outputs
contiendra tous les états cachés de chaque couche LSTM individuelle.