#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, но меня беспокоит не производительность, а то, правильно ли я все делаю. Итак, нужны рекомендации по следующим
- Поскольку мне нужно предсказать следующий элемент в последовательности, правильно ли использовать последний элемент в качестве вывода для каждой последовательности?
- Поскольку моя длина ввода варьируется (от 5 до 500), и я ограничиваю ее 60 временными шагами, должен ли я увеличить или уменьшить ее?
- Вместо того, чтобы брать всю последовательность, я должен использовать подход со скользящим окном, как я поделился?
- Нужно ли мне иметь LSTM с сохранением состояния в случае скользящих окон?
Комментарии:
1. Привет @A.B! Вы смогли это выяснить?
2. @Arwen, в моем случае я попробовал оба, и скользящее окно было перегружено. Итак, я в конечном итоге использую взятие последних N токенов.