Рекуррентные нейронные сети (RNN) предназначены для обработки
последовательных данных, таких как текст, временные ряды или
аудиосигналы. В TensorFlow.js они реализуются через слои
tf.layers.simpleRNN, tf.layers.lstm и
tf.layers.gru. Каждая из этих архитектур имеет свои
особенности:
Каждый слой принимает последовательность на входе и возвращает либо
полную последовательность скрытых состояний
(returnSequences: true), либо только последнее состояние
(returnSequences: false). Понимание этого поведения
критично при стековании слоёв.
Стекование рекуррентных слоёв позволяет строить более глубокие модели, где каждый слой обрабатывает выход предыдущего. Основные правила стекования:
Выход предыдущего слоя должен быть
последовательностью, чтобы следующий слой мог обрабатывать её
как вход. Для этого returnSequences предыдущего слоя должно
быть установлено в true.
const rnn1 = tf.layers.lstm({units: 128, returnSequences: true});
const rnn2 = tf.layers.lstm({units: 64, returnSequences: false});Размерность скрытого состояния (units) может
изменяться между слоями, что позволяет постепенно сжимать или
расширять представление последовательности.
Рекомендуется нормализовать данные на входе и использовать регуляризацию (dropout) для предотвращения переобучения при глубокой стековой архитектуре:
const lstmLayer = tf.layers.lstm({
units: 128,
returnSequences: true,
dropout: 0.2,
recurrentDropout: 0.2
});const model = tf.sequential();
model.add(tf.layers.lstm({
units: 128,
inputShape: [50, 10],
returnSequences: true
}));
model.add(tf.layers.lstm({
units: 64,
returnSequences: true
}));
model.add(tf.layers.lstm({
units: 32,
returnSequences: false
}));
model.add(tf.layers.dense({units: 1, activation: 'sigmoid'}));
model.compile({
optimizer: 'adam',
loss: 'binaryCrossentropy',
metrics: ['accuracy']
});
В этом примере:
tf.keras.preprocessing.sequence.pad_sequences или
собственный код), чтобы избежать переполнения памяти.relu,
sigmoid или softmax зависит от задачи.dropout
применяется к входам слоя, recurrentDropout – к
рекуррентным соединениям. Это снижает вероятность переобучения.Использование стековых рекуррентных слоёв позволяет создавать модели с богатым контекстным представлением, что значительно улучшает точность предсказаний на сложных последовательностях.