私はディープラーニングが初めてで、現在は言語モデリングに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)
ネットワークアーキテクチャは上記のとおりです。私が間違っている?はいの場合、これら2つの違いは何ですか?
多層LSTMは、スタックされたLSTMとしてよく知られており、LSTMの複数の層が互いに積み重ねられています。
あなたの理解は正しいです。スタックLSTMの次の2つの定義は同じです。
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))
人々が上記のアプローチを使用する理由は、最初の2つのアプローチを使用してスタック型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
最後に、outputs
には、個々のLSTM層のすべての非表示状態が含まれます。