0

我对使用 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)

提前致谢!

4

1 回答 1

0

经过一些实验和搜索,我找到了自己问题的答案。

虽然我不能确定该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返回能量和梯度。看来,彻底阅读文档很有帮助。

于 2019-10-10T21:18:30.567 回答