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