Deep learning 1个LSTM(层数为2)与pytorch中2个LSTM之间的差异

Deep learning 1个LSTM(层数为2)与pytorch中2个LSTM之间的差异,deep-learning,lstm,recurrent-neural-network,pytorch,Deep Learning,Lstm,Recurrent Neural Network,Pytorch,我刚刚开始深入学习,目前正在使用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进行语言建模。我正在看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)

我认为网络架构将与上面完全相同。我错了吗?如果是,这两者之间的区别是什么?

多层LSTM更好地称为堆叠LSTM,其中多层LSTM相互堆叠

你的理解是正确的。以下两种堆叠LSTM的定义相同

nn.LSTM(input_size, hidden_size, 2)

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

但是,您可能看到人们以以下方式定义堆叠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操作。例如:

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

最后,
输出将包含每个LSTM层的所有隐藏状态。

感谢您的澄清。你知道每种方法的优缺点是什么吗?@user3828311你能就这个话题再发一个问题吗?那我就可以回答了。只是想知道你能否澄清一下“输出”这个词?它是否也包括单元格状态,还是仅仅是隐藏状态?为了澄清“最底层的输出被转发到下一层等等”,它实际上意味着上一层的隐藏状态(乘以
退出
)被作为下一层的输入,参考官方文档。
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