LSTM (Long Short-Term Memory) — разновидность рекуррентной нейронной сети, предназначенная для эффективного запоминания долгосрочных зависимостей в последовательных данных. В основе LSTM лежат специализированные ячейки с тремя ключевыми вентилями: входным, забывающим и выходным. Эти вентили управляют потоком информации, предотвращая затухание или взрыв градиентов при обучении на длинных последовательностях.
В библиотеке Synaptic LSTM реализованы как отдельные слои, которые могут быть интегрированы в произвольные архитектуры, включая многослойные рекуррентные сети.
Ячейка LSTM хранит состояние c_t, которое представляет собой внутреннюю память сети. Состояние ячейки обновляется с каждым шагом последовательности и регулируется через три вентиля:
Формально для временного шага (t) эти операции выглядят следующим образом:
Забывающий вентиль: [ f_t = (W_f + b_f)]
Входной вентиль: [ i_t = (W_i + b_i)] [ *t = (W_C + b_C)]
Обновление состояния ячейки: [ C_t = f_t * C_{t-1} + i_t * _t]
Выходной вентиль: [ o_t = (W_o + b_o)] [ h_t = o_t * (C_t)]
Здесь () — сигмоидная функция активации, () — гиперболический тангенс, (h_t) — скрытое состояние, которое передаётся на следующий шаг и на выход сети.
В Synaptic LSTM реализован через класс Layer с
предопределёнными связями и функциями активации. Конфигурация LSTM слоя
включает количество входных нейронов, количество скрытых нейронов и тип
используемой функции активации для вентилей.
Пример создания слоя LSTM:
const synaptic = require('synaptic');
const { Layer, Network } = synaptic;
let inputLayer = new Layer(5); // 5 входных признаков
let lstmLayer = new Layer(10); // 10 нейронов LSTM
let outputLayer = new Layer(2); // 2 выхода
inputLayer.project(lstmLayer);
lstmLayer.project(outputLayer);
let myNetwork = new Network({
input: inputLayer,
hidden: [lstmLayer],
output: outputLayer
});
Каждая LSTM ячейка в Synaptic автоматически включает управление всеми тремя вентилями. При обучении с помощью backpropagation through time (BPTT) веса этих вентилей обновляются, позволяя сети оптимально запоминать и забывать информацию.
В Synaptic нет прямой необходимости вручную задавать веса каждого
вентиля, но возможно программно модифицировать веса через объект
connections, если требуется кастомизация.
LSTM слоями удобно обрабатывать временные ряды, текст и аудио. Каждый входной вектор подаётся поэтапно:
let sequence = [
[0, 1, 0, 1, 0],
[1, 0, 1, 0, 1],
[0, 0, 1, 1, 0]
];
sequence.forEach(input => {
myNetwork.activate(input);
});
В этом случае состояние c_t автоматически обновляется на каждом шаге, а скрытое состояние h_t используется для прогнозирования следующего шага или классификации последовательности.
Layer и Network.train с
функцией ошибки и оптимизацией градиентов.tanh и
sigmoid обеспечивает плавность градиентов и предотвращает
взрывы или исчезновение сигналов.