Gensim doc2vec 300-мерный вектор подается в кераты, модель lstm не работает. Потери не уменьшаются - PullRequest
0 голосов
/ 24 сентября 2018

Это мой фрагмент кода:

model=keras.Sequential()
model.add(keras.layers.LSTM(28,input_shape=(300,1),return_sequences=True))
model.add(keras.layers.Dropout(0.4))
model.add(keras.layers.LSTM(14))
model.add(keras.layers.Dropout(0.5))
model.add(keras.layers.Dense(2,activation="softmax"))
sgd=keras.optimizers.SGD(lr=0.001)
model.compile(optimizer=sgd,loss=keras.losses.sparse_categorical_crossentropy)
model.fit(trainData,labeledData.sentiment,epochs=20,batch_size=3000)

форма trainData [batch_size, 300,1], когда я начинаю тренировать эту модель, потери не снижаются.

Эпоха 1/ 20 25000/25000 [=====================================] - 2s 89us / step - потеря: 0.6927 Epoch 2/2025000/25000 [==============================] - 0s 8us / шаг - потеря: 0.6928 Epoch 3/20 25000 /25000 [==============================] - 0s 8us / шаг - потеря: 0.6928 Epoch 4/20 25000/25000 [==============================] - 0s 8us / шаг - потеря: 0.6928 Epoch 5/20 25000/25000 [==============================] - 0s 8us / step - потеря: 0.6928 Epoch 6/20 25000/25000 [==============================] - 0s 8us / step - потеря: 0.6926

что мне не хватает?

1 Ответ

0 голосов
/ 24 сентября 2018

Как обсуждалось в комментариях, проблема заключается в большом размере пакета и, возможно, также в оптимизаторе, используемом для обучения.

Трудно определить точную причину, по которой ваш алгоритм не сделал этого.сходятся с текущими настройками, но это можно аргументировать следующим образом:

Большие размеры пакетов имеют более медленную конвергенцию.

Неудобно, обучение с большими размерами пакетов в некоторых случаях фактически замедляетсяваше обучение.Причина этого чисто умозрительная и зависит от точного характера и распространения ваших данных.Однако, как правило, меньший размер пакета означает более частые обновления.Если все ваши расчетные градиенты указывают в одном и том же направлении, более частые обновления приведут к более быстрой конвергенции.Хорошая практика - иметь размер пакета, который никогда больше 1000. В большинстве сценариев 128 - это хорошее эмпирическое правило и хороший компромисс между преимуществом скорости в больших партиях и хорошими свойствами сходимостименьших размеров партии.Обратите внимание, что это имеет смысл только в тех случаях, когда у вас много обучающих данных.

Также обратите внимание, что теоретически градиенты нескольких примеров в таком большом параметре могут «усредняться», то есть большой размер пакета будет иметь толькоочень маленький и нечеткий градиент.Наличие меньшего количества образцов в мини-партии уменьшит этот шанс, хотя это увеличивает риск "пойти в неправильном направлении" (то есть иметь градиент, который указывает на противоположный directin).

SGD - хорошая отправная точка, но существует несколько оптимизаций.

Одним из таких «более умных» вариантов является предложенный метод ADAM.Об этом есть весьма цитируемая статья , которая может дать вам смутное представление о том, что происходит под капотом.По сути, SGD - очень наивное решение, которое не имеет каких-либо специальных предположений или встроенных оптимизаций.(Из того, что я знаю, ADAM, например, использует производные первого порядка)

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

Например, вы уже установили скорость обучения на разумное значение (0,001);лично я обычно получаю значения от 0,001 до 0,01 и, возможно, использую затухание скорости обучения с течением времени, если у меня большая скорость обучения.

...