2016-12-20 35 views
0

我正在使用tensorflow seq2seq.rnn_decoder标题自动生成项目。如何提高张量流中的单词精度?

我的训练集是一套很大的标题,每个标题都是相互独立的,并且不相关。

我曾尝试两个数据格式进行训练:

F1. Use the fixed seq length in batch, and replace ‘\n’ to ‘<eos>’, and ‘<eos>’ index is 1, which training batch is like: [2,3,4,5,8,9,1,2,3,4], [88,99,11,90,1,5,6,7,8,10] 
F2. Use Variable seq length in batch, and add PAD 0 to keep the fixed length, which training batch is like: [2,3,4,5,8,9,0,0,0,0], [2,3,4,88,99,90,11,0,0,0] 

然后我做了测试的一小部分,其拥有10000个冠军,但结果让我感到困惑。

F1是做一个很好的预测在一个字,就像这样:

iphone predict 6 
samsung predict galaxy 
case predict cover 

F2是使一个长句子的良好预测,如果输入的是从句子的第一个字开始,预测多次几乎等于原来的句子。

但是,如果起始词来自句子的中间(或近端),则F2的预测非常糟糕,就像随机结果一样。

这种情况与隐藏状态有关吗?

在训练阶段,我重置隐藏状态为0时,一个新的时代开始,因此,所有批次的时代将使用相同的隐藏状态,我怀疑这是不是一个好的做法,因为每一个句子实际上是独立的,它是否可以在训练中分享相同的隐藏状态?

在推断阶段,初始化隐藏状态为0,&在输入单词时更新。 (当清除输入时复位为0)

所以我的问题是为什么F2的预测是坏的,当开始词是从句子的中间(或近端)?在我的项目中更新隐藏状态的正确方法是什么?

回答

0

我不确定我是否正确理解了您的设置,但我认为您所看到的情况与隐藏状态的处理有关。

让我们先看看你在F2中看到什么。既然你每次重置你的隐藏状态,网络在整个标题的开头只看到一个0状态,对吧?所以,在训练期间,除了开始序列时,它可能永远不会有0状态。当你尝试从中间解码时,你从0状态开始,在训练过程中从未见过这样的位置,所以失败。

在F1中,您也重置了状态,但由于您不是填充,所以0-状态在训练期间更加随机地出现 - 有时在开始时,有时在标题中间。网络学会应对这一点。

+0

我同意你的看法,但从句子中间预测是最常见的要求,而且每个标题都是独立的也很重要。 我该如何改进这个模型? 谢谢。 –