'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
仅适用于信赖域类型的算法。
事实上,拟牛顿方法是一种更快的算法,但通常更快的算法需要更高的内存,而且通常非常大的问题只能通过更简单的优化来解决,等待更长时间(例如,神经网络只是使用梯度下降型算法)
我有这个结构来为优化问题设置求解器:
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
仅适用于信赖域类型的算法。
事实上,拟牛顿方法是一种更快的算法,但通常更快的算法需要更高的内存,而且通常非常大的问题只能通过更简单的优化来解决,等待更长时间(例如,神经网络只是使用梯度下降型算法)