在 Theano 中使导数为零
Make derivative zero in Theano
我正在尝试从这篇论文中实现 LSTM 优化器:https://arxiv.org/pdf/1606.04474v1.pdf
他们正在做关于梯度导数的假设w.r.t。 LSTM 参数等于零:
看看我的代码,我认为当我优化损失函数时,没有使用这个假设,因为 Theano 可以计算这个梯度并且它确实这样做了。我怎样才能阻止它这样做?
代码如下:
def step_opt(cell_previous, hid_previous, theta_previous, *args):
func = self.func(theta_previous)
grad = theano.grad(func, theta_previous)
input_n = grad.dimshuffle(0, 'x')
cell, hid = step(input_n, cell_previous, hid_previous, *args) # function that recomputes LSTM hidden state and cell
theta = theta_previous + hid.dot(self.W_hidden_to_output).dimshuffle(0)
return cell, hid, theta, func
cell_out, hid_out, theta_out, loss_out = theano.scan(
fn=step_opt,
outputs_info=[cell_init, hid_init, theta_init, None],
non_sequences=non_seqs,
n_steps=self.n_steps,
strict=True)[0]
loss = loss_out.sum()
最终我找到了答案。有这个页面:
http://deeplearning.net/software/theano/library/gradient.html
我们可以使用 disconnected_grad(expr)
使反向传播在 expr
停止。
我正在尝试从这篇论文中实现 LSTM 优化器:https://arxiv.org/pdf/1606.04474v1.pdf
他们正在做关于梯度导数的假设w.r.t。 LSTM 参数等于零:
看看我的代码,我认为当我优化损失函数时,没有使用这个假设,因为 Theano 可以计算这个梯度并且它确实这样做了。我怎样才能阻止它这样做?
代码如下:
def step_opt(cell_previous, hid_previous, theta_previous, *args):
func = self.func(theta_previous)
grad = theano.grad(func, theta_previous)
input_n = grad.dimshuffle(0, 'x')
cell, hid = step(input_n, cell_previous, hid_previous, *args) # function that recomputes LSTM hidden state and cell
theta = theta_previous + hid.dot(self.W_hidden_to_output).dimshuffle(0)
return cell, hid, theta, func
cell_out, hid_out, theta_out, loss_out = theano.scan(
fn=step_opt,
outputs_info=[cell_init, hid_init, theta_init, None],
non_sequences=non_seqs,
n_steps=self.n_steps,
strict=True)[0]
loss = loss_out.sum()
最终我找到了答案。有这个页面: http://deeplearning.net/software/theano/library/gradient.html
我们可以使用 disconnected_grad(expr)
使反向传播在 expr
停止。