Python Theano是否为BPTT自动展开?

Python Theano是否为BPTT自动展开?,python,gradient,backpropagation,theano,Python,Gradient,Backpropagation,Theano,我正在Theano中实施RNN,并且我很难对其进行培训。它甚至不接近于记忆训练语料库。我的错误很可能是因为我不了解Theano是如何处理时间的反向传播的。现在,我的代码非常简单: grad_params = theano.tensor.grad(cost, params) 我的问题是:考虑到我的网络是反复出现的,这是否会自动将体系结构展开为一个前馈的体系结构?一方面,这个例子正是我所做的。另一方面,线程让我觉得我错了 如果它确实为我展开,我如何截断它?我可以从扫描中看出有一种方法,但我不能想出

我正在Theano中实施RNN,并且我很难对其进行培训。它甚至不接近于记忆训练语料库。我的错误很可能是因为我不了解Theano是如何处理时间的反向传播的。现在,我的代码非常简单:

grad_params = theano.tensor.grad(cost, params)
我的问题是:考虑到我的网络是反复出现的,这是否会自动将体系结构展开为一个前馈的体系结构?一方面,这个例子正是我所做的。另一方面,线程让我觉得我错了


如果它确实为我展开,我如何截断它?我可以从扫描中看出有一种方法,但我不能想出代码来做这件事。

我不会说它会自动“展开”-相反,Theano知道哪些变量是连接的,并且可以沿着该链传递更新。如果这就是你所说的展开,那么也许我们在谈论同一件事

我也在逐步介绍这一点,但使用代码(来自)作为参考。对于一个学习示例来说,这似乎更简单

从中可视化/绘制图形可能会获得一些价值。网上还有一组幻灯片,其中显示了RNN的1层“展开”图,您在文章中讨论了这一点

具体来说,请查看
步骤
功能:

def step(u_t, h_tm1, W, W_in, W_out):
    h_t = TT.tanh(TT.dot(u_t, W_in) + TT.dot(h_tm1, W))
    y_t = TT.dot(h_t, W_out)
    return h_t, y_t
此函数表示中所示的“简单经常性净”。当您进行更新时,只需分别传递渐变w.r.t.w、w_in和w_out(请记住,y通过
步骤
函数连接到这三者!渐变魔术就是这样工作的)

如果你有多个W层(或者像我相信的那样,将索引变成一个大W),那么这将创建多个“展开”层。据我所知,这个网络在时间上只向后退了一步。如果有帮助,还可以在Theano中实现RNN


另外,使用BPTT培训RNN是很困难的。详细讨论这一点——如果可以的话,试着用一个。TheANET也可以这样做,可能是一个很好的参考。

这并不是真正回答如何访问最后n个激活的问题。这将返回给定step函数的所有激活,对于最后n个,您可以对结果进行切片,例如(h,y),updates=scan(…);我的行为=h[n:]