我有这个结构来为优化问题设置求解器:
option = optimoptions(@fminunc,...
'Display','iter','GradObj','on','MaxIter',30,...
'ObjectiveLimit',10e-10,'Algorithm','quasi-newton','HessPattern',sparseH);
这样的设置对我来说似乎很好,但是当我通过调用运行我的求解器时
[P, FVAL, INFO, OUTPUT, GRAD, HESS] = fminunc (@myFunc,X0(:),option);
(字面意思是下一个电话(,我收到错误
Requested 254016x254016 (480.7GB) array exceeds maximum array size preference. Creation of arrays greater than this limit may
take a long time and cause MATLAB to become unresponsive. See array size limit or preference panel for more information.
但是我sparseH
是
>> whos sparseH
Name Size Bytes Class Attributes
sparseH 254016x254016 87043112 double sparse
此外,如果我设置trust-regions
而不是quasi-newton
算法运行。尽管对于较小的输入,我实际上可以看到quasi-newton
更快。
我设置错了什么吗?
为了更好地检查我做了
>> A = sparseH(1:100,1:100);
>> sum(A(:))
ans =
(1,1) 880
>> size(A)
ans =
100 100
>>
所以我有一个不到 1000 个,在一个总共有 10000 个条目的子矩阵中。也总计
>> sum(sparseH(:))
ans =
(1,1) 5313186
>> prod(size(sparseH))
ans =
6.4524e+10
>>
正如评论中所讨论的:准牛顿方法似乎需要整个Hessian矩阵,并且HessPattern
仅适用于信任区域类型的算法。
事实上,准牛顿方法是一种更快的算法,但通常更快的算法需要更高的内存,并且通常非常大的问题只能通过更简单的优化来解决,通过等待更长的时间(例如,神经网络只是使用梯度下降型算法求解(