在theano中采用huber loss的梯度

taking the gradient of huber loss in theano

我有两个函数应该会产生相同的结果:f1(x,theta)=f2(x,theta)

给定输入 x,我需要找到使该等式尽可能成立的参数 theta

最初我在考虑使用平方损失和最小化 (f1(x,theta)-f2(x,theta))^2 并通过 SGD 求解。

不过,我正在考虑让损失更精确,并使用差异的 huber(或绝对损失)。 Huber loss是一个分段函数(即最初是二次函数,然后变成线性函数)。

如何在 theano 中获取 huber 损失的梯度?

可以在 theano 中找到一个非常简单的 huber 损失实现 here

这是一个代码片段

import theano.tensor as T
delta = 0.1
def huber(target, output):
    d = target - output
    a = .5 * d**2
    b = delta * (abs(d) - delta / 2.)
    l = T.switch(abs(d) <= delta, a, b)
    return l.sum()

函数 huber 将 return 损失的符号表示,然后您可以将其插入 theano.tensor.grad 以获得梯度并使用它来最小化 SGD