Потеря проверки / точность всегда достигалась при определенном пороге в LSTM

#keras #deep-learning #lstm #embedding

#keras #глубокое обучение #lstm #внедрение

Вопрос:

У меня есть проблема с предсказанием последовательности, в которой, учитывая последние m элементы (6) в последовательности, мне нужно предсказать следующий элемент. На данный момент существует N = 60 тыс. последовательностей, и для каждой последовательности n у меня есть 6 событий, и я хочу предсказать следующее (7-е в данном случае) событие. Набор данных выглядит следующим образом

 seq_inputs = [
["AA1", "BB3", "CC4","DD5","AA2", "CC8", "CC11"], #CC11 is target
["FF1", "DD3", "FF6","KK8","AA5", "CC8", "AA2"]   #AA2 will be target
..
..
] 
  

После разметки и разделения входных и целевых данных я изменил данные следующим образом (для многоступенчатого прогнозирования «один объект много к одному»)

 seq = [[[ 1],  [10],  [200],  [5],   [3], [90], ],

       [[ 95], [15], [4], [11], [78],[3],
        ],
       ...
       ...
      ... #60,000 of them
      ]
  
 targets = [40,3, ... , ... ]
  

У меня есть около 60,000 sequences и 940 unique events (vocabulary size) независимо от того, какую архитектуру я использую, моя точность проверки достигает 19% (потеря проверки 3.5) и начинает снижаться, и я не получаю результат лучше 20% по тестовым данным.

Я пробовал dropout , recurrent_dropout (до 0,2) на уровне LSTM и упростил архитектуру LSTM до очень простой, как показано ниже, но по-прежнему точность валидации не превышает 19% (я полагаю, что она превосходит). Я также попытался уменьшить размер встраивания. это самая простая модель, которую я использовал без удачи

 model = Sequential()
model.add(Embedding(vocabulary_size, 32, input_length=seq_len)) #seq_length
model.add(LSTM(40,return_sequences=True,input_shape=(6, 1),dropout=0.1, recurrent_dropout=0.1))
model.add(LSTM(20))
model.add(Dense(120,activation='relu'))
model.add(Dense(vocabulary_size, activation='softmax'))
sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
  

До этого я использовал большую сеть с 3/4-мя уровнями lstm по 40-80 устройств в каждом, также пробовал встраивать размер до 500, но производительность при проверке и тестировании была одинаковой, достигала 20%, даже если обучение достигало 90%.

Что может быть причиной отсутствия улучшения в проверке и точности тестирования за ее пределами 19-20% ?

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

1. можете ли вы поделиться набором данных?

2. @NazmulHasan К сожалению, данные конфиденциальны

3. Как вы кодируете строки? какие типы предварительной обработки вы использовали? Иногда предварительная обработка данных важнее.

4. используйте, я маркировал их с помощью keras tokenizer (например, одна последовательность выглядит следующим образом [ 1], [10], [200], [5], [3], [90] )

5. Попробуйте отделить неверно предсказанные данные и изучить их. Вы можете использовать некоторые методы предварительной обработки. Модель кажется прекрасной. После предварительной обработки данных уменьшите скорость обучения до минимальной и тренируйте свою модель до тех пор, пока она не будет соответствовать.