为什么在RNN中通过时间反向传播?


14

在递归神经网络中,通常会向前传播几个时间步骤,“展开”网络,然后在输入序列中向后传播。

为什么不只在序列中的每个步骤之后更新权重?(等效于使用1的截断长度,因此没有展开的空间),这完全消除了消失的梯度问题,大大简化了算法,可能会减少陷入局部极小值的机会,并且最重要的是看起来工作正常。我以这种方式训练了一个模型来生成文本,结果似乎与从BPTT训练后的模型中看到的结果相当。我对此仅感到困惑,因为我所见过的每个有关RNN的教程都说要使用BPTT,几乎就像是正确学习所必需的那样,事实并非如此。

更新:我添加了一个答案


进行这项研究的一个有趣方向是将您在问题上所获得的结果与标准RNN问题的文献中发布的基准进行比较。那将是一篇非常酷的文章。
Sycorax说恢复莫妮卡

您的“更新:我添加了答案”用您的体系结构描述和插图替换了先前的编辑。是故意的吗?
变形虫说恢复莫妮卡

是的,我删除了它,因为它似乎与实际问题并不相关,并且占用了大量空间,但是如果有帮助,我可以将其重新添加
Frobot

好吧,人们似乎在理解您的体系结构时遇到了很多问题,所以我想任何其他解释都是有用的。如果愿意,可以将其添加到答案而不是问题中。
变形虫说恢复莫妮卡

Answers:


4

编辑:比较这两种方法时我犯了一个大错误,必须更改答案。事实证明,我这样做的方式,只是在当前时间步长上进行传播,实际上开始学习得更快。快速更新非常迅速地学习了最基本的模式。但是,在更大的数据集和更长的培训时间上,BPTT实际上确实是最重要的。我仅在几个时期内测试了一个小样本,并假设谁开始赢得比赛将是赢家。但这确实使我找到了一个有趣的发现。如果您仅在单个时间步上开始进行反向传播训练,然后更改为BPTT并慢慢增加传播的距离,则可以更快地收敛。


感谢您的更新。在最后一张图片的来源中,他说了关于一对一设置的内容:“没有RNN的香草加工模式,从固定大小的输入到固定大小的输出(例如图像分类)。” 这就是我们所说的。如果是您所描述的,则它没有状态,并且不是RNN。“在传播之前先通过单个输入进行传播”-我称其为ANN。但是这些文本不能很好地处理文本,所以出现了一些问题,我不知道该怎么办,因为我没有代码
ragulpr

我没有读过那部分,你是正确的。我使用的模型实际上是最右边的“多对多”。我假设在“一对一”部分中确实有很多这样的连接,而绘图只是略去了。但这实际上是我没有注意到的最右边的选项之一(在关于RNN的博客中有一个选项很奇怪,所以我认为它们都是重复出现的)。我将对答案的那部分进行编辑以使其更有意义
Frobot

我以为是这种情况,这就是为什么我坚持要看您的损失函数的原因。如果损失很多,那么您的损失就类似于,它是相同的RNN和你传播/输入查询整个序列,但然后就截断BPTT即你” d计算我帖子中的红色部分,但不再递归。error=t(yty^t)2
ragulpr

我的损失函数不会随时间累加。我得到一个输入,得到一个输出,然后计算损失,更新权重,然后移至t + 1,因此没有什么可求和。我会将确切的损失函数添加到原始帖子中
-Frobot

只需发布您的代码,我就不再做任何猜测了,这很愚蠢。
ragulpr

2

RNN是一个深度神经网络(DNN),其中每一层都可以接受新的输入,但具有相同的参数。在这样的网络上,BPT是反向传播的奇特词,它本身也是梯度下降的奇特词。

