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
_
なぜそのような違いがあるのですか?例を誤解しましたか、それとも式が間違っていましたか?
いいえ-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
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
@ 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)
LSTM方程式(deeplearning.ai Coursera経由)
単純なRNNから始めれば、理解しやすいと思います。
4つの単位があり(ネットワーク内の...を無視し、表示されている単位のみに集中してください)、入力サイズ(次元数)が3であると仮定します。
重みの数は、反復接続の場合は28 = 16(_num_units * num_units
_)+入力の場合は12(_input_dim * num_units
_)です。バイアスの数は単に_num_units
_です。
再帰性とは、各ニューロンの出力がネットワーク全体にフィードバックされることを意味します。そのため、時間順に展開すると、2つの密な層のように見えます。
これにより、繰り返し部分に_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による回答でうまく説明されているためです。