Gated Recurrent Unit (GRU) — это разновидность рекуррентной нейронной сети (RNN), разработанная для решения проблемы затухающего градиента и улучшения способности сети к долгосрочному запоминанию. GRU сочетает в себе простоту архитектуры с эффективной обработкой последовательных данных, таких как текст, временные ряды и сигналы.
В библиотеке Synaptic GRU реализуется через комбинацию стандартных нейронных слоёв с рекуррентными связями и управляющими вратами. Основными компонентами GRU являются:
Эти элементы обеспечивают динамическое управление потоками информации между временными шагами.
Update Gate определяет, сколько информации из предыдущего состояния должно быть перенесено в текущее. Формула для обновления состояния выглядит так:
[ z_t = (W_z x_t + U_z h_{t-1})]
где:
Update Gate решает, какие части предыдущей информации сохранить, а какие заменить новой.
Reset Gate контролирует степень “забывания” предыдущего состояния при вычислении кандидатного значения. Вычисляется по формуле:
[ r_t = (W_r x_t + U_r h_{t-1})]
Reset Gate позволяет сети игнорировать неактуальную информацию и предотвращает накопление устаревших данных в скрытых состояниях.
Кандидатное состояние ( _t ) представляет собой потенциальное новое скрытое состояние, которое может быть использовано после применения Update Gate:
[ t = (W x_t + U (r_t h{t-1}))]
где () обозначает поэлементное умножение. Reset Gate модифицирует предыдущие состояния перед их объединением с текущим входом.
Итоговое скрытое состояние на шаге (t) вычисляется через комбинацию предыдущего состояния и кандидатного значения:
[ h_t = (1 - z_t) h_{t-1} + z_t _t]
Эта формула обеспечивает плавное обновление скрытого состояния и позволяет GRU эффективно запоминать длинные последовательности.
В Synaptic нет встроенного класса GRU по умолчанию, но его можно
реализовать, используя базовые нейронные компоненты: Layer,
Neuron и рекуррентные соединения.
Layer(inputSize)Layer(outputSize)const { Layer, Network, Trainer } = require('synaptic');
const inputLayer = new Layer(inputSize);
const updateGateLayer = new Layer(hiddenSize);
const resetGateLayer = new Layer(hiddenSize);
const candidateLayer = new Layer(hiddenSize);
const outputLayer = new Layer(outputSize);
// Рекуррентные связи
candidateLayer.project(candidateLayer);
updateGateLayer.project(candidateLayer);
resetGateLayer.project(candidateLayer);
// Соединение с выходом
candidateLayer.project(outputLayer);
// Построение сети
const gruNetwork = new Network({
input: inputLayer,
hidden: [updateGateLayer, resetGateLayer, candidateLayer],
output: outputLayer
});
Этот пример иллюстрирует базовую архитектуру GRU в Synaptic. Реализация по шагам временной динамики требует ручного обновления скрытых состояний через цикл обучения по временным шагам.
Обучение рекуррентных сетей с GRU в Synaptic осуществляется с помощью
Trainer и стандартного алгоритма обратного распространения
через время (BPTT):
GRU часто используется в задачах обработки естественного языка, генерации текста, предсказания временных рядов и классификации последовательностей.
GRU в Synaptic предоставляет гибкость для создания кастомных рекуррентных моделей, позволяя реализовать сложные архитектуры без необходимости писать низкоуровневый код на чистом TensorFlow или PyTorch.