web-dev-qa-db-ja.com

LSTMネットワークのパラメーター数を計算する方法は?

LSTMネットワークのパラメーターの総数を計算する方法はありますか?.

私は例を見つけましたが、 this がどれほど正しいか、またはそれを正しく理解したかどうかわかりません。

たとえば、次の例を考えてみましょう:-

_from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
from keras.layers import Embedding
from keras.layers import LSTM
model = Sequential()
model.add(LSTM(256, input_dim=4096, input_length=16))
model.summary()
_

出力

_____________________________________________________________________________________________________
Layer (type)                       Output Shape        Param #     Connected to                     
====================================================================================================
lstm_1 (LSTM)                      (None, 256)         4457472     lstm_input_1[0][0]               
====================================================================================================
Total params: 4457472
____________________________________________________________________________________________________
_

私の理解によれば、nは入力ベクトルの長さです。そしてmはタイムステップの数です。この例では、隠れ層の数を1と見なしています。

したがって、私の例では 投稿4(nm+n^2)の式に従って_m=16_; _n=4096_; _num_of_units=256_

_4*((4096*16)+(4096*4096))*256 = 17246978048
_

なぜそのような違いがあるのですか?例を誤解しましたか、それとも式が間違っていましたか?

18
Arsenal Fanatic

いいえ-KerasのLSTMレイヤーのパラメーターの数は次と等しくなります:

params = 4 * ((size_of_input + 1) * size_of_output + size_of_output^2)

追加1はバイアス項に由来します。したがって、nは入力のサイズ(バイアス項によって増加)であり、mはLSTM層の出力のサイズです。

最後に:

4 * (4097 * 256 + 256^2) = 4457472
26
Marcin Możejko

enter image description hereこの投稿経由の画像

num_params = [(num_units + input_dim + 1) * num_units] * 4

num_units + input_dim:concat [h(t-1)、x(t)]

+ 1:バイアス

* 4:4つのニューラルネットワークレイヤーがあります(黄色のボックス){W_forget、W_input、W_output、W_cell}

model.add(LSTM(units=256, input_dim=4096, input_length=16))

[(256 + 4096 + 1)* 256] * 4 = 4457472

PS:num_units = num_hidden_​​units = output_dims

14
FelixHo

@ JohnStrong の式の拡張:

4は、3ゲート(読み取り/書き込み/フロジェット)と-4番目- セル状態(同じ非表示状態内)。 (これらは、特定の隠された状態ベクトルに沿ったタイムステップ間で共有されます)

4 * lstm_hidden_state_size * (lstm_inputs_size + bias_variable + lstm_outputs_size) 

lSTM出力(y)はアプローチによってh(非表示の状態)なので、追加の投影なしで、LSTM出力の場合、持ってる :

lstm_hidden_state_size = lstm_outputs_size 

それがdだとしましょう:

d = lstm_hidden_state_size = lstm_outputs_size 

その後

params = 4 * d * ((lstm_inputs_size + 1) + d) = 4 * ((lstm_inputs_size + 1) * d + d^2)
7
Elena Viter

LSTM方程式(deeplearning.ai Coursera経由)

enter image description here

  • 方程式から明らかなように、6つの方程式すべての最終的な次元は同じであり、最終的な次元は必ずa(t)の次元と等しくなければなりません。

  • これらの6つの方程式のうち、パラメーターの数に寄与する方程式は4つだけであり、その方程式を見ると、4つの方程式すべてが対称であると推定できます。したがって、1つの方程式のパラメータ数がわかった場合は、4を掛けて、パラメータの総数を知ることができます。

  • 1つの重要な点は、パラメーターの総数はタイムステップ全体で同じ「W」と「b」が共有されるため、タイムステップ(またはinput_length)に依存しないことです。

  • 仮定すると、ゲート用の層が1つしかないLSTMセルのインサイダー(Kerasの場合と同様)。

  • 方程式1を取り、関連付けましょう。レイヤー内のニューロンの数をnとし、xの次元数をmとします(例の数と時間を含みません-手順)。したがって、forget gateの次元もnになります。これで、ANNと同様に、「Wf」の次元はn *(n + m)になり、「bf」の次元はnになります。したがって、1つの方程式のパラメーターの総数は[{n *(n + m)} + n]になります。したがって、パラメーターの総数は4 * [{n *(n + m)} + n]になります。ブラケットを開き、>4 *(nm + n2 + n)

  • だから、あなたの価値観に従って。これを式に入力すると、次のようになります。->(n = 256、m = 4096)、パラメータの総数は4 *((256 * 256)+(256 * 4096)+(256))= 4 *(1114368)= 4457472。
  • 3
    Kenpachi Zaraki

    単純なRNNから始めれば、理解しやすいと思います。

    4つの単位があり(ネットワーク内の...を無視し、表示されている単位のみに集中してください)、入力サイズ(次元数)が3であると仮定します。

    enter image description here

    重みの数は、反復接続の場合は28 = 16(_num_units * num_units_)+入力の場合は12(_input_dim * num_units_)です。バイアスの数は単に_num_units_です。

    再帰性とは、各ニューロンの出力がネットワーク全体にフィードバックされることを意味します。そのため、時間順に展開すると、2つの密な層のように見えます。

    enter image description here

    これにより、繰り返し部分に_num_units * num_units_の重みがある理由が明らかになります。

    この単純なRNNのパラメーターの数は32 = 4 * 4 + 3 * 4 + 4であり、_num_units * num_units + input_dim * num_units + num_units_またはnum_units * (num_units + input_dim + 1)として表すことができます

    ここで、LSTMの場合、これらのパラメーターの数を4で乗算する必要があります。これは、各ユニット内のサブパラメーターの数であり、@ FelixHoによる回答でうまく説明されているためです。

    3
    tromgy