我正在使用NMT创建在康奈尔电影对话语料库上受过训练的聊天机器人。
我的代码部分来自https://github.com/bshao001/ChatLearner和https://github.com/chiphuyen/stanford-tensorflow-tutorials/tree/master/assignments/chatbot
在训练过程中,我打印了从批处理中馈送到解码器的随机输出答案,以及我的模型预测观察到学习进度的相应答案。
我的问题:仅经过约4次训练,该模型就学会了在<\s>每个时间步输出EOS令牌()。即使训练继续进行,它也始终将其输出作为其响应(由logits的argmax确定)。该模型偶尔会偶尔输出一系列周期作为其答案。
我还在训练过程中打印了前10个logit值(不仅是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
Run Code Online (Sandbox Code Playgroud)
...
训练迭代4:
Decoder Input: <s> i guess i had it coming . let us call it settled .
<\s> <\s> <\s> <\s> <\s>
Predicted Answer: <\s> …Run Code Online (Sandbox Code Playgroud)