web-dev-qa-db-fra.com

Différence entre 1 LSTM avec num_layers = 2 et 2 LSTM dans pytorch

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?

11
user3828311

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.

11
Wasi Ahmad