num_layers = 2 の 1 LSTM と pytorch の 2 LSTM の違い 質問する

num_layers = 2 の 1 LSTM と pytorch の 2 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)

ネットワーク アーキテクチャは上記のようになると思います。私は間違っていますか? もし間違っているなら、これら 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 レイヤーのすべての非表示状態が含まれます。

おすすめ記事