Main Content

솔버가 성공했을 수 있는 경우

최종점과 초기점이 동일함

1차 최적성 측정값이 0에 가깝기 때문에 초기점이 국소 최솟값 또는 해인 것으로 보입니다. 솔버가 초기점을 개선하지 않았으므로 이 결과에 만족하지 않을 수 있습니다.

초기점이 실제로 국소 최솟값인지 확실하지 않은 경우 다음을 시도하십시오.

  1. 여러 다른 점에서 시작 — Change the Initial Point를 참조하십시오.

  2. 목적 함수와 제약 조건이 올바르게 정의되었는지 확인(예: 특정 점에서 올바른 값을 반환합니까?) — Check your Objective and Constraint Functions를 참조하십시오. 실현불가능점으로 인해 함수에 오류가 발생하지 않는지 확인합니다. Iterations Can Violate Constraints 항목을 참조하십시오.

  3. 허용오차 변경(예: OptimalityTolerance, ConstraintTolerance, StepTolerance) — Use Appropriate Tolerances를 참조하십시오.

  4. 각 좌표가 거의 동일한 효과를 갖도록 문제 스케일링 — 문제 다시 스케일링하기를 참조하십시오.

  5. 기울기 및 헤세 행렬 정보 제공 — 해석적 기울기 또는 야코비 행렬 제공하기헤세 행렬 제공하기를 참조하십시오.

국소 최솟값일 수 있음

솔버가 국소 최솟값에 도달했을 수 있지만 1차 최적성 측정값이 OptimalityTolerance 허용오차보다 작지 않기 때문에 확실하지 않을 수 있습니다. (1차 최적성 측정값에 대한 자세한 내용은 1차 최적성 측정값 항목을 참조하십시오.) 보고된 해가 신뢰할 수 있는지 확인하려면 다음 제안 사항을 고려하십시오.

1. 매끄럽지 않은 함수
2. 최종점에서 시작하여 다시 실행하기
3. 다른 알고리즘 사용해 보기
4. 허용오차 변경하기
5. 문제 다시 스케일링하기
6. 주변에 있는 점 확인하기
7. 유한 차분 옵션 변경하기
8. 해석적 기울기 또는 야코비 행렬 제공하기
9. 헤세 행렬 제공하기

1. 매끄럽지 않은 함수

매끄럽지 않은 함수를 최소화하려 하거나 매끄럽지 않은 제약 조건이 있는 경우 “국소 최솟값이 있을 수 있습니다”가 가장 좋은 종료 메시지가 될 수 있습니다. 이는 매끄럽지 않은 점에서 1차 최적성 조건이 적용되지 않기 때문입니다.

해가 적절하다는 것을 확인하려면 주변에 있는 점 확인하기를 시도해 보십시오.

2. 최종점에서 시작하여 다시 실행하기

최종점에서 최적화를 다시 시작하면 더 좋은 1차 최적성 측정값을 가진 해를 얻을 수 있습니다. 1차 최적성 측정값이 더 좋으면(더 낮으면) 더 신뢰할 만한 답이라 할 수 있는 근거가 더 많아집니다.

예를 들어, 예제 Using Symbolic Mathematics with Optimization Toolbox Solvers에서 가져온 다음 최소화 문제를 고려해 보겠습니다.

options = optimoptions('fminunc','Algorithm','quasi-newton');
funh = @(x)log(1 + (x(1) - 4/3)^2 + 3*(x(2) - (x(1)^3 - x(1)))^2);
[xfinal fval exitflag] = fminunc(funh,[-1;2],options)

Local minimum possible.

fminunc stopped because it cannot decrease the 
objective function along the current search direction.

xfinal =
    1.3333
    1.0370

fval =
  8.5265e-014

exitflag =
     5

종료 플래그 값 5는 1차 최적성 측정값이 함수 허용오차를 초과했음을 나타냅니다. xfinal에서 시작하여 다음과 같이 최적화를 다시 실행합니다.

[xfinal2 fval2 exitflag2] = fminunc(funh,xfinal,options)

Local minimum found.

Optimization completed because the size of the gradient is 
less than the default value of the function tolerance.

xfinal2 =
    1.3333
    1.0370

fval2 =
  6.5281e-014

exitflag2 =
     1

