Scipy.优化.最小化效率低下?双重调用成本/梯度函数

2024-10-01 00:35:03 发布

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

我对使用SciPy还比较陌生;我目前正在使用它来最小化多层感知器模型的成本函数。我不能使用scikit learn,因为我需要有能力设置系数(它们在MLPClassifer中是只读的)并向任何和所有参数添加随机排列和噪声。我还没有完成实现,但是我对最小化函数所需的参数感到困惑。你知道吗

例如,我编写了一个函数来计算函数的“代价”(能量最小化),它同时计算梯度。这没什么特别的,因为这是惯例。但是,打电话的时候scipy.优化.最小化,它要求两个不同的函数:一个返回要最小化的标量(即,在我的例子中是成本),另一个计算当前状态的梯度。示例:

j,grad = myCostFunction(X,y)

除非我弄错了,否则它似乎需要调用我的函数两次,每次调用都需要指定返回代价或梯度,如下所示:

opt = scipy.optimize.minimize(fun=myJFunction, jac=myGradFunction, args = args,...)

这不是在浪费计算时间吗?我的数据集将是>;100万个样本和10个特征,因此减少冗余计算将是首选,因为我将为我的项目培训和再培训这件事数万次。你知道吗

另一个混淆点是args输入。参数是这样传递的:

# This is what I expect happens
myJFunction(x0,*args)
myGradFunction(x0,*args)

或者像这样:

# This is what I wish it did
myJFunction(x0,arg0,arg1,arg2)
myGradFunction(x0,arg3,arg4,arg5)

提前谢谢!你知道吗


Tags: 函数参数isargsscipythiswhat成本
1条回答
网友
1楼 · 发布于 2024-10-01 00:35:03

在做了一些实验和搜索之后,我找到了我自己问题的答案。你知道吗

虽然我不能确定scipy.optimize.minimize函数,但是使用其他优化函数(例如,scipy.optimize.fmin_tnc)显式声明可调用函数func可以(1)返回能量和梯度,(2)返回能量并为参数fprime指定梯度函数(较慢),或者(3)只返回能量,让函数通过扰动估计梯度(慢得多)。你知道吗

参见此处的文档:https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.optimize.fmin_tnc.html

我很高兴看到我只能用一个函数返回两个参数。我假设minimize函数也是这种情况,但我还没有测试过它(请参见编辑1)

至于我的第二个问题,如果您指定了两个不同的函数,*args参数将被传递给两个函数;您不能为这两个函数指定单独的参数。你知道吗

编辑1:阅读minimize文档更多,如果参数jac设置为True,那么优化器假设func返回能量和梯度。仔细阅读这些文件似乎很有帮助。你知道吗

相关问题 更多 >