Main Content

시뮬레이션 또는 상미분 방정식 최적화하기

시뮬레이션 또는 ODE의 최적화란?

목적 함수와 비선형 제약 조건 함수의 값이 시뮬레이션이나 상미분 방정식(ODE)의 수치 해석을 통해서만 얻을 수 있는 경우가 있습니다. 이러한 최적화 문제는 잠재적인 문제와 해결 방법에 설명된 대로 몇 가지 일반적인 특징을 나타내며 해결할 과제를 포함합니다.

ODE를 최적화하는 문제 기반 예제는 최적화 변수를 사용하여 ODE 파라미터 피팅하기 항목을 참조하십시오. 솔버 기반 예제는 상미분 방정식(ODE) 피팅하기 항목을 참조하십시오.

다른 방법에서 발생하는 여러 문제를 피할 수 있는 방법을 보려면 Discretized Optimal Trajectory, Problem-Based 항목을 참조하십시오. 이 방법은 최적화 과정에서 자동 미분을 사용할 수 있습니다. 그러나 이 방법은 고정 스텝을 기반으로 하고 낮은 차수의 ODE 해 알고리즘을 사용하게 되기 때문에 상대적으로 정밀도가 낮을 수 있습니다.

Simulink® 모델을 손쉽게 최적화하려면 Simulink Design Optimization™을 사용해 보십시오.

잠재적인 문제와 해결 방법

유한 차분에서의 문제

Optimization Toolbox™ 솔버는 내부적으로 목적 함수와 제약 조건 함수의 도함수를 사용합니다. 기본적으로 이들 솔버는 다음 식의 유한 차분 근삿값을 사용하여 이러한 도함수를 추정합니다.

F(x+δ)F(x)δ

또는

F(x+δ)F(xδ)2δ.

이러한 유한 차분 근삿값은 다음과 같은 이유로 부정확할 수 있습니다.

  • δ 값이 크면 더 많은 비선형성이 유한 차분에 영향을 주게 됩니다.

  • δ 값이 작으면 수치 정밀도가 제한되어 부정확성을 초래합니다.

특히, 시뮬레이션과 ODE의 수치 해석의 경우:

  • 시뮬레이션은 일반적으로 파라미터의 작은 변화에 영향을 받지 않습니다. 즉, 너무 작은 섭동 δ를 사용하면 시뮬레이션을 통해 도함수가 잘못 추정되어 0이 반환될 수 있습니다.

  • 시뮬레이션과 ODE의 수치 해석은 모두 함수 실행에서 부정확성을 가질 수 있습니다. 이러한 부정확성은 유한 차분 근삿값에서 증폭될 수 있습니다.

  • ODE의 수치 해석은 기계 정밀도보다 훨씬 큰 값들에서 잡음을 유발합니다. 이 잡음은 유한 차분 근삿값에서 증폭될 수 있습니다.

  • ODE 솔버가 가변 스텝 크기를 사용할 경우 때때로 F(x + δ) 실행에서의 ODE 스텝 수가 F(x) 실행에서의 스텝 수와 다를 수 있습니다. 이 차이로 인해, 반환된 값들에서 허위 차이가 발생하여 도함수가 잘못 추정될 수 있습니다.

유한 차분에 관한 팁

직접 탐색을 사용하여 유한 차분 피하기.  Global Optimization Toolbox 라이선스가 있으면 patternsearch (Global Optimization Toolbox)를 솔버로 사용해 볼 수 있습니다. patternsearch는 기울기 추정을 시도하지 않으므로 유한 차분에서의 문제에 설명된 제한 사항의 영향을 받지 않습니다.

비용이 많이 드는(시간이 오래 걸리는) 함수 실행을 위해 patternsearch를 사용할 경우에는 다음과 같이 Cache 옵션을 사용하십시오.

options = optimoptions('patternsearch','Cache','on');

patternsearch를 사용할 수 없는 경우 비교적 낮은 차원의, 제약 조건이 없는 최소화 문제가 있으면 fminsearch를 대신 사용해 보십시오. fminsearch는 유한 차분을 사용하지 않습니다. 단, fminsearch는 속도가 빠르거나 조정 가능한 솔버가 아닙니다.

