Scipy에서 실용적인 최적화를 위한 가이드(Scipy lecture notes 한국어 번역)

2.7.5. Scipy에서 실용적인 최적화를 위한 가이드



2.7.5.1. 기법 선택



모든 기술은 scipy.optimize.minimize()method 인수로 사용할 수 있습니다.



그라디언트가 알려지지 않은 경우 :


  • 일반적으로는, 수치적으로 구배를 근사할 필요가 있어도, BFGS 나 L-BFGS 가 바람직합니다.
    이들은 모두 method 인수를 생략했을 경우의 디폴트로, 문제에 구속 조건이나 경계가 있을지에 의해 선택됩니다.
  • 양호한 조건에서 Powell과 Nelder-Mead는 모두 그라디언트를 필요로하지 않고 고차원에서 잘 작동하지만 악조건 문제에서는 좌절합니다.

  • 기울기가 알려진 경우:



  • BFGS 또는 L-BFGS.
  • BFGS의 계산 오버헤드는 L-BFGS보다 크고 L-BFGS는 공액 구배법보다 크다. 반면에 BFGS는 대부분의 경우 CG에 비해 적은 함수 평가로 끝납니다. 따라서 공액 구배법은 함수의 계산 비용이 낮은 경우에는 BFGS보다 좋은 방법이라고 할 수 있습니다.

  • 헤세 행렬이 있는 경우:


  • 헤세 행렬을 계산할 수 있다면 뉴턴 방법 (Newton-CG 또는 TCG)이 선호됩니다.

  • 소음이 있는 측정값의 경우:



  • Nelder-Mead 또는 Powell을 사용합니다.

  • 2.7.5.2. 최적화 가속화


  • 올바른 기법을 선택하고 (위 참조) 가능한 경우 그라디언트와 헤세 행렬을 분석적으로 계산합니다.
  • 가능하면 전처리 을 이용합니다.
  • 초기값을 현명하게 선택합니다. 예를 들어, 많은 유사한 최적화를 한다면, 다른 결과로 워밍업한 점에서 시작합니다.
  • 정밀도가 필요하지 않으면 tol 인수를 사용하여 허용 오차를 푸십시오.

  • 2.7.5.3. 기울기 계산



    그라디언트 계산, 심지어 헤세 행렬 계산은 지루한 작업이지만 힘든 가치가 있습니다. 심피 에 의한 기호 계산은 도움이 될 수 있습니다.
    매우 흔한 최적화가 수렴하지 않는 원인은 그라디언트 계산에서 인간 오류입니다. scipy.optimize.check_grad() 을 사용하여 그라디언트가 올바른지 확인할 수 있습니다. 이 함수는 주어진 기울기와 수치적으로 계산 된 기울기의 차이의 규범을 반환합니다.
    >>> optimize.check_grad(f, jacobian, [2, -1])
    2.384185791015625e-07
    

    실수를 찾으려면 scipy.optimize.approx_fprime()도 참조하십시오.

    2.7.5.4. 종합 연습



    연습 문제: 단순(?) 2차 함수



    다음 함수를 K[0] 을 시작점으로 최적화합니다.

    np.random.seed(0)
    K = np.random.normal(size=(100, 100))
    
    def f(x):
        return np.sum((np.dot(K, x - 1))**2) + np.sum(x**2)**2
    

    시간을 측정해 봅시다. 가장 빠른 방법은? BFGS는 왜 잘 작동하지 않습니까?

    소스 코드



    2.7.4.10. Alternating optimization — Scipy lecture notes

    연습 문제: 국소적으로 편평한 최소값


    exp(-1/(.1*x**2 + y**2) 함수를 고려하십시오. 이 함수는 (0, 0) 에서 최소가 됩니다. (1, 1)의 초기 값부터 시작하여이 최소값에서 1e-8 이내가 될 때까지 시도해 봅시다.



    소스 코드



    2.7.4.5. Finding a minimum in a flat neighborhood — Scipy lecture notes

    관련 링크



    전 기사



    2.7.5. Practical guide to optimization with scipy — Scipy lecture notes

    이전 버전의 일본어 번역



    2.7.3. scipy에서 실용적인 최적화를 위한 가이드 — Scipy lecture notes

    좋은 웹페이지 즐겨찾기