私はディープラーニングの初心者で、現在は言語モデリングに 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 つの違いは何ですか?
ベストアンサー1
多層 LSTM は、複数の LSTM 層が互いに積み重ねられたスタック LSTM としてよく知られています。
あなたの理解は正しいです。次の 2 つの 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))
上記のアプローチが時々使用される理由は、最初の2つのアプローチを使用してスタックLSTMを作成すると、各レイヤーの隠れ状態を取得できないためです。LSTMPyTorch で返されます。
したがって、中間層の隠し状態が必要な場合は、各 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 レイヤーのすべての非表示状態が含まれます。