我正在创建一个接受过训练的聊天机器人康奈尔电影对话语料库 https://www.cs.cornell.edu/~cristian/Cornell_Movie-Dialogs_Corpus.html using NMT https://github.com/tensorflow/nmt.
我的代码部分基于https://github.com/bshao001/ChatLearner https://github.com/bshao001/ChatLearner and https://github.com/chiphuyen/stanford-tensorflow-tutorials/tree/master/assignments/chatbot https://github.com/chiphuyen/stanford-tensorflow-tutorials/tree/master/assignments/chatbot
在训练期间,我打印从批次中馈送到解码器的随机输出答案以及我的模型预测的相应答案以观察学习进度。
我的问题:仅经过大约 4 次迭代训练后,模型就学会了输出 EOS 代币(<\s>
)对于每个时间步长。即使训练仍在继续,它也始终将其输出作为其响应(使用 logits 的 argmax 确定)。模型偶尔会输出一系列周期作为答案,但这种情况很少发生。
我还在训练期间打印前 10 个 logit 值(不仅仅是 argmax),以查看其中是否有正确的单词,但它似乎是在预测词汇中最常见的单词(例如 i、you、?、. )。即使是这前 10 个单词在训练过程中也没有太大变化。
我已确保正确计算编码器和解码器的输入序列长度,并添加了 SOS (<s>
)和 EOS(也用于填充)相应的代币。我也表演masking在损失计算中。
这是一个示例输出:
训练迭代 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(很少预测某些时期)
我不确定是什么导致了这个问题,并且已经被困在这个问题上一段时间了。任何帮助将不胜感激!
Update:我让它训练超过十万次迭代,但它仍然只输出 EOS(和偶尔的周期)。经过几次迭代后,训练损失也没有减少(从一开始就保持在 47 左右)