Theano是否对BPTT进行自动展开?

8 投票
1 回答
2471 浏览
提问于 2025-04-18 11:11

我正在用Theano实现一个循环神经网络(RNN),但在训练上遇到了困难。我的模型根本无法记住训练数据。造成这个问题的原因可能是我不太明白Theano是如何处理时间反向传播的。目前,我的代码尽可能简单:

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

我想问的是:因为我的网络是循环的,这是否意味着它会自动将结构展开成一个前馈网络?一方面,这个例子正好和我做的事情一样。另一方面,这个讨论让我觉得我可能理解错了。

如果它确实为我展开了结构,那我该如何截断它呢?我看到在scan的文档中有方法,但我想不出该怎么写代码来实现。

1 个回答

10

我不会说它是自动“展开”的,实际上,Theano有一个关于变量如何连接的概念,并且可以沿着这个链条传递更新。如果你说的展开是这个意思,那我们可能在讨论同样的事情。

我也在研究这个,不过我使用的是Rasvan Pascanu的rnn.py代码(来自这个讨论串)作为参考。这个例子看起来更简单,更适合学习。

你可以从教程中获取一些可视化的图表,这可能会对你有帮助。网上还有一组幻灯片,里面有一个简单的图示,展示了你在帖子中提到的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

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

如果你有多个W层(或者像我认为gwtaylor那样在一个大W中使用索引),那么这会创建多个“展开”层。根据我的理解,这个网络只向后看一步。如果有帮助的话,theanonets在Theano中也有RNN的实现。

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

撰写回答