我只是从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
也许我不完全了解一些自动毕业机制,我正确实现的功能会计算损失,但 与他们一起学习不起作用:(我做错了吗?有人可以帮我解决一些问题吗?
答案 0 :(得分:3)
您的损失函数不可微-您无法计算其梯度(继续尝试)。
您应该看起来像infogain loss
答案 1 :(得分:3)
@Shai已经总结:您的损失函数不可区分。
一种考虑方法是损失函数应该是可绘制的,并且“下坡”坡度应“滚动”到所需的模型输出。为了绘制损失函数,请修复y_true=1
,然后绘制[loss(y_pred) for y_pred in np.linspace(0, 1, 101)]
,其中loss
是损失函数,并确保绘制的损失函数具有所需的斜率。在您的情况下,听起来好像您要在阈值的错误一侧更强地权衡损失。只要可以绘制它,并且坡度始终朝着目标值下坡(从有效预测到目标值的过程中就不会出现平坦点或上坡),您的模型应该从中学习。
还请注意,如果您只是尝试考虑将精度优先于召回的业务目标,则可以通过训练以交叉熵或一些著名的损失函数收敛,然后通过调整模型来实现此目标阈值取决于您的用例。较高的阈值通常会优先考虑精度,而较低的阈值通常会优先考虑召回。培训后,您可以在各种阈值下评估模型并选择最合适的模型。