【问题标题】:Pytorch with Modified DerivativesPytorch 与改进的衍生物
【发布时间】:2020-07-14 20:07:16
【问题描述】:
我正在重写TRACX2 model,这是一种循环神经网络的变体,用于在连续语音或文本的分词上下文中训练编码。原始代码的作者在 Numpy 中手动编写了网络,而我想用 Pytorch 对其进行优化。然而,他们实现了他们称之为“温度”和“法尔曼偏移”的东西:
这显然不是他们的激活函数之一 tanh(x) 的实际导数,但他们使用了这个导数。我将如何在 Pytorch 中实现这种修改?
【问题讨论】:
标签:
machine-learning
pytorch
recurrent-neural-network
【解决方案1】:
基本上,您可以像这样添加backward hook:
a = Variable(torch.randn(2,2), requires_grad=True)
m = nn.Linear(2,1)
m(a).mean().backward()
print(a.grad)
# shows a 2x2 tensor of non-zero values
temperature = 0.3
fahlmanOffset = .1
def hook(module, grad_input, grad_output):
# Use custom gradient output
return grad_output * temperature + fahlmanOffset
m.register_backward_hook(hook)
a.grad.zero_()
m(a).mean().backward()
print(a.grad)
# shows a 2x2 tensor with modified gradient
(由this answer提供)