Seq2Seq模型学习在几次迭代之后只输出EOS令牌(<\s>)

2024-09-28 21:21:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用NMT创建一个训练为Cornell Movie Dialogs Corpus的聊天机器人。在

我的代码部分基于https://github.com/bshao001/ChatLearner和{a4}

在训练过程中,我打印一个随机输出的答案,并从批次中输入解码器,以及我的模型预测的相应答案,以观察学习进度。在

我的问题:在大约4次迭代的训练之后,模型学习为每个时间步输出EOS令牌(<\s>)。即使在训练继续进行时,它也总是将其作为响应输出(使用logits的argmax确定)。偶尔,很少,模型会输出一系列周期作为其答案。在

在培训期间,我还打印了前10个logit值(不仅仅是argmax),看看是否正确的单词在那里,但它似乎在预测词汇中最常见的单词(例如I,you?, .). 即使是这10个单词在训练中也没有太大变化。在

我确保正确计算编码器和解码器的输入序列长度,并相应地添加了SOS(<s>)和EOS(也用于填充)标记。在损失计算中,我还执行了掩蔽。在

以下是输出示例:

训练:<1>

^{1}$

。。。在

训练迭代4:

^{pr2}$


再经过几次迭代,它只预测状态方程(很少有周期)

我不知道是什么导致了这个问题,我已经在这个问题上耽搁了一段时间。任何帮助将不胜感激!在

更新:我让它训练了超过十万次的迭代,它仍然只输出EOS(和偶尔的周期)。经过几次迭代后,训练损失也没有减少(从一开始就保持在47左右)


Tags: 答案代码https模型机器人corpusmovie解码器
1条回答
网友
1楼 · 发布于 2024-09-28 21:21:47

最近我还研究了seq2seq模型。 我以前遇到过你的问题,在我的例子中,我通过改变损失函数来解决它。在

你说你用面具,所以我猜你像我一样用tf.contrib.seq2seq.sequence_loss。在

我改为tf.nn.softmax_cross_entropy_with_logits,它正常工作(并且计算成本更高)。在

(编辑:05/10/2018。对不起,我需要编辑,因为我发现我的代码有一个严重的错误)

如果logitstargetsmask的形状正确,tf.contrib.seq2seq.sequence_loss可以很好地工作。 根据官方文件的定义: tf.contrib.seq2seq.sequence_loss

loss=tf.contrib.seq2seq.sequence_loss(logits=decoder_logits,
                                      targets=decoder_targets,
                                      weights=masks) 

#logits:  [batch_size, sequence_length, num_decoder_symbols]  
#targets: [batch_size, sequence_length] 
#weights: [batch_size, sequence_length] 

好吧,即使形状不符合,它仍然可以工作。但结果可能很奇怪(很多EOS垫。。。等等)。在

因为decoder_outputs和{}可能具有与所需相同的形状(在我的例子中,我的decoder_targets的形状是[sequence_length, batch_size])。 所以试着用tf.transpose来帮助你重塑张量。在

相关问题 更多 >