我有一些关于张量流中RNN的基本问题(在撰写本文时为v1.3)。
我认为我对RNN(+ LSTM)非常了解。除了其他内容,我还阅读了Sutskever's PhD Thesis,Grave's Generating Sequences以及其他一些论文/文章。我的问题更多的是关于张量流的使用以及如何设置输入/目标张量来做截断后传播(TBPTT)。
说我想训练一个RNN来预测下一个项目(比如char-rnn)。
即。学习P(x_{t+1} | x_{t-n:t})
,其中n是最大序列长度。这有效P(x_{t+1} | x_t, c_t, h_t)
c_t, h_t
cell state
和hidden state
时间步t
。
对我来说似乎最合乎逻辑(假设我想学习依赖最多n次步骤):
方法1(TBPTT(n,1):
因此,如果我的整个语料库是字母表(ABC ... XYZ),并且n是5,那么我的训练对是:
等。然后这些都被批量化了。
但是,我见过的所有示例(例如https://github.com/sherjilozair/char-rnn-tensorflow,https://r2rt.com/recurrent-neural-networks-in-tensorflow-i.html,https://medium.com/@erikhallstrm/hello-world-rnn-83cd7105b767#.ozeai0fo8)都采用了不同的方式。相反,目标张量与输入张量具有相同的尺寸(包括铲斗长度),桶中有无重叠,状态仅清除在时代。 e.g
方法2(TBPTT(n,n)):
我可以理解这一点,如果内部张量流正在评估损失并在迷你序列(即桶)的每一步执行TBPTT 而不是仅仅在迷你序列结束时执行此操作 (桶)。我没有得到的是,如果是这样的话,那么错误会在一个项目中途传播到项目的前面多远?即对于后一种情况下的第二个训练例子,[H]以[F,G]或[C,D,E,F,G]为条件(因为它显然是在我解释的第一种方法中)。
这是假设使用tf的本机rnn API,例如tf.nn.dynamic_rnn。
This article确认并说明了张量流确实计算了损失并在迷你序列/桶的每一步执行TBPTT,但仅限于每个桶的开头。
TBPTT(n,1),L = 6,n = 3(我提出的第一种方法)
TENSORflow TBPTT,L = 6,n = 3
但是我的问题仍然存在,如果这个(即默认的tensorflow方法)是一个很好的方法(特别是如果我们只想学习最多n次步长依赖)。
据我所知,即使tf的TBPTT仅将梯度传播到桶的开头,状态也会在桶之间保留(即参见上面的第二个图),一个小批量的最终状态被送入第二个。但是,我不明白这将如何保持并行处理的批次的连续性。即如果我们的小批量大小为2,则一批
[[A,B,C,D,E] -> [B,C,D,E,F], [F,G,H,I,J] -> [G,H,I,J,K]]
[A,B,C,D,E] - > [B,C,D,E,F]与[F,G,H,I,J] - >并行处理。 [G,H,I,J,K],他们之间没有任何状态。因此,如何批量分割数据变得非常重要,并且不会将相邻的桶放在同一批次中,而是放在相邻的批次中。即组织批次最好:
但即使在这种情况下,由于并行处理,没有很多不连续性?例如[L]不以[G,H,I,J,K]为条件。