Keras Lstm прогнозирует следующий элемент, принимая целые последовательности или скользящее окно. Будет ли скользящему окну нужен LSTM с сохранением состояния?

#python #keras #lstm #language-model #lstm-stateful

#python #keras #lstm #языковая модель #lstm-с сохранением состояния

Вопрос:

У меня есть проблема с предсказанием последовательности, в которой, учитывая последние n элементы в последовательности, мне нужно предсказать следующий элемент.

У меня более 2 миллионов последовательностей, каждая из которых имеет different timesteps ( length of sequence ) , например, некоторые всего 5, а некоторые от 50/60/100/200 до 500.

     seq_inputs = [
    ["AA1", "BB3", "CC4",…,"DD5"], #length/timeteps 5
    ["FF1", "DD3", "FF6","KK8","AA5", "CC8",…, "AA2"]   #length/timeteps 50
   ["AA2", "CC8", "CC11","DD3", "FF6","AA1", "BB3",……,”DD11”]#length/timesteps 200
    ..
    ..
    ] # there are 2million   of them 
  

Для прогнозирования следующего элемента в последовательности я trim использую последовательности до 60 максимальной длины post/pre padding и просто беру последний элемент всех последовательностей

например, X будут

 [[0,0,0,….,'AA1', 'BB3', 'CC4'],#lenght 60
 [0,0,0,….,'FF1', 'DD3', 'FF6', 'KK8', 'AA5', 'CC8'],#lenght 60
 [0,0,0,….,'AA2', 'CC8', 'CC11', 'DD3', 'FF6', 'AA1', 'BB3']#lenght 60
 ....
 ]
  

и y — последний элемент

 ['DD5', 'AA2', 'DD11',...]
  

Сначала я обозначаю их и преобразую в числовую форму, используя keras tokenizer.text_to_sequence() и изменяя их до 60 временных шагов и одной функции для каждой последовательности:**

 X = [
    [[0],[0],[0],[0],[1], ..., [10], [200], [5], [3], [90] ],
    [[0],[0],[0],[0],[95],...,  [15], [4],[11],[78], [43]]
    ..
    ..
    ] 
y = [40,3, ... , ... ]
  

Я использую LSTM с внедрением, как показано ниже

 model = Sequential()
model.add(Embedding(vocabulary_size, 32, input_length=seq_len)) #seq_length
model.add(LSTM(80,return_sequences=True))
..
..
model.fit(train_inputs,train_targets,epochs=50,verbose=1,batch_size=32)
  

Для моей проблемы прогнозирования следующего элемента в последовательности, должен ли этот подход (обрезать последовательности до максимальной длины 60 с добавлением post / pre и просто использовать последний элемент в качестве целевого) хорош?
В качестве цели будет разный временной шаг для каждого, например, 5-го, 50-го, 200-го и так далее, В моем примере.

Должен ли я делать каждую последовательность n-грамм / скользящее окно? Например, для этой первой последовательности моего набора данных

    ["AA1", "BB3", "CC4",…,"DD5"]
  

Скользящее окно из 5, первый пример будет преобразован в

 seq_inputs = [
   [0,0,0,0,"AA1"]
   [0,0,0,"AA1", "BB3"]
   [0,0,"AA1", "BB3","CC4"],
…,
... 
] 
  

И аналогично другие также будут преобразованы в скользящие окна.

Чтобы еще раз обобщить проблему и вопросы:

При текущем подходе, принимая последний элемент как y , я поражен точностью проверки 30, но меня беспокоит не производительность, а то, правильно ли я все делаю. Итак, нужны рекомендации по следующим

  1. Поскольку мне нужно предсказать следующий элемент в последовательности, правильно ли использовать последний элемент в качестве вывода для каждой последовательности?
  2. Поскольку моя длина ввода варьируется (от 5 до 500), и я ограничиваю ее 60 временными шагами, должен ли я увеличить или уменьшить ее?
  3. Вместо того, чтобы брать всю последовательность, я должен использовать подход со скользящим окном, как я поделился?
  4. Нужно ли мне иметь LSTM с сохранением состояния в случае скользящих окон?

Комментарии:

1. Привет @A.B! Вы смогли это выяснить?

2. @Arwen, в моем случае я попробовал оба, и скользящее окно было перегружено. Итак, я в конечном итоге использую взятие последних N токенов.