Как рассчитать количество параметров сети 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
Почему существует такая разница?
Не понял ли я этот пример или не был неправильным?
Ответы
Ответ 1
Нет - количество параметров слоя LSTM в Keras равно:
params = 4 * ((size_of_input + 1) * size_of_output + size_of_output^2)
Дополнительно 1
исходит из условий смещения. Таким образом, n
- это размер ввода (увеличивается на величину смещения), а m
- размер вывода слоя LSTM.
Итак, наконец:
4 * (4097 * 256 + 256^2) = 4457472
Ответ 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
Ответ 3
Расширение формулы для @JohnStrong:
4 означает, что мы имеем разные переменные веса и смещения для 3 ворот (read/write/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)
Ответ 4
Уравнения LSTM (с помощью deeplearning.ai Coursera)
![enter image description here]()
Из уравнений видно, что конечные размеры всех 6 уравнений будут одинаковыми, и конечный размер обязательно должен быть равен размеру a (t).
Из этих 6 уравнений только 4 уравнения вносят вклад в число параметров, и, глядя на уравнения, можно сделать вывод, что все 4 уравнения являются симметричными. Итак, если мы узнаем количество параметров для одного уравнения, мы можем просто умножить его на 4 и указать общее количество параметров.
Важно отметить, что общее количество параметров не зависит от временных шагов (или input_length), так как одни и те же "W" и "b" совместно используются на протяжении временного шага.
Предполагается, что инсайдер ячейки LSTM имеет только один слой для шлюза (как в Керасе).
Возьмите уравнение 1 и давайте рассмотрим. Пусть количество нейронов в слое равно n, а число размерности x равно m (не включая количество примеров и временных шагов). Следовательно, размерность забытых ворот тоже будет n. Теперь, так же как в ANN, размерность "Wf" будет n * (n + m), а размерность "bf" будет n. Следовательно, общее количество параметров для одного уравнения будет [{n * (n + m)} + n]. Следовательно, общее количество параметров будет 4 * [{n * (n + m)} + n]. Давайте откроем скобки и получим → 4 * (nm + n 2 + n).
Итак, согласно вашим ценностям. Ввод его в формулу дает: → (n = 256, m = 4096), общее количество параметров составляет 4 * ((256 * 256) + (256 * 4096) + (256)) = 4 * (1114368) = 4457472.
Ответ 5
Я думаю, что было бы легче понять, если бы мы начали с простого RNN.
Предположим, что у нас есть 4 единицы (игнорируйте... в сети и сконцентрируйтесь только на видимых единицах), а размер ввода (количество измерений) равен 3:
![enter image description here]()
Количество весов составляет 28 = 16 (num_units * num_units
) для повторяющихся соединений + 12 (input_dim * num_units
) для ввода. Количество смещений просто num_units
.
Рекуррентность означает, что каждый выход нейрона возвращается обратно во всю сеть, поэтому, если мы развернем его во временной последовательности, он будет выглядеть как два плотных слоя:
![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