Я тренирую LSTM для прогнозирования временных рядов. Мне нужно не только предсказать следующий шаг, но и серию шагов вперед. То есть из набора входных данных 1, 2, 3, 4
мне нужно предсказать 5, 6, 7, 8, 9
. Мой набор данных имеет следующий формат:
input label
1, 2, 3, 4 5
2, 3, 4, 5 6
Чтобы обучить его, я определяю размер окна n
, который определяет размер ввода, и размер окна m
, который определяет, сколько шагов в будущем я хочу предсказать. Итак, это то, что я делаю для одной партии:
for _ in range(m):
set hidden_state = 0
input prediction label loss
1, 2, 3, 4 -> 8 5 mse(label, prediction)
2, 3, 4, 8 -> 11 6 mse(label, prediction)
3, 4, 8, 11 -> 2 7 mse(label, prediction)
...
...
loss = mse(total_loss)
loss.backward()
[способ определения входных данных каждый раз очень важен]
Для каждого прогноза я вычисляю потери, и этот прогноз как последнее значение следующего входа. Потеря добавляется в буфер total_loss и усредняется в конце. После m
итераций я делаю обратный прогон total_loss (градиенты сохраняются для каждого прогноза и hidden_state) и перезапускаюсь с новым пакетом, устанавливая hidden_state = 0.
Смысл этого выбора заключается в том, что потеря кодирует, насколько хорошо алгоритм предсказывает весь ряд, а не только следующий временной шаг (как, если я всегда вычисляю потери для 1,2,3,4 -> 5
). Я не очень уверен, что это правильный подход, так как ввод в основном состоит из предсказаний после первого шага.
Это обычный способ обучения временных рядов? Есть ли какие-либо специфические c проблемы с этим методом?