더 큰 유한 차분 설정하기.  경우에 따라, 디폴트 값보다 큰 유한 차분 스텝을 설정하여 유한 차분에서의 문제에 나와 있는 문제를 방지할 수 있습니다.

  • MATLAB® R2011b 이상을 사용하는 경우 다음과 같이 유한 차분 스텝 크기 옵션을 디폴트 값 sqrt(eps) 또는 eps^(1/3)보다 큰 값으로 설정하십시오.

    • R2011b–R2012b의 경우:

      options = optimset('FinDiffRelStep',1e-3);
    • R2013a–R2015b에서 이름이 'solvername'인 솔버 사용 시:

      options = optimoptions('solvername','FinDiffRelStep',1e-3);
    • R2016a 이상 버전에서 이름이 'solvername'인 솔버 사용 시:

      options = optimoptions('solvername','FiniteDifferenceStepSize',1e-3);

    서로 다른 성분에 각각 다른 스케일을 사용하는 경우 유한 차분 스텝 크기를 성분 스케일에 비례하는 벡터로 설정하십시오.

  • MATLAB R2011a 이하 버전을 사용하는 경우에는 다음과 같이 DiffMinChange 옵션을 디폴트 값 1e-8보다 큰 값으로 설정하고, DiffMaxChange 옵션도 설정할 수 있습니다.

    options = optimset('DiffMinChange',1e-3,'DiffMaxChange',1);

참고

이러한 유한 차분의 크기를 어떻게 설정할지 결정하기는 어렵습니다.

다음과 같이 중심 유한 차분을 설정해 볼 수도 있습니다.

options = optimoptions('solvername','FiniteDifferenceType','central');

기울기 계산 함수 사용하기.  유한 차분 추정의 문제를 방지하기 위해, 목적 함수와 비선형 제약 조건에 근사 기울기 함수를 제공할 수 있습니다. optimoptions를 사용하여 SpecifyObjectiveGradient 옵션을 true로 설정해야 하며, 해당하는 경우 SpecifyConstraintGradient 옵션도 true로 설정하십시오.

  • 일부 ODE의 경우, ODE를 푸는 동시에 기울기를 수치적으로 계산할 수 있습니다. 예를 들어, 목적 함수 z(t,x)에 대한 미분 방정식이 다음과 같다고 가정하겠습니다.

    ddtz(t,x)=G(z,t,x),

    여기서 x는 최소화하는 파라미터로 구성된 벡터입니다. x가 스칼라라고 가정합니다. 그러면 위 목적 함수의 도함수 y는 아래와 같고

    y(t,x)=ddxz(t,x)

    도함수에 대한 미분 방정식은

    ddty(t,x)=G(z,t,x)zy(t,x)+G(z,t,x)x,

    입니다. 여기서 z(t,x)는 목적 함수 ODE의 해입니다. z(t,x)와 동일한 연립미분방정식에서 y(t,x)의 해를 구할 수 있습니다. 이 해는 유한 차분을 사용하지 않아도 근사 도함수를 제공합니다. x가 비 스칼라인 경우에는 성분당 하나의 ODE를 풀어야 합니다.

    이 방법의 이론 및 계산에 대한 내용은 Leis와 Kramer의 문헌 [2]를 참조하십시오. 이 방법과 유한 차분 방법을 사용한 계산 경험에 대해서는 Raue 등의 문헌 [3]에 있는 그림 7을 참조하십시오.

  • 일부 시뮬레이션의 경우 시뮬레이션 내에서 도함수를 추정할 수 있습니다. 예를 들어, 가능도비 기법(Reiman과 Weiss의 문헌 [4]에 설명됨) 또는 무한소 섭동 분석 기법(Heidelberger, Cao, Zazanis, Suri의 문헌 [1]에 분석되어 있음)은 목적 함수나 제약 조건 함수를 추정하는 것과 동일한 시뮬레이션에서 도함수를 추정합니다.

더 엄격한 ODE 허용오차 사용하기.  odeset을 사용하여 ODE 솔버 허용오차 AbsTol 또는 RelTol을 디폴트 값보다 더 작은 값으로 설정할 수 있습니다. 그러나 너무 작은 허용오차를 선택하면 풀이 속도가 저하되거나, 수렴 오류 또는 다른 문제가 발생할 수 있습니다. RelTol에는 1e-9보다 작은 허용오차를 지정하지 마십시오. AbsTol의 각 성분에 대한 하한은 문제의 스케일에 따라 달라지므로, 별도의 지침이 없습니다.

확률적 함수에서의 문제

시뮬레이션이 난수를 사용하는 경우 목적 함수나 제약 조건 함수를 두 번 실행하면 각각 다른 결과가 반환될 수 있습니다. 이는 함수 추정과 유한 차분 추정에 모두 영향을 줍니다. 유한 차분의 값은 서로 다른 계산 지점 x와 x + δ로 인한 변동보다 임의성으로 인한 변동의 영향을 더 강하게 받을 수 있습니다.

