'HessPattern' 不能在 matlab 中工作?

'HessPattern' not working in matlab?

我有这个结构来为优化问题设置求解器:

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 仅适用于信赖域类型的算法。

事实上,拟牛顿方法是一种更快的算法,但通常更快的算法需要更高的内存,而且通常非常大的问题只能通过更简单的优化来解决,等待更长时间(例如,神经网络只是使用梯度下降型算法)