«HessPattern» не работает в Matlab? - PullRequest
0 голосов
/ 29 августа 2018

У меня есть эта структура для настройки решателя для задачи оптимизации:

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

>> 

1 Ответ

0 голосов
/ 29 августа 2018

Как обсуждалось в комментариях: похоже, что для подхода квази-ньютона потребуется вся матрица Гессе и что HessPattern доступно только для алгоритмов типа доверительной области.

Действительно, подход квази-ньютона является более быстрым алгоритмом, но обычно более быстрые алгоритмы требуют большей памяти, и часто очень большие проблемы могут быть решены только с помощью более простой оптимизации, дольше ожидая (например, нейронные сети просто решаются с использованием градиентного спуска) типа)

...