Как представить данные для LSTM?

У меня есть данные о последовательности, которые говорят мне, какой цвет наблюдался у нескольких субъектов в разные моменты времени. Например:

ID Time Color
A 1 Blue
A 2 Red
A 5 Red
B 3 Blue
B 6 Green
C 1 Red
C 3 Orange

Я хочу получить прогнозы для наиболее вероятного цвета для следующих 3 временных шагов, а также вероятность появления этого цвета. Например, для ID A я хотел бы знать следующие 3 элемента (время, цвет) в последовательности, а также вероятность появления цвета.

Я понимаю, что LSTM часто используются для прогнозирования этого типа последовательных данных, и что я буду вводить трехмерный массив, например

input =[ 
[[1,1], [2,2], [5,2]], #blue at t=1, red at t=2, red at t=5 for ID A
[[0,0], [3,1], [6,3]], #nothing for first entry, blue at t=3, green at t=6 for ID B
[[0,0], [1,2], [3,4]]
]
  

после сопоставления цветов с числами (Синий->1, Красный->2, Зеленый->3, Оранжевый->4и т.д.). Насколько я понимаю, по умолчанию LSTM просто предсказывает следующий элемент в каждой последовательности, например

output = [
[[7, 2]], #next item is most likely red at t=7
[[9, 3]], # next item is most likely red at t=9
[[6, 2]] 
]

Можно ли изменить вывод моего LSTM, чтобы вместо того, чтобы просто предсказывать время и цвет следующего появления, я мог получить следующие 3 раза, цвета И вероятности появления цвета? Например, такой вывод, как

output = [
[[7, 2, 0.93], [8,2, 0.79], [10,4, 0.67]], 
[[9, 2, 0.88], [11,3, 0.70], [14,3, 0.43]], 
...
]

Я пробовал искать в документации Sequential для Keras, но не уверен, что нашел что-нибудь.

Кроме того, я вижу, что для model.fit() обычно используются TrainX и TrainY, но я также не уверен, какой здесь будет мой TrainY?


person lvnwrth    schedule 24.02.2021    source источник
comment
Sequential не имеет отношения к последовательностям, это просто интерфейс для объединения слоев (лучше было бы назвать Model).   -  person runDOSrun    schedule 26.02.2021


Ответы (1)


LSTM просто предсказывает следующий элемент в каждой последовательности...

Не совсем, LSTM — это просто слой, помогающий кодировать последовательные данные. Это нисходящая задача (плотные слои и выходные слои), которые определяют, что будет предсказывать модель.

Хотя вы можете обучить модель на основе LSTM прогнозировать следующее значение в последовательности (разумно сохраняя последнюю отметку времени в качестве цели регрессии, y), в идеале вы хотели бы использовать архитектуру кодера-декодера на основе LSTM для правильного создания последовательностей из входных данных. последовательности.

введите здесь описание изображения

Это та же архитектура, которая используется для языковых моделей для создания моделей текста или машинного перевода для перевода с английского на французский.

Вы можете найти хорошее руководство по реализации этого здесь. Преимущество этой модели в том, что теперь вы можете декодировать столько временных шагов, сколько вам нужно. Таким образом, в вашем случае вы можете ввести в кодировщик дополненную последовательность цветов фиксированной длины и декодировать 3-кратные шаги.

С точки зрения подготовки данных вам придется взять каждую последовательность цветов, удалить последние 3 цвета в качестве y и дополнить остальные до фиксированной длины.

sample = [R, G, B, B, R, G, R, R, B]
X = [<start>, 0, 0, 0, 0, 0, R, G, B, B, R, G, <end>]  #Padded input sequence
y = [<start>, R, R, B, <end>]                          #Y sequence

Вы найдете необходимые шаги предварительной обработки, обучения и выводов по ссылке выше.

