关于张量流中的RNN,我有几个基本问题(写作时的v1.3) .

我认为我对RNN(LSTM)非常了解 . 除此之外,我还阅读了Sutskever's PhD ThesisGrave'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_tcell statehidden state 在timetep t .

对我来说似乎最合乎逻辑(假设我想学习依赖性 upto a maximum of n timesteps ):

方法1(TBPTT(n,1):

  • 如果我的语料库是L项长(例如10000),我会将其分成(L-n)个迷你序列(或桶)每n个项目长(例如50),移动每个桶1个项目

  • 我的输入张量是[batch_size,n,x_dim]

  • 我的目标张量为[batch_size, 1 ,y_dim] #y_dim对于x为pdf的暗淡

  • 我的隐藏状态张量将是[batch_size,cell_size] * num_layers(* 2,如果是LSTM)

  • 在每个 batch 的开头我会把状态归零 . 我甚至会在每个时代随机化桶的顺序 .

因此,如果我的整个语料库是字母表(ABC ... XYZ),并且n是5,那么我的训练对是:

  • [A,B,C,D,E] - > [F]

  • [B,C,D,E,F] - > [G]

  • [C,D,E,F,G] - > [H]

然后这些都是批量的 .

但是,我见过的所有例子(例如https://github.com/sherjilozair/char-rnn-tensorflowhttps://r2rt.com/recurrent-neural-networks-in-tensorflow-i.htmlhttps://medium.com/@erikhallstrm/hello-world-rnn-83cd7105b767#.ozeai0fo8)都是这样做的 . 相反,目标张量与输入张量( including bucket length )具有相同的尺寸,桶中有 no overlap ,状态被清除 only on epochs . 例如

方法2(TBPTT(n,n)):

  • [A,B,C,D,E] - > [B,C,D,E,F]

  • [F,G,H,I,J] - > [G,H,I,J,K]

  • [K,L,M,N,O] - > [L,M,N,O,P]

  • [P,Q,R,S,T] - > [Q,R,S,T,U]

  • [U,V,W,X,Y] - > [V,W,X,Y,Z]

我可以理解这一点,如果内部张量流正在评估损失并进行TBPTT at every step of the mini-sequence (i.e. bucket) 而不是仅仅在迷你序列(桶)结束时进行 . 我没有得到的是,如果是这样的话,那么错误会在一个项目中途传播到项目的前面多远?即对于后一种情况下的第二训练例子,[H]以[F,G]或[C,D,E,F,G]为条件(因为它显然是在我解释的第一种方法中) .

这是假设使用tf的本机rnn API,如tf.nn.dynamic_rnn .

This article确认并说明了张量流确实计算了损失并在 every step of the mini-sequence / bucket, but only to the beginning of each bucket 执行TBPTT .

TBPTT(n,1),L = 6,n = 3(我提出的第一种方法)

TBPTT(n,1) for L=6, n=3

Tensorflow TBPTT为L = 6,n = 3

Tensorflow TBPTT for L=6, n=3

但是我的问题仍然存在,如果这个(即默认的张量流方法)是一个很好的方法(特别是如果我们只对学习最多n个时间步长依赖性感兴趣) .

我明白,即使这样做会理解这将如何保持 batches which are processed in parallel 的连续性 . 即如果我们的迷你批量大小为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],他们之间没有传递任何状态 . 因此,如何批量分割数据变得非常重要,并且不会将相邻的桶放在同一批次中,而是放在相邻的批次中 . 即组织批次更好:

  • batch1:[[A,B,C,D,E] - > [B,C,D,E,F],[K,L,M,N,O] - > [L,M,N,O ,P]]

  • batch2:[[F,G,H,I,J] - > [G,H,I,J,K],[P,Q,R,S,T] - > [Q,R,S,T ,U]]

但即使在这种情况下,由于并行处理,没有很多不连续性?例如[L]不以[G,H,I,J,K]为条件 .