pytorch 中 num_layers = 2 的 1 个 LSTM 和 2 个 LSTM 之间的区别
Difference between 1 LSTM with num_layers = 2 and 2 LSTMs in 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 -> h0
x0 x1 .....
如果我做类似的事情
nn.LSTM(input_size, hidden_size, 1)
nn.LSTM(input_size, hidden_size, 1)
我认为网络架构与上面的完全一样。我错了吗?如果是,这两者有什么区别?
multi-layer 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 returns。
因此,如果您想拥有中间层的隐藏状态,则必须将每个单独的 LSTM 层声明为单个 LSTM 并通过循环 运行 来模仿 multi-layer 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 层的所有隐藏状态。
我是深度学习的新手,目前致力于使用 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)
我认为网络架构与上面的完全一样。我错了吗?如果是,这两者有什么区别?
multi-layer 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 returns。
因此,如果您想拥有中间层的隐藏状态,则必须将每个单独的 LSTM 层声明为单个 LSTM 并通过循环 运行 来模仿 multi-layer 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 层的所有隐藏状态。