web-dev-qa-db-ja.com

pytorchでnum_layers = 2と2のLSTMを使用した1 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つの違いは何ですか?

11
user3828311

多層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層のすべての非表示状態が含まれます。

11
Wasi Ahmad