Я создаю чат-бота, обученного Cornell Movie Dialogs Corpus, используя NMT.
Я основываю свой код частично на https://github.com/bshao001/ChatLearner и https://github.com/chiphuyen/stanford-tensorflow-tutorials/tree/master/assignments/chatbot
Во время обучения я печатаю случайный выходной ответ, подаваемый в декодер из пакета, и соответствующий ответ, который моя модель предсказывает, чтобы наблюдать за прогрессом обучения.
Моя проблема: всего после 4 итераций обучения модель учится выводить токен EOS (<\s>
) для каждого временного шага. Он всегда выводит это в качестве своего ответа (определяемого с использованием argmax логитов), даже когда обучение продолжается. Время от времени, редко модель выводит в качестве ответа серии периодов.
Я также распечатываю 10 основных значений логита во время обучения (а не только argmax), чтобы увидеть, возможно ли правильное слово где-то там, но, похоже, он предсказывает наиболее распространенные слова в словаре (например, i, you,?,. ). Даже эти 10 самых популярных слов не сильно меняются во время тренировки.
Я убедился, что правильно подсчитал длину входной последовательности для кодировщика и декодера, и соответственно добавил токены SOS (<s>
) и EOS (также используемые для заполнения). Я также использую маскировку при расчете потерь.
Вот пример вывода:
Итерация обучения 1:
Decoder Input: <s> sure . sure . <\s> <\s> <\s> <\s> <\s> <\s> <\s>
<\s> <\s>
Predicted Answer: wildlife bakery mentality mentality administration
administration winston winston winston magazines magazines magazines
magazines
...
Обучающая итерация 4:
Decoder Input: <s> i guess i had it coming . let us call it settled .
<\s> <\s> <\s> <\s> <\s>
Predicted Answer: <\s> <\s> <\s> <\s> <\s> <\s> <\s> <\s> <\s> <\s>
<\s> <\s> <\s> <\s> <\s> <\s> <\s> <\s>
После еще нескольких итераций он останавливается только на прогнозировании EOS (и редко на некоторых периодах)
Я не уверен, что могло вызвать эту проблему, и какое-то время застрял на этом. Любая помощь будет принята с благодарностью!
Обновление: я позволил ему тренироваться более ста тысяч итераций, и он по-прежнему выводит только EOS (и редкие периоды). Потери в обучении также не уменьшаются после нескольких итераций (с самого начала они остаются на уровне около 47).