说,RNN输出ÿ中的每个步骤和 ë [R [R ö ř = ý - Ÿ2y^t

errort=(yty^t)2

为了学习权重,我们需要函数梯度以回答以下问题:“参数变化对损失函数有多大影响?” 并按以下给定的方向移动参数:

errort=2(yty^t)y^t

也就是说,我们有一个DNN,可以在其中获得有关每个层的预测效果如何的反馈。由于参数的变化将改变DNN中的每一层(时间步长),并且每一层都为即将到来的输出做出贡献,因此需要对此加以考虑。

采取一个简单的单神经元一层网络来半透明地看到这一点:

y^t+1=f(a+bxt+cy^t)ay^t+1=f(a+bxt+cy^t)cay^tby^t+1=f(a+bxt+cy^t)(xt+cby^t)cy^t+1=f(a+bxt+cy^t)(y^t+ccy^t)y^t+1=f(a+bxt+cy^t)([0xty^t]+cy^t)

学习率一个训练步骤则是: [ b c ^ ][ 一个b Ç ] + δ ý - Ÿÿδ

[a~b~c~][abc]+δ(yty^t)y^t

y^t+1y^tt而不进一步递归。我认为你的损失大概是

error=t(yty^t)2

也许每个步骤都会为总体提供足够的方向?这可以解释您的结果,但是我真的很想了解更多有关您的方法/损失函数的信息!也将有兴趣与两个时间步窗式ANN进行比较。

edit4:阅读评论后,看来您的体系结构不是RNN。

ht Statefull

您的模型:无状态-在每个步骤中都将重建隐藏状态 stateless edit2:向DNN添加更多引用edit3:修复了gradstep和一些表示法edit5:修复了您的回答/澄清后对模型的解释。


1
谢谢您的回答。我想您可能会误解我在做什么。在前向传播中,我只执行一个步骤,因此在后向传播中,我也仅执行一个步骤。我不会在训练序列中跨多个输入转发传播。我明白了您对粗略方向的理解,该方向足以进行聚合以进行学习,但是我已经用数字计算得出的梯度检查了梯度,并且它们匹配了10个以上的小数位。背部支柱工作正常。我正在使用交叉熵损失。
Frobot

1
我正在努力采用相同的模型,并使用BPTT对其进行再培训,因为我们进行了明确的比较。我还使用此“一步”算法训练了一个模型,以预测股票价格在第二天会上涨还是下跌,从而获得了不错的准确性,因此我将使用两种不同的模型来比较BPTT与单步反向支撑。
Frobot

如果仅向前传播一个步骤,这不是最后一步的特征输入到第一层的第二层ANN,第二层的当前步骤的特征输入但是两层的权重/参数都相同吗?我希望采用输入法的ANN可以获得类似的结果或更好的结果y^t+1=f(xt,xt1)

1
我正在使用大小为1的滑动窗口,但结果与使用输入(xt,xt-1)制作大小为2 ANN的滑动窗口大不相同。当学习大量文本时,我可以有目的地让它过度拟合,并且它可以以0错误重现整个文本,这需要了解长期的依赖关系,而如果仅输入(xt,xt-1)则是不可能的。我剩下的唯一问题是使用BPTT是否可以使依赖关系变得更长,但老实说看起来并不像这样。
Frobot

ÿ^Ť-2ÿ^Ť=0为您的体系结构。BPTT在理论上与BP相同,但是在RNN架构上执行,因此您不能,但是我明白您的意思了,答案是否定的。看到关于有状态RNN的实验真的很有趣,但是只有
一步

1

"Unfolding through time" is simply an application of the chain rule,

dF(g(x),h(x),m(x))dx=Fgdgdx+Fhdhdx+Fmdmdx

The output of an RNN at time step t, Ht is a function of the parameters θ, the input xt and the previous state, Ht1 (note that instead Ht may be transformed again at time step t to obtain the output, that is not important here). Remember the goal of gradient descent: given some error function L, let's look at our error for the current example (or examples), and then let's adjust θ in such a way, that given the same example again, our error would be reduced.

How exactly did θ contribute to our current error? We took a weighted sum with our current input, xt, so we'll need to backpropagate through the input to find θa(xt,θ), to work out how to adjust θ. But our error was also the result of some contribution from Ht1, which was also a function of θ, right? So we need to find out θHt1, which was a function of xt1, θ and Ht2. But Ht2 was also a function a function of θ. And so on.


I understand why you back propagate through time in a traditional RNN. I'm trying to find out why a traditional RNN uses multiple inputs at once for training, when using just one at a time is much simpler and also works
Frobot

The only sense in which you can feed in multiple inputs at once into an RNN is feeding in multiple training examples, as part of a batch. The batch size is arbitrary, and convergence is guaranteed for any size, but higher batch sizes may lead to more accurate gradient estimations and faster convergence.
Matthew Hampsey

That's not what I meant by "multiple inputs at once". I didn't word it very well. I meant you usually forward propagate through several inputs in the training sequence, then back propagate back through them all, then update the weights. So the question is, why propagate through a whole sequence when doing just one input at a time is much easier and still works
Frobot

I think some clarification here is required. When you say "inputs", are you referring to multiple training examples, or are you referring to multiple time steps within a single training example?
Matthew Hampsey

1
I will post an answer to this question by the end of today. I finished making a BPTT version, just have to train and compare. After that if you still want to see some code let me know what you want to see and I guess I could still post it
Frobot
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.