Добавление функций к модели временных рядов LSTM

43

немного читал о LSTM и их использовании для временных рядов, и это было интересно, но в то же время сложно. У меня возникли трудности с пониманием - это подход к добавлению дополнительных функций в список временных рядов. Предположим, у вас есть такой набор данных:

т-3, Т-2, Т-1, выход

Теперь предположим, что вы знаете, что у вас есть функция, которая влияет на вывод, но это не обязательно функция временного ряда, скажем, погода на улице. Это то, что вы можете просто добавить, и LSTM сможет различить, что является аспектом временного ряда, а что нет?

Rjay155
источник
Мне нравится твой вопрос. Тем не менее, вы можете уточнить, как эта особенность не временных рядов влияет на результат в момент времени t, основываясь на знании предмета.
ГорацийT

Ответы:

40

Для RNN (например, LSTM и GRU) вход уровня представляет собой список временных шагов, и каждый временной шаг является тензором признаков. Это означает, что вы можете иметь входной тензор, подобный этому (в нотации Pythonic):

# Input tensor to RNN
[
    # Timestep 1
    [ temperature_in_paris, value_of_nasdaq, unemployment_rate ],
    # Timestep 2
    [ temperature_in_paris, value_of_nasdaq, unemployment_rate ],
    # Timestep 3
    [ temperature_in_paris, value_of_nasdaq, unemployment_rate ],
    ...
]

Таким образом, вы можете иметь несколько функций на каждом временном шаге. На мой взгляд, погода - это особенность временных рядов: там, где я живу, это зависит от времени. Поэтому было бы разумно кодировать информацию о погоде в качестве одной из ваших функций на каждом временном шаге (с соответствующей кодировкой, например, облачно = 0, солнечно = 1 и т. Д.).

Если у вас есть данные, не относящиеся к временным рядам, то, тем не менее, не имеет смысла передавать их через LSTM. Может быть, LSTM будет работать в любом случае, но даже если это произойдет, это, вероятно, будет происходить за счет большей потери / меньшей точности за время обучения.

В качестве альтернативы, вы можете ввести такого рода «дополнительную» информацию в вашу модель вне LSTM с помощью дополнительных слоев. Вы могли бы иметь поток данных как это:

TIME_SERIES_INPUT ------> LSTM -------\
                                       *---> MERGE ---> [more processing]
AUXILIARY_INPUTS --> [do something] --/

Таким образом, вы должны объединить свои вспомогательные входы с выходами LSTM и продолжить свою сеть оттуда. Теперь ваша модель просто мульти-входная.

Например, предположим, что в вашем конкретном приложении вы сохраняете только последний вывод выходной последовательности LSTM. Допустим, это вектор длины 10. Ваш вспомогательный вход может быть вашей закодированной погодой (так что скаляр). Ваш слой слияния может просто добавить вспомогательную информацию о погоде в конец выходного вектора LSTM, чтобы получить один вектор длины 11. Но вам не нужно просто сохранять последний временной выход LSTM: если LSTM выдает 100 временных шагов, каждый Имея 10 векторов функций, вы по-прежнему можете использовать вспомогательную информацию о погоде, в результате чего получается 100 временных шагов, каждый из которых состоит из вектора из 11 точек данных.

Документация Keras о его функциональном API имеет хороший обзор этого.

В других случаях, как указывает @horaceT, вы можете использовать LSTM для невременных данных. Например, предсказать погоду завтрашнего дня, учитывая местоположение. В этом случае вот три предложения, каждое из которых имеет положительные / отрицательные стороны:

  1. Сделайте, чтобы первый временной шаг содержал ваши кондиционирующие данные, так как он эффективно «установит» внутреннее / скрытое состояние вашего RNN. Честно говоря, я бы не стал этого делать по нескольким причинам: ваши данные для согласования должны иметь ту же форму, что и остальные ваши функции, затруднять создание RNN с отслеживанием состояния (с точки зрения того, что вы действительно должны следить за тем, как вы передаете данные в сеть), сеть может «забыть» данные согласования за достаточное время (например, длинные обучающие последовательности или длинные последовательности предсказания) и т. д.

  2. Включите данные как часть самих временных данных. Таким образом, каждый вектор признаков на определенном временном шаге включает «в основном» данные временного ряда, но затем к концу каждого вектора признаков добавляются данные согласования. Научится ли сеть распознавать это? Возможно, но даже тогда вы создаете более сложную задачу обучения, загрязняя данные последовательности непоследовательной информацией. Так что я бы тоже не одобрял это.

  3. Вероятно, лучшим подходом было бы непосредственное влияние на скрытое состояние RNN в нулевой момент времени. Это подход, принятый Карпатами и Фей-Фей, а также Виньялсом и соавт . Вот как это работает:

    1. Для каждой обучающей выборки возьмите переменные условия .x
    2. Преобразуйте / измените ваши переменные условия с помощью аффинного преобразования, чтобы привести его в правильную форму как внутреннее состояние RNN: (эти и являются обучаемыми весами). Вы можете получить его с плотным слоем в керасе.v=Wx+bWb
    3. Для самого первого временного шага добавьте к скрытому состоянию RNN при расчете его значения.v

    Этот подход является наиболее «теоретически» правильным, так как он должным образом обуславливает RNN на ваших невременных входных данных, естественным образом решает проблему формы, а также избегает загрязнения временных интервалов входных данных дополнительной, не временной информацией. Недостатком является то, что этот подход часто требует управления вашей архитектурой на уровне графов, поэтому если вы используете абстракцию более высокого уровня, такую ​​как Keras, вам будет сложно реализовать ее, если вы не добавите свой собственный тип слоя.

Адам Сипневски
источник
1
Хорошее предложение, но что, если выходные данные LSTM имеют структурную зависимость от предиктора не временных рядов.
horaceT
Не могли бы вы привести пример?
Адам Сипневски,
6
Хорошо, вот очень искусственный пример. Допустим, вы пытаетесь предсказать погоду в момент времени t на основе наблюдений за последние n временных шагов. Погода зависит от того, в какой части мира вы находитесь. Если в северном полушарии лето, то в южном полушарии зима. Таким образом, этот фактор север / юг должен быть принят во внимание. Можете ли вы включить его в LSTM?
horaceT
1
Отличный вопрос! Я внес правки для решения этой проблемы.
Адам Сипневски,
Спасибо за правки и две ссылки. Довольно полезно
horaceT
2

Основываясь на всех хороших ответах этой темы, я написал библиотеку для условий на вспомогательных входах. Он абстрагирует всю сложность и был разработан, чтобы быть максимально удобным для пользователя:

https://github.com/philipperemy/cond_rnn/ (тензор потока)

Надеюсь, это поможет!

Филипп Реми
источник
0

В керасе есть функция LSTM reset_states(states).

Однако параметром состояний является конкатенация двух состояний: скрытого состояния h и состояния ячейки.

States = [h, c]

было бы интересно узнать, следует ли вам инициализировать hили в cсоответствии с подходами в вышеупомянутых работах.

user2614596
источник
0

Вероятно, это не самый эффективный способ, но статические переменные могут быть повторены с использованием длительности временных рядов tf.tile().

двойной д
источник