국소 최솟값이 “있을 수 있는 것”이 아니라 “있는 것”이고, 종료 플래그는 5가 아니라 1입니다. 두 해는 사실상 동일합니다. 그러나 1차 최적성 측정값이 3.9674e-006 대신에 7.5996e-007로 충분히 낮기 때문에 두 번째 실행에서 더 만족스러운 종료 메시지를 얻었습니다.

3. 다른 알고리즘 사용해 보기

사용자는 여러 솔버에서 알고리즘을 선택할 수 있습니다. 다른 알고리즘은 다른 중지 기준을 사용할 수 있습니다.

예를 들어, 최종점에서 시작하여 다시 실행하기는 첫 번째 실행에서 종료 플래그 5를 반환합니다. 이 실행은 quasi-newton 알고리즘을 사용합니다.

trust-region 알고리즘에는 사용자 제공 기울기가 필요합니다. betopt.m은 목적 함수와 기울기의 계산을 포함하고 있습니다.

function [f gradf] = betopt(x)

g = 1 + (x(1)-4/3)^2 + 3*(x(2) - (x(1)^3-x(1)))^2;
f = log(g);
gradf(1) = 2*(x(1)-4/3) + 6*(x(2) - (x(1)^3-x(1)))*(1-3*x(1)^2);
gradf(1) = gradf(1)/g;
gradf(2) = 6*(x(2) - (x(1)^3 -x(1)))/g;

trust-region 알고리즘을 사용하여 최적화를 실행하면 다른 종료 플래그를 얻게 됩니다.

options = optimoptions('fminunc','Algorithm','trust-region','SpecifyObjectiveGradient',true);
[xfinal3 fval3 exitflag3] = fminunc(@betopt,[-1;2],options)

Local minimum possible.

fminunc stopped because the final change in function value 
relative to its initial value is less than the default value 
of the function tolerance.

xfinal3 =
    1.3333
    1.0370

fval3 =
  7.6659e-012

exitflag3 =
     3

종료 조건이 quasi-newton 조건보다는 더 좋지만 그래도 아직 가장 좋은 것은 아닙니다. 최종점에서 알고리즘을 다시 실행하면 매우 작은 1차 최적성 측정값을 가진 더 좋은 점을 얻을 수 있습니다.

[xfinal4 fval4 eflag4 output4] = fminunc(@betopt,xfinal3,options)

Local minimum found.

Optimization completed because the size of the gradient is 
less than the default value of the function tolerance.

xfinal4 =

    1.3333
    1.0370

fval4 =
     0

eflag4 =
     1

output4 = 
         iterations: 1
          funcCount: 2
       cgiterations: 1
      firstorderopt: 7.5497e-11
          algorithm: 'trust-region'
            message: 'Local minimum found.

Optimization completed because the size o...'
    constrviolation: []

4. 허용오차 변경하기

가끔은 허용오차를 엄격하게 하거나 느슨하게 하는 것이 더 만족스러운 결과를 만들어냅니다. 예를 들어, 다른 알고리즘 사용해 보기 섹션에서 OptimalityTolerance의 더 작은 값을 선택합니다.

options = optimoptions('fminunc','Algorithm','trust-region',...
    'OptimalityTolerance',1e-8,'SpecifyObjectiveGradient',true); % default=1e-6
[xfinal3 fval3 eflag3 output3] = fminunc(@betopt,[-1;2],options)

Local minimum found.

Optimization completed because the size of the gradient is 
less than the selected value of the function tolerance.

xfinal3 =
    1.3333
    1.0370

fval3 =
     0

eflag3 =
     1

output3 = 
         iterations: 15
          funcCount: 16
       cgiterations: 12
      firstorderopt: 7.5497e-11
          algorithm: 'trust-region'
            message: 'Local minimum found.

Optimization completed because the size...'
    constrviolation: []

fminunc가 이전보다 한 번 더 반복하여 더 좋은 해에 도달했습니다.

5. 문제 다시 스케일링하기

각 좌표가 목적 함수와 제약 조건 함수에 거의 동일한 효과를 갖도록 문제를 정규화하십시오. 예를 들어, 문제 정규화하기를 참조하십시오.

6. 주변에 있는 점 확인하기

