pytorch中的num_layers = 2的1个LSTM和2个LSTM之间的差异

use*_*311 8 deep-learning lstm recurrent-neural-network pytorch

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

如果我创建一个

nn.LSTM(input_size, hidden_size, num_layers) 
Run Code Online (Sandbox Code Playgroud)

其中hidden_​​size = 4和num_layers = 2,我想我将拥有一个类似的架构:

op0    op1 ....
LSTM -> LSTM -> h3
LSTM -> LSTM -> h2
LSTM -> LSTM -> h1
LSTM -> LSTM -> h0
x0     x1 .....
Run Code Online (Sandbox Code Playgroud)

如果我做类似的事情

nn.LSTM(input_size, hidden_size, 1)
nn.LSTM(input_size, hidden_size, 1)
Run Code Online (Sandbox Code Playgroud)

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

Was*_*mad 11

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

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

nn.LSTM(input_size, hidden_size, 2)
Run Code Online (Sandbox Code Playgroud)

nn.Sequential(OrderedDict([
    ('LSTM1', nn.LSTM(input_size, hidden_size, 1),
    ('LSTM2', nn.LSTM(hidden_size, hidden_size, 1)
]))
Run Code Online (Sandbox Code Playgroud)

在这里,输入被输入到LSTM的最低层,然后最低层的输出被转发到下一层,依此类推。请注意,最低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))
Run Code Online (Sandbox Code Playgroud)

人们有时使用上述方法的原因是,如果使用前两种方法创建堆叠的LSTM,则无法获取每个单独层的隐藏状态。看看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
Run Code Online (Sandbox Code Playgroud)

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

  • 只是想知道您是否可以澄清“输出”一词?它也包括单元状态还是只是隐藏状态? (2认同)