При работе с последовательными данными одной из ключевых задач является способность модели учитывать информацию, которая находится далеко во временной линии. В стандартных нейронных сетях, таких как полносвязные слои или сверточные сети, память о предыдущих состояниях отсутствует или крайне ограничена. Для решения задач, связанных с последовательностями, применяются рекуррентные нейронные сети (RNN), однако они сталкиваются с так называемой проблемой долгосрочных зависимостей (long-term dependencies).
Рекуррентная нейронная сеть вычисляет последовательность скрытых состояний (h_t) через рекуррентное соотношение:
[ h_t = f(W_{hh} h_{t-1} + W_{xh} x_t + b_h)]
где (x_t) — входной вектор на шаге (t), (W_{hh}) и (W_{xh}) — матрицы весов, (b_h) — смещение, а (f) — нелинейная функция активации (чаще всего tanh или ReLU).
При обучении с использованием алгоритма обратного распространения во времени (BPTT) градиенты ошибок распространяются через множество шагов сети. Для длинных последовательностей градиенты либо затухают (vanishing gradient), либо взрываются (exploding gradient), что делает обучение крайне нестабильным. В результате сеть теряет способность корректно учитывать события, произошедшие на десятки или сотни шагов назад.
LSTM (Long Short-Term Memory) LSTM вводит специализированные ячейки памяти и механизмы входных, выходных и забывающих гейтов. Эти гейты позволяют сети контролировать поток информации и поддерживать градиенты стабильными при длительном распространении. Формулы для LSTM:
Благодаря этому подходу градиенты могут сохраняться на десятках и сотнях шагов, что решает проблему долгосрочной памяти.
GRU (Gated Recurrent Unit) GRU — упрощённая версия LSTM, объединяющая забывающий и входной гейты в один гейт обновления, что делает модель менее ресурсоёмкой, но сохраняющей способность удерживать долгосрочные зависимости.
Использование краткосрочных контекстных окон В некоторых случаях можно разложить длинные последовательности на короткие контексты и комбинировать их через механизм внимательности (attention), что снижает необходимость прямого долгосрочного распространения градиентов.
В библиотеке Brain.js стандартная реализация RNN ограничена короткими последовательностями из-за описанных проблем. Однако Brain.js поддерживает LSTM и GRU, что позволяет:
Пример создания LSTM-сети в Brain.js:
const brain = require('brain.js');
const net = new brain.recurrent.LSTM();
const data = [
{ input: 'Привет', output: 'Здравствуйте' },
{ input: 'Как дела?', output: 'Хорошо' },
];
net.train(data, {
iterations: 2000,
learningRate: 0.01,
});
const output = net.run('Привет');
console.log(output); // Ожидаемый ответ: 'Здравствуйте'
LSTM-сеть хранит состояние между шагами ввода, что позволяет корректно реагировать на входы, появляющиеся через несколько шагов в последовательности.
Эффективная работа с LSTM и GRU в Brain.js требует внимания к подбору гиперпараметров, длине последовательностей и предобработке данных, чтобы сеть могла стабильно обучаться и извлекать долгосрочные зависимости без деградации градиентов.