我正在重写TRACX2模型,这是一个用于训练连续语音或文本中词语分割编码的循环神经网络变体。原始代码的作者使用Numpy手动编写了网络,而我想用Pytorch来优化它。然而,他们实现了一种他们称之为“温度”和“法尔曼偏移”的东西:
这显然不是tanh(x)的实际导数,tanh(x)是他们的激活函数之一,但他们使用了这个修改后的导数。我该如何在Pytorch中实现这种修改呢?
回答:
基本上,你可以像这样添加一个后向钩子:
a = Variable(torch.randn(2,2), requires_grad=True)m = nn.Linear(2,1)m(a).mean().backward()print(a.grad) # 显示一个非零值的2x2张量temperature = 0.3fahlmanOffset = .1def hook(module, grad_input, grad_output): # 使用自定义的梯度输出 return grad_output * temperature + fahlmanOffsetm.register_backward_hook(hook)a.grad.zero_()m(a).mean().backward()print(a.grad)# 显示一个修改后的梯度的2x2张量
(来自这个回答)