확률적 함수에 관한 팁

시뮬레이션이 사용자가 제어하는 스트림의 난수를 사용하는 경우, 목적 함수나 제약 조건 함수를 실행하기 전에 매번 난수 스트림을 재설정하십시오. 이렇게 하면 결과의 변동성을 줄일 수 있습니다. 예를 들어, 목적 함수에 다음과 같이 지정합니다.

function f = mysimulation(x)
rng default % or any other resetting method
...
end

자세한 내용은 반복 가능한 난수 생성하기 항목을 참조하십시오.

목적 함수 및 제약 조건의 일반적인 계산

시뮬레이션은 흔히 동일한 시뮬레이션 실행 중에 목적 함수와 제약 조건을 모두 실행합니다. 그렇지 않으면 목적 함수와 비선형 제약 조건 함수가 모두 시간이 오래 걸리는 동일한 계산을 하게 됩니다. fmincon 같은 솔버는 목적 함수와 비선형 제약 조건 함수를 따로 실행합니다. 이 경우 솔버가 시간이 오래 걸리는 계산을 두 번 호출하므로 효율성이 크게 떨어질 수 있습니다. 이 문제를 방지하려면 Objective and Nonlinear Constraints in the Same Function에 설명된 기법을 사용하십시오. 또는 문제 기반 접근법을 사용할 때는 Objective and Constraints Having a Common Function in Serial or Parallel, Problem-Based 항목에 설명된 기법을 사용하십시오.

목적 함수 또는 제약 조건 함수의 실행 실패

일부 파라미터 값의 경우 시뮬레이션이나 ODE가 실패할 수 있습니다.

실행 실패에 관한 팁

적절한 범위 설정.  파라미터 공간에 대한 제한 사항을 모두 알지 못할 수 있지만, 모든 파라미터에 대한 적절한 범위(상한과 하한)를 설정해 보십시오. 그러면 최적화 속도가 향상될 뿐 아니라, 문제가 되는 파라미터 값을 솔버가 피할 수 있습니다.

범위를 준수하는 솔버 사용.  반복이 제약 조건을 위반할 수 있음에 설명되어 있는 것처럼, 일부 알고리즘은 중간 반복에서 범위 제약 조건을 위반할 수 있습니다. 시뮬레이션과 ODE를 최적화하려면 범위 제약 조건을 항상 준수하는 알고리즘을 사용하십시오. 범위 제약 조건을 충족하는 알고리즘 항목을 참조하십시오.

NaN 반환.  시뮬레이션 또는 ODE 솔버가 점 x에서 목적 함수나 비선형 제약 조건 함수를 성공적으로 실행하지 못할 경우, 함수에서 NaN을 반환하도록 하십시오. 대부분의 Optimization Toolbox 솔버와 Global Optimization Toolbox 솔버는 NaN 값을 발견할 경우 다른 반복 스텝을 시도하는 견고성을 갖고 있습니다. 다음과 같은 솔버가 이러한 견고한 솔버입니다.

  • fminconinterior-point, sqptrust-region-reflective 알고리즘

  • fminunc

  • lsqcurvefit

  • lsqnonlin

  • patternsearch

일부 사용자는 실패한 점, 실현불가능점 또는 기타 좋지 않은 점에서 임의의 큰 목적 함수 값을 반환할 생각을 할 수 있습니다. 그러나, 이 경우 솔버는 반환된 값이 임의 값임을 인식하지 못하므로 혼동할 수 있습니다. NaN을 반환하면 솔버가 다른 점에서 계산을 시도할 수 있습니다.

참고 문헌

[1] Heidelberger, P., X.-R. Cao, M. A. Zazanis, and R. Suri. Convergence properties of infinitesimal perturbation analysis estimates. Management Science 34, No. 11, pp. 1281–1302, 1988.

[2] Leis, J. R. and Kramer, M.A. The Simultaneous Solution and Sensitivity Analysis of Systems Described by Ordinary Differential Equations. ACM Trans. Mathematical Software, Vol. 14, No. 1, pp. 45–60, 1988.

[3] Raue, A. et al. Lessons Learned from Quantitative Dynamical Modeling in Systems Biology. Available at https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0074335, 2013.

[4] Reiman, M. I. and A. Weiss. Sensitivity analysis via likelihood ratios. Proc. 18th Winter Simulation Conference, ACM, New York, pp. 285–289, 1986.