Вопрос или проблема
При использовании tf.keras.layers.SimpleRNN
возникает вопрос, есть ли у SimpleRNN скрытое состояние или используется ли оно просто как выходное состояние. То есть, следует ли он формулам $h_t = \tanh(w_h\cdot h_{t-1} + w_x\cdot x_{t-1}+b_h)$, $y_t = w_o\cdot h_t + b_o$? Или же $h_t=y_t$?
Если длина входных данных равна 5, и я создаю keras.layers.SimpleRNN(1)
, почему согласно сводке всего 6 параметров. Должно быть 5 для $w_x$, 1 для $b_h$, 1 для $w_h$, и возможно 2 на выход, всего 7 или 9.
Согласно моему опыту и этому статье, кажется, что SimpleRNN
просто использует скрытое состояние как выход. Он не вычисляет отдельный выход. Это не указано явно в официальной документации.
Используя код ниже, вы можете сами убедиться, что состояние и выход всегда одинаковы.
inputs = np.random.random([2, 3, 1]).astype(np.float32)
simple_rnn = tf.keras.layers.SimpleRNN(4, return_state=True)
output, state = simple_rnn(inputs)
print(output)
print("====")
print(state)
Примечание: В Keras
у каждого SimpleRNN
есть только три различных весовых матрицы, и эти веса общие для всех входных ячеек;
Другими словами, для всех пяти ячеек в вашей сети:
\begin{align}
h_t = tanh( w_{h} h_{t-1} + w_{x} x_{t} + b_h)\ ; t= 1..5
\end{align}
Для более глубокого понимания рекуррентных сетей в Keras
, вам может быть интересно прочитать эту содержательную статью: Mohit Mayank – A practical guide to RNN and LSTM in Keras.
.
Ответ или решение
Вопрос о том, имеет ли слой SimpleRNN
в Keras
скрытое состояние или использует его в качестве выходного значения, требует глубокого понимания работы рекуррентных нейронных сетей. Основной задачей является объяснение использующихся формул и различий, если они существуют, между скрытым состоянием и выходом SimpleRNN
.
Теория
В общих чертах, рекуррентная нейронная сеть (РНС) включает в себя множество состояний, которые изменяются со временем. Основная идея заключается в том, что гхда
ы—или состояния—представляют информацию о предыдущих временных шагах, что позволяет модели "помнить" контекст из прошлого для более точных предсказаний.
В терминах SimpleRNN
написанного на Keras, скрытое состояние h_t
может быть определено формулой:
[ h_t = \tanh(wh \cdot h{t-1} + w_x \cdot x_t + b_h) ]
Простое уравнение показывает, что скрытое состояние h_t
зависит от предыдущего состояния h_{t-1}
, текущего входного вектора x_t
и их соответствующих весов и смещений. После вычисления данного скрытого состояния, оно может быть передано как следующее состояние в цепочке, таким образом, продолжая цикл обучения.
Пример
Важно понимать как выглядят вычисления в SimpleRNN
, чтобы воспользоваться всем её потенциалом. Пример написанного кода и визуализация результатов могу быть полезными для лучшего понимания данной концепции. Возьмем следующий отрывок кода:
inputs = np.random.random([2, 3, 1]).astype(np.float32)
simple_rnn = tf.keras.layers.SimpleRNN(4, return_state=True)
output, state = simple_rnn(inputs)
print(output)
print("====")
print(state)
Что вы видите на выходе? Вы заметите, что значения output
и state
идентичны. Это подтверждает, что в случае SimpleRNN
, выходное состояние h_t
совпадает с output
, т.е., нет отдельной системы для вычисления выходного значения.
Применение
Теперь, почему же количество параметров в SimpleRNN
не увеличивается при использовании множества временных шагов? Причина, по которой имеется только три различных матрицы весов в слое SimpleRNN
, заключается в том, что все веса используются рекурсивно для всех нейронов на каждом временном шаге. Это явление известно как "разделение весов".
Когда вы видите в сводке keras.layers.SimpleRNN(1)
только 6 параметров на вход длиной 5, это объясняется следущим образом:
- Матрица весов входного вектора
w_x
содержит один элемент для входа, поскольку у вас 1 нейрон и k входных особенностей, следовательно общее количество параметров равноk * 1
. - Матрица весов предыдущих состояний
w_h
содержит один элемент, поскольку есть только 1 выходной нейрон, следовательно количество параметров равно1 * 1
. - Сдвиг
b
, размер которого равен количеству нейронов—в данном случае, 1.
Таким образом, SimpleRNN
имеет скрытое состояние, которое также служит основной функцией для создания выходного состояния. Это иллюстрирует минимализм и эффективность работы сети, когда в одной структуре объединены и хранение временного контекста, и производные выходы в каждом временном шаге. Структурное понимание и правильное применение таких моделей критически важен, если вы хотите добиться высоких результатов в задачах оценки времени и предсказания временных рядов.