8

我正在 Theano 中实现一个 RNN,但我很难训练它。它甚至比不上记住训练语料库。我的错误很可能是由于我不完全了解 Theano 如何应对反向传播。现在,我的代码非常简单:

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

我的问题是:鉴于我的网络是循环的,这是否会自动将架构展开为前馈架构?一方面,这个例子正是我正在做的。另一方面,这个线程让我觉得我错了。

如果它确实为我展开,我该如何截断它?我可以从 的文档中看到有一种方法,scan但我无法想出代码来做到这一点。

4

1 回答 1

10

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

我也正在逐步执行此操作,但使用Rasvan Pascanu 的 rnn.py代码(来自此线程)作为参考。对于学习示例来说,这似乎更简单。

您可能会从教程中的可视化/绘制图表中获得一些价值。还有一组在线幻灯片,其中包含一个简单的绘图,显示了 RNN 的一层“展开”的图表,您在帖子中对此进行了讨论。

具体看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

这个函数代表了这些幻灯片中显示的“简单循环网络” ,第 10 页。当您进行更新时,您只需分别传递 W、W_in 和 W_out 的梯度(请记住,y 通过step函数连接到这三个!这就是梯度魔法的工作原理)。

如果您有多个 W 层(或索引到一个大 W,正如我相信 gwtaylor 所做的那样),那么这将创建多层“展开”。据我了解,这个网络在时间上看起来只向后退了一步。如果有帮助,theanonets在 Theano 中也有一个 RNN 实现。

另外需要注意的是,使用 BPTT 训练 RNN 很困难Ilya Sutskever 的论文对此进行了详尽的讨论——如果可以的话,尝试使用Hessian Free 优化器,这里还有一个参考 RNN 实现。Theanets 也这样做,可能是一个很好的参考。

于 2014-06-26T17:57:21.027 回答