Theano是否为BPTT自动展开?

时间:2014-06-26 13:17:01

标签: python gradient backpropagation theano

我正在Theano实施RNN,我很难接受训练。它甚至没有记住训练语料库。我的错误很可能是由于我不能完全理解Theano如何应对随时间推移的反向传播。现在,我的代码非常简单:

grad_params = theano.tensor.grad(cost, params)

我的问题是:鉴于我的网络是经常性的,这会自动将架构展开为前馈吗?一方面,this示例正是我正在做的事情。另一方面,this线程让我觉得我错了。

如果它确实为我做了展开,我怎么能截断呢?我可以看到scan的{​​{3}}有一种方法,但是我无法提出代码来实现它。

1 个答案:

答案 0 :(得分:10)

我不会说它会自动“展开” - 相反,Theano有一个关于变量连接的概念,并且可以沿着该链传递更新。如果这是你展开的意思,那么也许我们在谈论同样的事情。

我也正在逐步完成此操作,但使用Rasvan Pascanu's rnn.py代码(来自this thread)作为参考。对于学习示例来说,这似乎更直接。

您可能会从tutorial中可视化/绘制图表中获得一些价值。还有一组带有simple drawing的在线幻灯片,它显示了RNN的1层“展开”图表,您将在帖子中讨论。

具体来说,请查看step函数:

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

此函数表示these slides, pg 10中显示的“简单循环网络”。当您进行更新时,只需传递渐变w.r.t. W,W_in和W_out分别(记住y通过step函数连接到那三个!这就是渐变魔法的工作原理。)

如果你有多个W层(或者指向一个大的W,我认为gwtaylor正在做),那么这将创建多层“展开”。据我所知,这个网络只能向后看一步。如果有帮助,theanonets还在Theano中实施了RNN。

作为补充说明,使用BPTT训练RNN hard Ilya Sutskever's dissertation会详细讨论这个问题 - 如果可以,请尝试绑定Hessian Free optimizer, there is also a reference RNN implementation here。 Theanets也这样做,可能是一个很好的参考。