Как рассчитать количество параметров сети LSTM?


Существует ли способ вычисления общего числа параметров в сети LSTM.

Я нашел пример, но я не уверен, насколько правильно это или если я правильно понял его.

Для примера рассмотрим следующий пример:-

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
Почему существует такая разница? Я неправильно понял пример или формула была неправильной ?
3 7

3 ответа:

No-число параметров слоя LSTM в Керасе равно:

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

Дополнительный 1 исходит из терминов смещения. Таким образом, n - это размер входного сигнала (увеличенный на Коэффициент смещения), а m - размер выходного сигнала слоя LSTM.

Итак, наконец:

4 * (4097 * 256 + 256^2) = 4457472

Расширение формулы для @JohnStrong :

4 это означает, что у нас есть различные переменные веса и смещения для 3-го элемента (чтение / запись / froget) и - 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)

Введите описание изображения здесь Изображение через этот пост

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