【发布时间】:2019-10-09 16:52:03
【问题描述】:
我对使用 SciPy 比较陌生;我目前正在使用它来最小化多层感知器模型的成本函数。我不能使用 scikit-learn,因为我需要能够设置系数(它们在 MLPClassifer 中是只读的)并向任何和所有参数添加随机排列和噪声。我还没有完成实现,但是我对最小化函数所需的参数感到困惑。
例如,我编写了一个函数来计算函数的“成本”(最小化能量),它同时计算梯度。这没什么特别的,因为它是常见的做法。然而,当调用 scipy.optimize.minimize 时,它要求两个不同的函数:一个返回要最小化的标量(即,在我的例子中的成本),另一个计算当前状态的梯度。示例:
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)
提前致谢!
【问题讨论】:
-
是的,计算
jac是有成本的,但如果它不必多次调用fun可能是值得的。使用渐变可以让它采取更大的步骤。这些权衡取舍已经在理论层面和编码层面进行了研究。 -
这两个定义做同样的事情。只要您使用 3 个
args元素,fun(x0, *args)和fun(x0, a,b,c)都可以工作。可以使用a,b,c = args解包*args参数。 -
@hpaulj 感谢您的回复。澄清一下,你是说如果我指定
jac它不会经常调用fun?我以为每次迭代都会调用两者。如果是这样的话,那我就不必像我想的那样担心了。我想仔细阅读源代码将有助于更清楚地说明问题。 -
每次迭代都必须调用它,但是,它可能不必做那么多迭代。您可能需要使用参数来找出最适合您的问题的组合。
标签: python scipy scipy-optimize-minimize