我有以下问题要解决:
给定一个函数,它将变量向量作为参数,找到最小化函数返回值的值。输入向量的大小介于10^3
和10^5
元素之间。未提供分析梯度公式。
听起来像scipy.optimize.minimize()
的问题;然而,由于数字变量和梯度函数的缺乏,计算速度非常慢,超过2000个参数不会收敛。
我有以下代码熟悉的代码(实际上使用它来进行图像注册,但问题更为笼统):
import numpy as np
from scipy import optimize
def opt_fun(smth1, smth2, con1, con2, con3, con4):
def inner_opt_fun(arguments):
arg1 = np.reshape(arguments[0:con1*con2], (con1, con2))
arg2 = np.reshape(arguments[con1*con2:], (con3, con4))
result = some_func(smth1, arg1, arg2)
error = calc_error(result, smth2)
return error
return inner_opt_fun
fun = opt_fun(smth1, smth2, con1, con2, con3, con4)
start_args = generate_start_arguments()
bounds = get_bounds() # define some bounds to solver
bounds = reshape_bound(bounds) # to get 1xN vector
options = some_options() # solver options
optimized = optimize.minimize(fun, start_args, bounds=bounds, options=options)
some_func
计算变量smth1
的转换。
calc_error
计算smth2
返回的result
和some_func
之间的某种错误。
通常,优化程序应该近似error
向量arguments
的渐变(或其他数量,这可能导致找到局部最小值)。
当向量start_args
的长度低于10时,此代码工作正常。但是,涉及的变量越多,optimize.minimize
函数执行的事情就越奇怪。在fun
的每次调用期间,它仅更改arguments
个向量的一个元素(缩放不是那里的问题 - 我在别处执行)。
例如,如果初始化的向量是[0, 0, 0, 0, 0, ... 0]
,则在第一次迭代后,优化器会尝试类似[1, 0, 0, 0, 0, 0, ... 0]
,然后[0, 1, 0, 0, 0, 0, ..., 0]
的内容 - 对我而言,这是相当强力的方法。
我尝试了不同的优化器(BFGS,L-BFGS-B,Powell,Nelder-Mead - 我不是数学家,所以不要真正理解它们是如何在里面工作的),但它们根本不会收敛到任何东西。 / p>
问题是 - 问题出在哪里?我该怎么做才能实现融合?