pytorch 中 num_layers = 2 的 1 个 LSTM 和 2 个 LSTM 之间的区别

问题描述 投票:0回答:2

我是深度学习新手,目前正在研究使用 LSTM 进行语言建模。我正在查看 pytorch 文档并对其感到困惑。

如果我创建一个

nn.LSTM(input_size, hidden_size, num_layers) 

其中hidden_size = 4且num_layers = 2,我想我会有一个类似的架构:

op0    op1 ....
LSTM -> LSTM -> h3
LSTM -> LSTM -> h2
LSTM -> LSTM -> h1
LSTM -> LSTM -> h0
x0     x1 .....

如果我做类似的事情

nn.LSTM(input_size, hidden_size, 1)
nn.LSTM(input_size, hidden_size, 1)

我认为网络架构将与上面一模一样。我错了吗?如果是,这两者有什么区别?

deep-learning lstm recurrent-neural-network pytorch
2个回答
39
投票

多层 LSTM 更广为人知的名称是堆叠 LSTM,其中多层 LSTM 相互堆叠。

您的理解是正确的。以下两个 stacked LSTM 的定义是相同的。

nn.LSTM(input_size, hidden_size, 2)

nn.Sequential(OrderedDict([
    ('LSTM1', nn.LSTM(input_size, hidden_size, 1),
    ('LSTM2', nn.LSTM(hidden_size, hidden_size, 1)
]))

这里,输入被馈送到 LSTM 的最低层,然后最低层的输出被转发到下一层,依此类推。请注意,最低 LSTM 层的输出大小和 LSTM 层其余部分的输入大小为

hidden_size

但是,您可能已经看到人们通过以下方式定义堆叠 LSTM:

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

人们有时使用上述方法的原因是,如果使用前两种方法创建堆叠 LSTM,则无法获得每个单独层的隐藏状态。查看 PyTorch 中 LSTM 返回的内容。

因此,如果您想要获得中间层的隐藏状态,则必须将每个单独的 LSTM 层声明为单个 LSTM,并通过循环来模拟多层 LSTM 操作。例如:

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

最后,

outputs
将包含每个单独 LSTM 层的所有隐藏状态。


0
投票

为了明确上述内容(我想我也在这里问一个问题),我认为下面的代码不起作用。这是因为 LSTM 返回一对

output, (hidden, cell)
,但下一层的输入只需是
output
。因此,您需要明确地捕获它,就像在 for 循环中一样。

rnn = nn.Sequential(
  OrderedDict([
    ('rnn1', rnn1),
    ('rnn2', rnn2),
  ])
)
© www.soinside.com 2019 - 2024. All rights reserved.