【发布时间】:2020-06-27 01:30:08
【问题描述】:
在 theano 中实现深度网络让我可以从头开始精确控制我的层。我知道它不再受支持,但在我看来仍然在积极使用(至少从我这里:->)。无论如何,我注意到一些与通过扫描操作计算梯度有关的行为。
我有以下内部函数(RNN 内部迭代步骤的一部分,如果需要,我可以提供):
def iter_step(x_step, h):
...
return hidden, obj, est
我有一组用于计算梯度的参数h_params、o_params、e_params:
h, o, e = iter_step(x_step, h)
hidden_grads = T.grad(T.sum(h), h_params)
obj_grads = T.grad(T.sum(o), o_params)
est_grads = T.grad(T.sum(est), e_params)
一切都很好。我添加一个扫描操作
[h_n, obj_n, x_n], _ = theano.scan(
fn=iter_step,
sequences=[x],
outputs_info=[T.as_tensor_variable(np.zeros(model.h_shape), model.h.dtype),
None,
None],
)
评估很好,但是在相同参数上计算梯度现在是个问题:
# Works
h_n0 = theano.function([], h_n)()
# Fails
h_n_grads = T.grad(T.sum(h_n), h_params)
---------------------------------------------------------------------------
NullTypeGradError Traceback (most recent call last)
<ipython-input-32-0d7c8a65d265> in <module>
----> 1 h_n_grads = T.grad(T.sum(h_n), h_params)
/usr/local/lib/python3.6/dist-packages/theano/gradient.py in grad(cost, wrt, consider_constant, disconnected_inputs, add_names, known_grads, return_disconnected, null_gradients)
609 if null_gradients == 'raise':
610 raise NullTypeGradError("tensor.grad encountered a NaN. " +
--> 611 rval[i].type.why_null)
612 else:
613 assert null_gradients == 'return'
NullTypeGradError: tensor.grad encountered a NaN. This variable is Null because the grad method for input 4 (Subtensor{int64}.0) of the for{cpu,scan_fn} op is mathematically undefined. Depends on a shared variable
这是为什么?我还无法调试 - 图形未断开连接,手动展开扫描可提供良好的渐变。梯度计算应该通过扫描操作进行。如果可以计算 h(iter_step 的第一个输出)上的梯度,为什么不能在扫描的模拟输出上计算?
【问题讨论】:
标签: python gradient theano recurrent-neural-network