Theano是否对BPTT进行自动展开?
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也这样做,可能是一个不错的参考。