Joh*_*ues 8 python gradient backpropagation theano
我正在Theano实施RNN,我很难训练它.它甚至没有记住训练语料库.我的错误很可能是由于我不能完全理解Theano如何应对随时间推移的反向传播.现在,我的代码非常简单:
grad_params = theano.tensor.grad(cost, params)
Run Code Online (Sandbox Code Playgroud)
我的问题是:鉴于我的网络是经常性的,这会自动将架构展开为前馈吗?一方面,这个例子正是我正在做的事情.另一方面,这个帖子让我觉得我错了.
如果它确实为我做了展开,我怎么能截断呢?我可以看到,从文档中有一种方法,scan但我无法想出代码来做到这一点.
Kyl*_*ner 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
Run Code Online (Sandbox Code Playgroud)
此功能代表这些幻灯片中显示的"简单复发网" ,第10页.当您进行更新时,您只需分别传递W W,W_in和W_out的渐变(请记住y通过step函数连接到这三个!这就是渐变魔法的工作方式).
如果你有多个W层(或者指向一个大的W,我相信gwtaylor正在做),那么这将创建多层"展开".据我所知,这个网络只能向后看一步.如果它有帮助,那么在Theano中也有一个RNN实施.
另外需要注意的是,使用BPTT训练RNN很困难.Ilya Sutskever的论文详细讨论了这个问题 - 如果可以的话,尝试与Hessian Free优化器联系起来,这里也有一个参考RNN实现.Theanets也这样做,可能是一个很好的参考.