Двунаправленные рекуррентные нейронные сети (Bidirectional RNN, BiRNN) представляют собой архитектуру, в которой информация обрабатывается одновременно в двух направлениях: вперед (от начала последовательности к концу) и назад (от конца последовательности к началу). Такой подход позволяет модели учитывать контекст не только из предыдущих временных шагов, но и из будущих, что особенно важно для задач обработки последовательностей, таких как анализ текста, распознавание речи и прогнозирование временных рядов.
В стандартной RNN информация в каждый момент времени зависит только от предыдущих шагов:
[ h_t = f(W_x x_t + W_h h_{t-1} + b)]
В двунаправленной RNN создаются два скрытых состояния:
Выход на каждом шаге объединяет два состояния:
[ y_t = g(, )]
Метод объединения может быть конкатенацией, суммированием или усреднением. Конкатенация наиболее распространена, так как сохраняет всю информацию из обоих направлений.
TensorFlow.js предоставляет возможность создавать двунаправленные RNN
через слой tf.layers.bidirectional, который оборачивает
стандартные рекуррентные слои (SimpleRNN,
LSTM, GRU).
Пример создания двунаправленного LSTM:
const tf = require('@tensorflow/tfjs');
// Размерность входа: последовательность длиной 10, вектор признаков размерности 8
const inputShape = [10, 8];
// Прямой LSTM
const lstmLayer = tf.layers.lstm({
units: 16,
returnSequences: true
});
// Двунаправленный слой
const biLstmLayer = tf.layers.bidirectional({
layer: lstmLayer,
mergeMode: 'concat' // объединение состояний путем конкатенации
});
// Создание модели
const model = tf.sequential();
model.add(tf.layers.inputLayer({inputShape}));
model.add(biLstmLayer);
model.add(tf.layers.dense({units: 1, activation: 'sigmoid'}));
model.compile({
optimizer: tf.train.adam(),
loss: 'binaryCrossentropy',
metrics: ['accuracy']
});
Пояснения к параметрам:
layer — рекуррентный слой, который будет
дублироваться в двух направлениях.
mergeMode — способ объединения прямого и обратного
состояний:
'concat' — конкатенация векторных представлений.'sum' — сложение.'ave' — усреднение.'mul' — поэлементное умножение.returnSequences в рекуррентном слое определяет,
возвращать ли выход для каждого шага последовательности
(true) или только итоговое состояние (false).
Для BiRNN обычно рекомендуется true, особенно при
последующем использовании Attention или Dense слоев, работающих с
временными последовательностями.
Двунаправленные RNN особенно эффективны для:
Пример подготовки данных для текстовой BiRNN в TensorFlow.js:
const sequences = [
[1, 2, 3, 4],
[2, 3, 4, 5]
];
// Преобразование в one-hot представление
const vocabSize = 6;
const x = tf.oneHot(sequences, vocabSize);
// Размерность x: [batchSize, seqLen, vocabSize]
После этого тензор можно подавать на вход двунаправленному слою LSTM или GRU.
Для BiRNN рекомендуется:
dropout и recurrentDropout.Пример:
const biLstmLayer = tf.layers.bidirectional({
layer: tf.layers.lstm({
units: 32,
returnSequences: true,
dropout: 0.2,
recurrentDropout: 0.2
}),
mergeMode: 'concat'
});
Двунаправленные RNN в TensorFlow.js обеспечивают мощный инструмент для обработки сложных последовательностей, сохраняя гибкость и совместимость с веб- и серверными приложениями на JavaScript.