损失函数为若干点的最小值,自定义损失函数和梯度

2024-05-15 23:32:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我在试着预测金属线圈的质量。我有一个宽10米,长1到6公里的金属线圈。作为培训数据,我有大约600个参数,每10米测量一次,最后的质量控制标记-好/坏(整个线圈)。坏的意思是至少有一个地方有线圈是坏的,没有确切的数据在哪里。我有大约10000卷的数据。在

假设我们要为这个数据训练logistic回归(带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 = ?????

我不能把所有的“bad”都放在Y中然后运行分类器,因为对于分类器,我会感到困惑。我不能把所有的“好”和“坏”都写在你身上,因为我不知道哪里是坏的位置。在

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

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

更新:查看渐变_增压.py-内部有抽象类LossFunction,具有计算损耗和梯度的能力,具有透视效果。看来没有共同的解决办法。在


Tags: 数据方法函数参数分类器地方质量情况
1条回答
网友
1楼 · 发布于 2024-05-15 23:32:23

在机器学习社区中,您正在考虑的是超集学习,这意味着,不是典型的有监督的设置,您有{(x_i,y_i)}形式的训练集,而是{({x_1,…,x_N},y_1)},这样你就知道集合中至少有一个元素具有属性y_1。这不是一个很常见的设置,但现有的一些研究,谷歌在该领域的论文。在

就你自己的损失函数而言,scikit learn是不可能的。Scikit learn是关于简单性的,它为您提供了一套非常灵活的现成工具。它不是一个研究工具,你的问题是研究。你能用什么代替?我建议您使用任何符号微分解决方案,例如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))

也就是说

^{pr2}$

您可以注意到与交叉熵成本的相似性,因为您的问题确实是一个分类。现在你有了完美的概率损失,你把每个片段的概率都附加到“坏”或“好”上,所以整个物体坏的概率要么高(如果Y==0)要么低(如果Y==1)。在

相关问题 更多 >