在pytorch中制作自定义非平凡的损失函数

时间:2018-11-08 20:41:32

标签: python machine-learning deep-learning pytorch gradient-descent

我只是从pytorch开始,试图了解如何处理自定义损失函数,尤其是一些非琐碎的函数。

问题1 。我想刺激我的nn最大化真实阳性率,同时最小化 错误发现率。例如,对于真阳性,总得分增加+2,对于假阳性,总得分降低-5。

def tp_fp_loss(yhat, y):
    total_score = 0
    for i in range(y.size()):
        if is_tp(yhat[i],y[i]):
            total_score += 2
        if is_fp(yhat[i],y[i]):
            total_score -= 5
    return -total_score

问题2 。如果y是正面和负面奖励的列表(y = [10,-5,-40,23,11,-7]), 刺激nn以最大化奖励总和。

def max_reward_loss(yhat,y):
    r = torch.autograd.Variable(torch.Tensor(y[yhat >= .5]), requires_grad=True).sum()                    
    return -r

也许我不完全了解一些自动毕业机制,我正确实现的功能会计算损失,但 与他们一起学习不起作用:(我做错了吗?有人可以帮我解决一些问题吗?

2 个答案:

答案 0 :(得分:3)

您的损失函数不可微-您无法计算其梯度(继续尝试)。
您应该看起来像infogain loss

答案 1 :(得分:3)

@Shai已经总结:您的损失函数不可区分。

一种考虑方法是损失函数应该是可绘制的,并且“下坡”坡度应“滚动”到所需的模型输出。为了绘制损失函数,请修复y_true=1,然后绘制[loss(y_pred) for y_pred in np.linspace(0, 1, 101)],其中loss是损失函数,并确保绘制的损失函数具有所需的斜率。在您的情况下,听起来好像您要在阈值的错误一侧更强地权衡损失。只要可以绘制它,并且坡度始终朝着目标值下坡(从有效预测到目标值的过程中就不会出现平坦点或上坡),您的模型应该从中学习。

还请注意,如果您只是尝试考虑将精度优先于召回的业务目标,则可以通过训练以交叉熵或一些著名的损失函数收敛,然后通过调整模型来实现此目标阈值取决于您的用例。较高的阈值通常会优先考虑精度,而较低的阈值通常会优先考虑召回。培训后,您可以在各种阈值下评估模型并选择最合适的模型。