多维回归问题的 Keras 损失函数

数据挖掘 喀拉斯 张量流 回归
2021-09-22 23:38:57

我是 DL 和 Keras 的新手。我正在尝试使用 Keras(tensorflow 后端)解决多元输出(y 形状(?,2))的回归问题。我对如何计算损失感到困惑。我使用平均绝对误差作为损失函数。但是,由于我的目标数据有 2 个维度,因此损失值是否计算为所有维度上的简化平均值(结果为标量)?我检查了 Keras 源代码,它使用 K.mean(..., axis=-1) 进行 MAE 计算。如果 K.mean 与 numpy.mean 相同,则“axis=-1”应该是列均值(对于我来说,它应该返回一个形状为 (?,2) 但不是标量的张量)。如果是这种情况,损失值怎么可能是一个数字(在训练过程日志中输出)?

如果 MAE 回报确实是一个标量(减少的平均值),这给了我另一个问题。我的目标每个维度的数据不在同一范围内。降低的平均值将偏向高值维度。那么我应该将我的模型更改为多任务学习模型吗?

非常感谢您对此的帮助。

L.

2个回答

回答:

1)在计算多变量输出的损失函数时,keras 将其计算为所有输出的平均值:https ://github.com/keras-team/keras/blob/2.0.4/keras/losses.py#L12

因此,如果一个输出做得非常糟糕而其他输出没有,它可能会影响您的损失结果。

2)在源代码中没有提到缩放输出以计算损失函数,因此,我认为损失函数将高度依赖于每个 Y 特征的边界。

为了避免这种情况,您可以做的是编写一个自定义损失函数,在输出损失值之前缩放您的 Y 输出:

scaler = MinMaxScaler()
data_trans = scaler.fit_transform(y_true)

def custom_mean_absolute_error(y_true, y_pred):
    y_true = (y_true - K.constant(scaler.min_)) / K.constant(scaler.scale_)
    y_pred = (y_pred - K.constant(scaler.min_)) / K.constant(scaler.scale_)
    return K.mean(K.abs(y_pred - y_true), axis=-1)

我在 RMSE 上遇到了同样的问题,顺便说一下,这可能是 MAE 的一个很好的补充选择。因此,为了测量多维输出的误差预测,我实现的方式如下。测量每个维度的索引分数,然后对所有维度进行平均,得到单个标量值。如果您的数据不在同一规模上,请对其应用标准化。为了在所有输出维度上具有相同的数量级,您还可以在应用平均减少之前将每列除以其相应的测试集标准差。