person Akshay Sehgal    schedule 25.02.2021
comment
Я так понимаю, если бы я хотел получить следующие 3 цвета в каждой последовательности, я бы удалил последние три наблюдаемых цвета в каждой последовательности, чтобы установить их как мой y. Когда мы дополняем, имеет ли значение, в начале или в конце? Мои последовательности имеют разную длину, поэтому некоторым потребуется больше заполнения, чем другим. например У меня может быть 8 элементов в последовательности A и 6 элементов в последовательности B. - person lvnwrth; 25.02.2021
comment
Лучше сделать предварительное заполнение, чем последующее заполнение. Причина в том, что скрытые состояния удаляются при заполнении поста. При предварительном заполнении за нулями следует фактическая последовательность, что намного лучше сохраняет представление последовательности. Я обновил свой ответ, чтобы отразить то же самое. Прочтите это для более подробной информации - person Akshay Sehgal; 26.02.2021
comment
Кроме того, вы можете дополнять и обрезать свои последовательности. Поэтому, если последовательности меньше среднего, дополните их, но для очень длинных последовательностей вы можете захотеть обрезать. - person Akshay Sehgal; 26.02.2021
comment
@AkshaySehgal Post-padding значительно более популярен, чем pre-padding (даже в учебнике, на который вы ссылаетесь, используется пост). Хотя это может быть скорее из традиции, чем из доказательств, статья, на которую вы ссылаетесь, слишком ограничена, чтобы утверждать, что одна в целом лучше другой с точки зрения точности модели (если у вас есть какие-либо другие рецензируемые исследования хорошего качества, я бы быть заинтересованным). Кроме того, вытеснение может также применяться в начале последовательности, но на практике это не проблема, поскольку мы делаем маскировку. - person runDOSrun; 26.02.2021
comment
Чтобы поддержать мое заявление о том, что пост-заполнение более популярно: TF, Keras имеет пост по умолчанию и рекомендую, CUDNN выполняет постпаддинг, а Huggingface только для Transformers поддерживает постпаддинг, поэтому я бы действительно поставил под сомнение тот факт, что предварительное заполнение более популярно. PyTorch в настоящее время даже не поддерживает предварительное заполнение. - person runDOSrun; 26.02.2021
comment
@runDOSrun, я думаю, вы ошибаетесь, пожалуйста, перечитайте статью, на которую я дал ссылку. Эта и другие статьи предполагают, что предварительное заполнение — это правильный путь. Не заполнение постов для LSTM. Я могу создать несколько ссылок для одного и того же. ссылка 1, ссылка 2, ссылка 3. - person Akshay Sehgal; 26.02.2021
comment
Что касается вашего заявления о Трансформерах, Маски обеспечивают эффективный способ различать дополненные и незаполненные части последовательности. - person Akshay Sehgal; 26.02.2021
comment
И ссылка, которую вы показываете о рекомендации TF, связана только с тем, что она позволяет вам использовать реализацию CuDNN (как это прямо упоминается после упомянутого предложения) - person Akshay Sehgal; 26.02.2021
comment
Кроме того, предварительное заполнение доказано (как в статье, на которую я ссылаюсь выше), чтобы лучше работать с RNN и LSTM, но не оказывает никакого влияния на архитектуры на основе CNN (пожалуйста, прочитайте окончательный обзор статьи) - person Akshay Sehgal; 26.02.2021
comment
@AkshaySehgal Спасибо, но ваши источники предъявляют претензии без каких-либо доказательств (SO даже возвращает это в комментариях). Цитируемая статья, в частности, похоже, не рецензируется и представляет собой очень мелкомасштабный эксперимент с одной моделью на одном наборе данных. Мне жаль, если это может показаться педантичным, но с научной точки зрения это должно быть воспроизведено в большем количестве исследований, чтобы считаться убедительным доказательством. Если мы можем согласиться или не согласиться, я высказал свою точку зрения: определенно не очевидно, что лучше, поскольку вокруг ходят разные мнения. - person runDOSrun; 26.02.2021
comment
Как вы заметили, возможно, результаты различаются в зависимости от конкретных сценариев, поэтому я понимаю, откуда вы пришли. Насколько я понимаю, также поможет, если у вас есть какие-либо источники, которые определенно показывают причину, по которой пост-заполнение лучше. - person Akshay Sehgal; 26.02.2021