exponenta event banner

Проверка достоверности градиентов или якобианцев

Проверка градиента или якобиана в целевой функции

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

  • Если компонент функции градиента меньше 1, «совпадение» означает абсолютную разность градиентной функции и конечноразностное приближение этой составляющей меньше, чем 1e-6.

  • В противном случае, «match» означает, что относительная разница меньше, чем 1e-6.

CheckGradients опция вызывает проверку решателем поставляемой производной по аппроксимации конечных разностей только в одной точке. Если конечное различие и поставляемые производные не совпадают, решатель ошибается. Если производные соответствуют в пределах 1e-6решатель сообщает о вычисленных различиях и продолжает итерацию без дальнейших проверок производных. Решатели проверяют совпадение в точке, которая является небольшим случайным возмущением начальной точки x0, изменен, чтобы быть в пределах любых границ. Решатели не включают вычисления для CheckGradients в подсчете функций; см. Итерации и подсчеты функций.

Проверка дериватов

В командной строке MATLAB ®:

  1. Установите SpecifyObjectiveGradient или SpecifyConstraintGradient опции для true использование optimoptions. Убедитесь, что целевые функции или функции ограничения предоставляют соответствующие производные.

  2. Установите CheckGradients опция для true.

Центральные конечные разности более точны, чем прямые конечные разности по умолчанию. Для использования центральных конечных различий в командной строке MATLAB установите FiniteDifferenceType опция для 'central' использование optimoptions.

Пример: Проверка производных целевых функций и функций ограничения

Функции цели и ограничения

Рассмотрим проблему минимизации функции Розенброка в диске блока, как описано в разделе Решение ограниченной нелинейной проблемы на основе решателя. rosenboth функция вычисляет целевую функцию и ее градиент:

function [f g H] = rosenboth(x)

f = 100*(x(2) - x(1)^2)^2 + (1-x(1))^2;

if nargout > 1
    g = [-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1));
        200*(x(2)-x(1)^2)];
    
    if nargout > 2
        H = [1200*x(1)^2-400*x(2)+2, -400*x(1);
            -400*x(1), 200];  
    end
end

rosenboth вычисляет и гессен, но в этом примере гессен не используется.

unitdisk2 функция правильно вычисляет функцию ограничения и ее градиент:

function [c,ceq,gc,gceq] = unitdisk2(x)
c = x(1)^2 + x(2)^2 - 1;
ceq = [ ];

if nargout > 2
    gc = [2*x(1);2*x(2)];
    gceq = [];
end

unitdiskb функция неправильно вычисляет градиент функции ограничения:

function [c ceq gc gceq] = unitdiskb(x)
c = x(1)^2 + x(2)^2 - 1;
ceq = [ ];

if nargout > 2
    gc = [x(1);x(2)]; % Gradient incorrect: off by a factor of 2
    gceq = [];
end

Проверка производных в командной строке

  1. Задайте опции для использования алгоритма внутренней точки, градиента функций цели и ограничения и CheckGradients вариант:

    % For reproducibility--CheckGradients randomly perturbs the initial point
    rng(0,'twister'); 
    options = optimoptions(@fmincon,'Algorithm','interior-point',...
        'CheckGradients',true,'SpecifyObjectiveGradient',true,'SpecifyConstraintGradient',true);
  2. Решение проблемы минимизации с помощью fmincon с использованием ошибочного unitdiskb функция ограничения:

    [x fval exitflag output] = fmincon(@rosenboth,...
       [-1;2],[],[],[],[],[],[],@unitdiskb,options);
    ____________________________________________________________
       Derivative Check Information  
    
    Objective function derivatives:
    Maximum relative difference between user-supplied 
    and finite-difference derivatives = 1.84768e-008.
    
    Nonlinear inequality constraint derivatives:
    Maximum relative difference between user-supplied 
    and finite-difference derivatives = 1.
     User-supplied constraint derivative element (2,1):     1.99838
     Finite-difference constraint derivative element (2,1): 3.99675
    ____________________________________________________________
    
    Error using validateFirstDerivatives
    Derivative Check failed:
    User-supplied and forward finite-difference derivatives
    do not match within 1e-006 relative tolerance.
    
    Error in fmincon at 805
        validateFirstDerivatives(funfcn,confcn,X, ...

    Функция ограничения не соответствует вычисленному градиенту, что позволяет проверить функцию на наличие ошибки.

  3. Замените unitdiskb функция ограничения с unitdisk2 и запустите минимизацию еще раз:

    [x fval exitflag output] = fmincon(@rosenboth,...
       [-1;2],[],[],[],[],[],[],@unitdisk2,options);
    
    ____________________________________________________________
       Derivative Check Information  
    
    Objective function derivatives:
    Maximum relative difference between user-supplied 
    and finite-difference derivatives = 1.28553e-008.
    
    Nonlinear inequality constraint derivatives:
    Maximum relative difference between user-supplied 
    and finite-difference derivatives = 1.46443e-008.
    
    Derivative Check successfully passed.
    ____________________________________________________________
    
    
    Local minimum found that satisfies the constraints...