gpt4 book ai didi

python - 损失函数作为几个点的最小值,自定义损失函数和梯度

转载 作者:行者123 更新时间:2023-11-28 16:21:50 31 4
gpt4 key购买 nike

我正在尝试预测金属卷材的质量。我有宽度为 10 米,长度为 1 至 6 公里的金属线圈。作为训练数据,我每 10 米测量了约 600 个参数,以及最终的质量控制标记 - 好/坏(对于整个线圈)。坏意味着至少有 1 个地方有线圈坏了,没有数据到底在哪里。我有大约 10000 个线圈的数据。

假设我们要针对此数据(有 2 个因素)训练逻辑回归。

X = [[0, 0],
...
[0, 0],
[1, 1], # coil is actually broken here, but we don't know it yet.
[0, 0],
...
[0, 0]]

Y = ?????

我不能只将所有“坏”都放在 Y 中并运行分类器,因为我会对分类器感到困惑。我不能把所有的“好”和一个“坏”放在 Y 中,因为我不知道坏位置在哪里。

我想到的解决方案如下,我可以将损失函数定义为 sum( (Y-min(F(x1,x2)))^2 ) (由所有 F属于一个线圈) 而不是 sum( (Y-F(x1,x2))^2 )。在这种情况下,我可能会正确训练 F 以指出错误的地方。为此我需要梯度,不可能在所有点上计算它,最小值在所有地方都不可微分,但我可以改用弱梯度(使用在每个地方线圈中最小的函数值)。

我或多或少知道如何自己实现它,问题是使用 scikit-learn 在 python 中实现它的最简单方法是什么。理想情况下,它应该与几种学习方法(许多基于损失函数和梯度的方法)相同(或易于适应),是否可以为以这种方式工作的学习方法制作一些包装器?

更新:查看 gradient_boosting.py - 内部抽象类 LossFunction 具有计算损失和梯度的能力,看起来很有远见。看起来没有通用的解决方案。

最佳答案

你在这里考虑的是机器学习社区中众所周知的超集学习,意思是,你不是典型的监督设置,你有{(x_i, y_i)}形式的训练集有 {({x_1, ..., x_N}, y_1)} 这样您就知道集合中至少有一个元素具有属性 y_1。这不是一个很常见的设置,但通过一些可用的研究,可以通过谷歌搜索该领域的论文。

就您自己的损失函数而言 - scikit-learn 是不行的。 Scikit-learn 是关于简单性的,它为您提供了一小组随时可用的工具,但灵 active 很小。它不是研究工具,您的问题是研究性的。你可以用什么代替?我建议您使用任何符号微分解决方案,例如 autograd这使您能够通过 python 代码进行区分,只需应用 scipy.optimize.minimize在它之上,你就完成了!任何自定义损失函数都可以正常工作。

作为旁注 - 最小运算符不可微分,因此模型可能很难弄清楚发生了什么。你可以改为尝试做 sum((Y - prod_x F(x_1, x_2) )^2) 因为乘法是很好可微的,你仍然会得到类似的效果 - 如果至少有一个元素是预测为 0,它将从其余答案中删除任何“1”答案。您甚至可以更进一步使其在数值上更稳定并执行以下操作:

if Y==0 then loss = sum_x log(F(x_1, x_2 ) )
if Y==1 then loss = sum_x log(1-F(x_1, x_2))

转化为

Y * sum_x log(1-F(x_1, x_2)) + (1-Y) * sum_x log( F(x_1, x_2) )

您可以注意到与交叉熵成本的相似性,这非常有意义,因为您的问题确实是一个分类。现在你有了完美的概率损失——你将每个部分的概率附加为“坏”或“好”,所以整个对象坏的概率要么高(如果 Y==0)要么低(如果 Y= =1).

关于python - 损失函数作为几个点的最小值,自定义损失函数和梯度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39705175/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com