Предположим следующую одномерную последовательность:
A, B, C, Z, B, B, #, C, C, C, V, $, W, A, % ...
Письма A, B, C, ..
здесь представляют «обычные» события.
#, $, %, ...
Здесь символы обозначают «особые» события
Временной интервал между всеми событиями является неоднородным (от секунд до дней), хотя чем дальше в прошлом событие, тем меньше вероятность того, что оно повлияет на будущие события. В идеале я могу принять во внимание эти задержки явно.
Существует порядка 10000 обычных типов событий и порядка 100 специальных типов событий. Количество обычных событий, предшествующих специальному событию, варьируется, но вряд ли будет больше 100-300.
По сути, я заинтересован в поиске шаблонов в последовательности обычных событий, которые в конечном итоге будут предсказывать особые события.
Теперь вы можете подходить к этому по-разному: создание векторов признаков + стандартная классификация, изучение правил ассоциации, HMM и т. Д.
В этом случае мне интересно, как лучше всего подойдет сеть на основе LSTM. Просто было бы сделать что-то вроде персонажа Карпарти и предсказать следующее событие с учетом истории. Тогда для новой последовательности
C, Z, Q, V, V, ... , V, W
Вы можете провести его через модель и посмотреть, какое специальное событие наиболее вероятно произойдет дальше. Но это не совсем подходит.
Поскольку это временная проблема классификации, кажется, что это правильное решение - использовать временную классификацию Connectionist, как описано Алексом Грейвсом .
Однако, прежде чем вкладывать слишком много в данный момент, я ищу что-то более простое и быстрое, чтобы поэкспериментировать, чтобы понять, насколько хорошо LSTM подойдет для этого. Tensorflow увидит пример CTC в какой-то момент, но пока нет.
Итак, мои (под) вопросы:
- Учитывая вышеуказанную проблему, и я хотел бы поэкспериментировать с LSTM, стоит ли попробовать подход типа char-rnn, должен ли я прикусить пулю и разобраться с CTC, или есть лучшее место для начала.
- Как бы вы явно включили информацию о времени между событиями. Использование фиксированных часов с неактивными событиями, очевидно, работает, но кажется уродливым.
- Предполагая, что мне удалось обучить LSTM, есть ли способ проверить модель, чтобы увидеть, какие «мотивы» события она подобрала? (т. е. аналогично фильтрам в конветах)
Любой пример кода (предпочтительно Python) всегда полезен.
Изменить: Просто чтобы добавить, что в последовательности есть некоторый шум. Некоторые события можно смело игнорировать, но какие именно не всегда можно сказать заранее. Таким образом, в идеале модель (и мотивы, полученные из нее) устойчивы к этому.
Ответы:
Ваши данные кажутся просто последовательностями токенов. Попробуйте создать автоэнкодер LSTM и позвольте кодировщику узнать некоторые фиксированные представления первой части вашей последовательности и декодера, чтобы предсказать оставшиеся.
Эти представления будут вашими мотивами.
Ref:
Богданау Д., Чо К. и Бенгио Ю. (2014). Нейронный машинный перевод путем совместного обучения выравниванию и переводу. Препринт arXiv arXiv: 1409.0473.
Сривастава Н., Мансимов Е., Салахутдинов Р. (2015). Изучение видео представлений без присмотра с использованием LSTM. Препринт arXiv arXiv: 1502.04681.
источник
Наиболее важной частью является то, как вы «формулируете» проблему классификации, имея в виду, как вы представляете входные данные и что вы хотите вывести. Видя, что у вас так много разных типов событий, вы должны изучить их встраивание. Это можно сделать непосредственно, например, в Керасе. Вы можете увидеть этот примеро том, как узнать вложение непосредственно из данных. Другой подход заключается в том, чтобы заранее изучить встраивание, используя неконтролируемый подход, такой как word2vec. Однако это требует больше работы с вашей стороны, так как вам нужно придумать соответствующую задачу и обучить ее генерации встраивания. Учитывая, что у вас достаточно данных, проще (хотя и немного менее эффективно) изучить встраивание напрямую. Для вывода я не буду предсказывать все различные типы событий, а только специальные события и «фоновый класс», чтобы сохранить проблему выполнимой. Если вы действительно хотите иметь возможность предсказывать каждый отдельный класс, вам нужно использовать некоторые приемы (посмотрите, как это делает word2vec).
Относительно времени между событиями. Вы можете просто добавить это к своему LSTM в качестве дополнительного измерения (см., Например, это для примера того, как это сделать в Keras). Это было бы легко сделать и позволило бы LSTM принять во внимание разницу во времени.
Я не знаю ни одного способа визуализировать мотивы, «раскручивая» временную природу сети. Возможно, вы сможете сгенерировать некоторые мотивы, используя генеративную сеть, но, вероятно, это будет трудно интерпретировать. Один из способов изучения мотивов может состоять в том, чтобы просто найти 100000 наиболее распространенных последовательностей не специальных событий, например, длиной 20-100, ввести их в обученную модель и извлечь выход вероятности из конечного слоя softmax. Таким образом, вы можете найти последовательности, которые связаны с определенными специальными событиями. Однако трудно сказать, возможен ли этот мотивный подход / полезен, не глядя на ваши данные.
источник