在 Keras 模型中优化准确性而不是损失
Posted
技术标签:
【中文标题】在 Keras 模型中优化准确性而不是损失【英文标题】:Optimizing for accuracy instead of loss in Keras model 【发布时间】:2019-10-23 04:59:38 【问题描述】:如果我正确理解了损失函数对模型的重要性,它会指导模型在最小化损失值的基础上进行训练。例如,如果我希望我的模型经过训练以获得最小的平均绝对误差,我应该使用 MAE 作为损失函数。例如,为什么有时您会看到有人想要尽可能地获得最佳精度,但构建模型以最小化另一个完全不同的功能?例如:
model.compile(loss='mean_squared_error', optimizer='sgd', metrics='acc')
上面的模型怎么会被训练来给我们最好的 acc,因为在训练期间它会尝试最小化另一个函数 (MSE)。我知道,当已经训练时,模型的度量会给我们在训练期间找到的最好的acc。
我的疑问是:模型在训练期间的重点不应该是最大化 acc(或最小化 1/acc)而不是最小化 MSE?如果以这种方式完成,模型是否会为我们提供更高的准确度,因为它知道它必须在训练期间最大化它?
【问题讨论】:
度量标准accuracy
可以被认为是number_correct / total
。这是你所关心的。最后,您希望获得高精度。但是你怎么去那里?您不能反向传播值以获得准确性和更新。但是,您可以做的是使用损失函数来最小化。当您最大限度地减少损失时,您还可以提高准确性。想想sgd
做了什么。它往什么方向发展?它有什么作用?帮助找到最小值。为何如此?损失函数设计为易于求导是有原因的。您可能想先更好地了解 ANN 的工作原理。
【参考方案1】:
首先,您使用的代码 sn-p:
model.compile(loss='mean_squared_error', optimizer='sgd', metrics='acc')
实际上是invalid(尽管 Keras 不会产生任何错误或警告),原因很简单:MSE 是 regression 问题的有效损失,其中问题的准确性是没有意义的(它只对 分类 问题有意义,其中 MSE 不是有效的损失函数)。有关详细信息(包括代码示例),请参阅What function defines accuracy in Keras when the loss is mean squared error (MSE)? 中的自己的答案;对于 scikit-learn 中的类似情况,请在 this thread 中查看自己的答案。
继续您的一般问题:在回归设置中,通常我们不需要单独的性能指标,我们通常只使用损失函数本身来达到这个目的,即正确的代码您使用的示例只是
model.compile(loss='mean_squared_error', optimizer='sgd')
没有指定任何metrics
。我们当然可以使用metrics='mse'
,但这是多余的,并不是真正需要的。有时人们使用类似的东西
model.compile(loss='mean_squared_error', optimizer='sgd', metrics=['mse','mae'])
即根据 MSE 损失优化模型,但除 MSE 外,还展示了其平均绝对误差 (MAE) 的性能。
现在,你的问题:
模型在训练期间的重点不应该是最大化 acc(或最小化 1/acc)而不是最小化 MSE?
确实是有效的,至少在原则上是有效的(除了参考MSE),但仅适用于分类问题,大致来说,情况如下:我们不能使用庞大的武器库凸优化方法以直接最大化精度,因为精度不是可微函数;所以,我们需要一个代理可微函数来用作损失。这种适合分类问题的损失函数最常见的例子是cross entropy。
不出所料,您的这个问题会不时出现,尽管在上下文中略有不同;例如在
中查看自己的答案 Cost function training target versus accuracy desired goal Targeting a specific metric to optimize in tensorflow对于二进制分类特殊情况下损失和准确性之间的相互作用,您可能会在以下线程中找到我的答案有用:
Loss & accuracy - Are these reasonable learning curves? How does Keras evaluate the accuracy?【讨论】:
为什么精度不是微分函数?仅仅是因为number_correct
中的argmax
吗?如果是这样,也许可以使用更平滑的采样器使其可微分。以上是关于在 Keras 模型中优化准确性而不是损失的主要内容,如果未能解决你的问题,请参考以下文章
在 Keras 训练期间动态更改损失函数,无需重新编译优化器等其他模型属性
如何在 Keras 中绘制 MLP 模型的训练损失和准确度曲线?
TensorFlow 低级模型(没有 Keras 和 Sklearn) - 每一步都获得损失 = 0 和准确度 = 100%