목적 함수와 제약 조건이 있는 경우 최종점 주변에 있는 점에서 목적 함수와 제약 조건을 평가하십시오. 최종점이 국소 최솟값인 경우, 주변에 있는 실현가능점은 더 큰 목적 함수 값을 가집니다. 예를 들어, Check Nearby Points를 참조하십시오.

Global Optimization Toolbox 라이선스가 있는 경우 최종점에서 patternsearch (Global Optimization Toolbox) 솔버를 실행합니다. patternsearch는 주변에 있는 점을 검토하고 모든 유형의 제약 조건을 받아들입니다.

7. 유한 차분 옵션 변경하기

중심 유한 차분은 실행하는 데 더 많은 시간이 걸리지만 훨씬 더 정확합니다. 문제가 높은 곡률을 가질 수 있는 경우에는 중심 차분을 사용하십시오.

명령줄에서 중심 차분을 선택하려면 optimoptions를 사용하여 'FiniteDifferenceType'을 디폴트 값인 'forward'가 아니라 'central'로 설정하십시오.

8. 해석적 기울기 또는 야코비 행렬 제공하기

기울기 또는 야코비 행렬을 제공하지 않으면 솔버가 유한 차분으로 기울기와 야코비 행렬을 추정합니다. 따라서, 이러한 도함수를 제공하면 계산 시간을 절약하고 정확도를 높일 수 있습니다. 문제 기반 접근법에서는 기울기가 자동으로 제공될 수 있습니다. Automatic Differentiation in Optimization Toolbox 항목을 참조하십시오.

제약 조건이 있는 문제에 대해 기울기를 제공하면 또 다른 이점을 얻을 수 있습니다. 솔버는 x가 실현가능점이 되는 x에 도달할 수 있지만, x 주위의 유한 차분으로 인해 항상 실현불가능점에 이르게 됩니다. 이 경우, 솔버가 실패하거나 도중에 중단될 수 있습니다. 기울기를 제공하면 솔버가 계속 진행할 수 있습니다.

목적 함수와 비선형 제약 조건 함수의 파일에 기울기 또는 야코비 행렬을 제공하십시오. 구문에 대한 자세한 내용은 스칼라 목적 함수 작성하기, 벡터 및 행렬 목적 함수 작성하기, 비선형 제약 조건 항목을 참조하십시오.

기울기 또는 야코비 행렬 함수가 올바른지 확인하려면 Checking Validity of Gradients or Jacobians에 설명된 대로 CheckGradients 옵션을 사용하십시오.

Symbolic Math Toolbox™ 라이선스가 있는 경우 기울기와 헤세 행렬을 프로그래밍 방식으로 계산할 수 있습니다. 예제는 Calculate Gradients and Hessians Using Symbolic Math Toolbox 항목을 참조하십시오.

기울기와 야코비 행렬을 사용하는 예제는 기울기와 헤세 행렬을 사용한 최소화, Nonlinear Constraints with Gradients, Calculate Gradients and Hessians Using Symbolic Math Toolbox, Solve Nonlinear System Without and Including Jacobian, Large Sparse System of Nonlinear Equations with Jacobian 항목을 참조하십시오. 문제 기반 접근법에서의 자동 미분에 대한 자세한 내용은 Effect of Automatic Differentiation in Problem-Based Optimization 항목을 참조하십시오.

9. 헤세 행렬 제공하기

헤세 행렬을 제공하는 경우 솔버가 대개 더 안정적으로 실행되고 반복 횟수가 더 적습니다.

헤세 행렬을 받는 솔버와 알고리즘은 다음과 같습니다.

Symbolic Math Toolbox 라이선스가 있는 경우 기울기와 헤세 행렬을 프로그래밍 방식으로 계산할 수 있습니다. 예제는 Calculate Gradients and Hessians Using Symbolic Math Toolbox 항목을 참조하십시오. 문제 기반 접근법에서 헤세 행렬을 제공하려면 Supply Derivatives in Problem-Based Workflow 항목을 참조하십시오.

Calculate Gradients and Hessians Using Symbolic Math Toolbox의 예제는 fmincon이 헤세 행렬이 없는 경우 77번 반복하지만 헤세 행렬이 있는 경우 19번만 반복한다는 것을 보여줍니다.