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

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

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

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

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

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

Как проверить производные

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

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

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

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

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

Функции, определяющие цели и ограничения

Рассмотрим задачу минимизации функции Розенброка в единичном диске, как описано в Решении Ограниченной Нелинейной Задачи, Основанной на Решателе. The 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 вычисляет и Гессиан, но этот пример не использует Гессиан.

The 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

The 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...