我正在使用Tensorflow的 GRUCell
MultiRNNCell
dynamic_rnn
组合生成多层LSTM来预测元素序列 .
在我看到的几个例子中,比如字符级语言模型,一旦训练阶段完成,生成似乎是通过一次只喂一个'字符'(或任何元素)来完成下一个预测,并且然后根据第一个预测等获得以下'字符' .
我的问题是,由于Tensorflow的 dynamic_rnn
将RNN图展开为任意序列长度的任意步数,一旦预测逐渐 Build ,一次只馈送一个元素有什么好处?通过每个预测步骤逐渐收集更长的序列并将其重新输入图表是否更有意义?即在生成第一个预测之后,反馈一个2个元素的序列,然后是3个等等?
我目前正在尝试预测阶段,首先输入15个元素(实际历史数据)的序列,得到预测的最后一个元素,然后用原始输入中的一个元素替换该预测值,依此类推N个预测步骤的循环 .
这种方法的缺点是什么,而不是一次只喂一个元素?
2 回答
我不确定你的方法实际上是在做你想做的事情 .
假设我们有一个受过训练的LSTM网络来生成字母表 . 现在,为了让网络生成一个序列,我们从一个干净的状态开始
h0
并输入第一个字符a
. 网络输出一个新状态h1
及其预测b
,我们将其附加到输出中 . 接下来,我们希望网络根据当前输出ab
预测下一个字符 . 如果我们在此步骤中将状态h1
送入网络ab
,则其感知序列将为aab
,因为h1
是在第一个a
之后计算的,现在我们输入另一个a
和b
. 或者,我们可以将ab
和一个干净状态h0
提供给网络,这将提供正确的输出(基于ab
),但我们会对整个序列执行不必要的计算,除了b
,因为我们已经计算了状态h1
,它对应于网络读取序列a
,所以为了获得下一个预测和状态,我们只需要输入下一个字符,b
.因此,要回答您的问题,一次向网络提供一个字符是有道理的,因为网络只需要查看每个字符一次,并且多次输入相同的字符只是不必要的计算 .
这是一个很好的问题,我问了一些非常相似的问题here .
这个想法不是在一段时间内共享权重(在你描述时一次一个元素),每一步都得到它自己的一组权重 .
我认为一次一步训练有几个原因,主要是计算复杂性和训练难度 . 你需要一些非常运动的硬件训练长序列的重量 . 对于长序列,您还需要一个非常大的数据集来训练所有这些权重 . 但是imho,我仍然乐观地认为,对于正确的问题,如果资源充足,它就会有所改善 .