什么是惩罚幅度和符号差异的良好损失函数

Eth*_*hen 9 machine-learning loss-function

我需要训练模型来预测标量值,并且预测值与真实值的方向相同很重要,而平方误差最小.

那个损失函数的好选择是什么?

例如:

假设预测值为-1,真值为1.两者之间的损失应该比3和1之间的损失大很多,即使(3,1)和(-1,1)的平方误差也是如此. ) 是平等的.

非常感谢!

Jus*_*her 8

原来这是一个非常有趣的问题-感谢您提出要求!首先,请记住,您希望损失函数完全由微分运算定义,以便您可以反向传播。这意味着任何旧的任意逻辑都不一定会这样做。重述您的问题:您想找到两个变量的可微函数,当两个变量采用不同符号的值时,该函数急剧增加,而当它们共享相同的符号时,该函数则缓慢增长。此外,您想对一些控制如何相互这些值急剧增加。因此,我们想要一些带有两个可配置常量的东西。我开始构建满足这些需求的函数,但随后想起了可以在任何高中几何教科书中找到的函数:椭圆抛物面

旋转的椭圆抛物面。

标准格式不符合符号协议对称性的要求,因此我不得不引入旋转。上图是结果。请注意,当符号不一致时,它会急剧增加,而当符号不一致时,它会急剧减少,并且控制此行为的输入常量是可配置的。下面的代码是定义和绘制损失函数所需的全部代码。我认为我以前从未使用过几何形式作为损失函数-确实很整洁。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm


def elliptic_paraboloid_loss(x, y, c_diff_sign, c_same_sign):

    # Compute a rotated elliptic parabaloid.
    t = np.pi / 4

    x_rot = (x * np.cos(t)) + (y * np.sin(t))

    y_rot = (x * -np.sin(t)) + (y * np.cos(t))

    z = ((x_rot**2) / c_diff_sign) + ((y_rot**2) / c_same_sign)

    return(z)


c_diff_sign = 4

c_same_sign = 2

a = np.arange(-5, 5, 0.1)

b = np.arange(-5, 5, 0.1)

loss_map = np.zeros((len(a), len(b)))

for i, a_i in enumerate(a):

    for j, b_j in enumerate(b):

        loss_map[i, j] = elliptic_paraboloid_loss(a_i, b_j, c_diff_sign, c_same_sign)



fig = plt.figure()
ax = fig.gca(projection='3d')
X, Y = np.meshgrid(a, b)
surf = ax.plot_surface(X, Y, loss_map, cmap=cm.coolwarm,
                       linewidth=0, antialiased=False)

plt.show()
Run Code Online (Sandbox Code Playgroud)

  • 嘿伊森。你是对的,这个描述不完整。elliptic_paraboloid_loss 函数是一个缩放因子,可以应用于您选择的任何损失函数。它可用于缩放任何损失函数。在您的情况下,标准回归损失,平方误差,将是合适的。要看到这一点,请注意,当值是 (-5, -5) 时,SE 是 0. 0 倍椭圆抛物面损失 (50) 仍然是 0。抱歉对此不清楚。 (2认同)