我不会说它会自动“展开” - 相反,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 也这样做,可能是一个很好的参考。