机器学习中的损失函数——如何约束?

机器算法验证 机器学习 优化 损失函数
2022-03-11 01:53:43

我的损失有两个部分,比如 L1 和 L2。我想最小化两者,同时我需要限制 L1 应该始终大于 L2(L1>L2)。以下是正确的吗?

损失 = L2 - L1

4个回答

这并不完全符合您的要求,但它是一个非常容易在 keras、tensorflow 和 pytorch 等神经网络库中实现的解决方案。

主要思想是在违反时对损失进行惩罚。每当时,就违反了这个不等式;另一方面,当时,我们根本不想惩罚损失。这描述了中的 ReLU 函数:L1>L2L2L1L1>L2L1,L2

minL1+L2+λReLU(L2L1)

超参数λ>0控制违反不等式的惩罚应该有多陡。

这种损失并不能保证满足不等式,但它是对单独最小化L1+L2

这种损失只是现代神经网络库中现成的函数的组合,因此很容易实现。

在评论中,jkpate提出以下建议:

请注意,如果您在上加入一个最大化,那么我们确实得到了海报所要求的内容,因为我们现在对原始约束优化问题有一个拉格朗日对偶的两人公式。本质上,我们允许违规的惩罚增加,而不是设置参见Cotter 等人。“Two-Player Games for Efficient Non-Convex Constrained Optimization”(2019 年)的理论和https://github.com/google-research/tensorflow_constrained_optimization的 Tensorflow 实现。λλ

如果我理解正确,这允许估计过程选择一个好的值,而不是用户提前固定一个特定的值并担心这个固定值是否是一个好的选择。λ

这可能会给你带来意想不到的结果。最小化你的损失将激励你的算法最小化 L2,但最大化L1。没有动力去最小化L1。

听起来你有一个约束最小化问题:最小化 L1+L2,服从 L1>L2。这在优化软件中很常见,但在 ML 拟合软件中则较少。如果可以对这样的约束进行建模,您可能需要以某种特定于工具的方式将其输入到您的建模器中。

不,这是不正确的。如果你想最小化两者,绝对应该写 L1+L2,而不是 L2-L1。

这是因为在 L2-L1 中,我们总是可以使 L1 很大(最大化 L1)以使最终的损失变小。

问题可以表述为

minimze  L1+L2
st. L2L1>0

在许多情况下,如果我们想强调一种损失而不是另一种损失,我们可以使用加权和,其中

minimze  αL1+(1α)L2

我会尝试遵循Kuhn-Tucker问题设置来进行不等式约束优化。以下是如何将其目标设置为拉格朗日:

L(x,λ)=L1(x)+L2(x)+λ(L2(x)L1(x))

您需要找到 \nabla L=0 的然后将是最佳值。通常,在优化中我们不喜欢鞍点,因为它们不是最优的。但是,在这种情况下,我们正在优化,而不仅仅是,所以鞍点是我们需要的。L=0xxλx

也许在你的神经网络中试验牛顿的方法优化器。与其他一些优化器(例如 SGD)不同,这个优化器被鞍点所吸引我喜欢@Sycorax 回答他使用 ReLU 的地方。但是,我相信如果您设法说服您的 NN 鞍点是可以的,那么拉格朗日会比 Kuhn-Tucker 拉格朗日更有效。原因是 ReLU 在的地方都会有一个平坦的梯度,所以收敛速度一定是相对较低的。在同一类型中,ReLU 显然是在任何 NN 中设置的明智之举。L1>L2