LSTM: обучение и обратное распространение для многошагового прогнозирования - PullRequest
0 голосов
/ 06 апреля 2020

Я тренирую 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 проблемы с этим методом?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...