RNN 随时间截断的反向传播

机器算法验证 神经网络 反向传播 循环神经网络 向前向后
2022-03-26 08:48:07

我不太清楚什么是训练 RNN 的正确方法。假设我们正在使用一个普通的 RNN,并给出了一些分类序列x长度T

x=[x1,,xT]

为了拟合参数,计算交叉熵损失如下。首先,我在所有时间步计算网络输出:

ht=tanh(Whxxt+Whhht1)yt=Wyhhtfort<T

每个输出都经过一个softmax得到一个分布向量Pt在分类输出空间上。我用损失

1T1t=1T1logPt[xt+1]

对于一些玩具模型,即小T,通过在整个时间序列上展开RNN并做SGD来训练这个模型效果很好。我相信这就是所谓的随时间反向传播(BPTT)。

现在,对于大T我想使用截断,即基本上只考虑过去的某个点kT, 说k=30. 我尝试了两种变体,但没有看到明显的赢家:

  • 第一种方法是拆分我的序列x成不相交的长度子序列k然后对这些子序列中的每一个进行下降步骤
  • 其次,我尝试了滑动窗口的方法,其中窗口大小为k,从而处理所有O(T)长度子序列k

此外,可以想象中间方法,其中滑动窗口重叠的量更大。

有没有人有这方面的经验或知道一些关于这方面的教程或评论?

谢谢!

1个回答

我也想知道同样的事情,看起来在这篇不错的博客文章中已经对此进行了彻底的研究:

http://r2rt.com/styles-of-truncated-backpropagation.html镜像

作者发现 TensorFlow 使用的不相交方法运行良好。每个时间步都使用滑动窗口计算起来很困难/昂贵(尤其是使用 TensorFlow 之类的框架),并且不会产生太多好处。该帖子引用了 1990 年代的一篇论文,该论文发现向前跳跃 h 步,然后将 BPTT 向后运行 2h 步,结果与仅执行跳跃 h 步和将 BPTT 向后运行 h 步的不相交方法相似。

如果您使用 LSTM 而不是简单的 RNN 单元,那么更长的上下文确实很重要,最好不要截断,或者至少使用非常多的展开步骤。作者的结果是针对一个简单的 RNN 模型。