최적화 / Optimization
찾아내기
- 그 지점에서의 미분값이 0인 지점
- 2차 미분값이 0보다 크면 최솟값, 2차 미분값이 0보다 작으면 최대값이다.
Objective Function
Multimodal Function
- 1개를 초과하는 최소, 최대값을 가지는 함수
![](https://velog.velcdn.com/images/ilov1112/post/748570af-e131-499f-9d03-9ee345458dcb/image.png)
- 가장 높은 지점 : Global Maximum
- 가장 낮은 지점 : Global Minimum
- 최대 값 : Local Maximum
- 최소 값 : Local Minimum
![](https://velog.velcdn.com/images/ilov1112/post/12e3e159-1375-4596-b541-6c7cf569f8dc/image.png)
Global Maximum/Minimum 을 찾는 방법
- 최대/최소 값을 찾아나가며 계속 Global 값을 설정한다.
![](https://velog.velcdn.com/images/ilov1112/post/dbf6e39b-3a80-4dc3-b2b8-c9bb40148c59/image.png)
황금비
두 길이 L1 L2 에 대해 L1L1+L2=L2L1 를 만족하면 L1 과 L2 는 황금비 L2L1 를 가진다.
값은 대략 1.618
![](https://velog.velcdn.com/images/ilov1112/post/2626ac8d-a3d0-445e-a689-357f585cc8c8/image.png)
Golden Section Search
• The key is making this approach efficient by choosing
intermediate points wisely thus minimizing the function
evaluations by replacing the old values with new values.
- 최대/최소값의 앞뒤에 위치하는 xl, xu 두 포인트를 고른다.
1-1. 이 두 점은 아래 속성을 만족해야 한다.
- 두 점 사이에 최대값을 찾기 위해 중간에 점을 두개 고른다.
2-2. 위 두 점은 x1(xl+d) 와 x2(xu−d) 이며, d는 (황금비−1)(xu−xl)이다.
즉, 전체 구간의 61.8% 정도가 된다.
최대값을 구할 경우
- 두 점중 함수값이 큰 점을 포함하는 세 점의 구간이 최대값을 포함할 것이므로, 함수값이 적은 점과 끝점이 포함하는 구간을 제외한다.
![](https://velog.velcdn.com/images/ilov1112/post/ae466f79-1bb9-4753-be37-d06316c6068c/image.png)
위 경우 x_1이 더 함수값이 크기 때문에 x_2와 x_l이 포함하는 구간을 제외한다.
최소값을 구할 경우
- 두 점중 함수값이 작은 점을 포함하는 세 점의 구간이 최소값을 포함할 것이므로, 함수값이 큰 점과 끝점이 포함하는 구간을 제외한다.
![](https://velog.velcdn.com/images/ilov1112/post/ccddd81c-d2ac-4598-9d33-2fb98a1609c2/image.png)
위 경우 x_2가 함수값이 더 작기 때문에 x__1과 x_u가 이루는 구간을 제외한다.
상대오차
- 상대오차가 지정한 오차보다 작아질때까지 위를 반복하게 된다.
- x_opt 는 x_1과 x_2 중 함수값이 작은/큰 것을 의미한다 ( 즉, 최대/최소값을 포함하는 구간에 있는 점의 위치 )
상대오차 = (2−golden−ratio)∣xoptxu−xl∣
Parabolic Interpolation
- 함수에서 세 점을 찾는다.
- 세 점을 잇는 포물선 식을 유도한다.
- 만들어진 포물선을 미분하여 0인지점 ( 최대/최소값이 있는 지점 ) 을 찾는다.
- 세 점중 3에서 찾은 점을 포함하는 두 점을 찾는다.
- 두 점과 미분값이 0이 되는 점으로 새로 2로 진행한다.
3의 값을 구하는 공식
![](https://velog.velcdn.com/images/ilov1112/post/6bb93bce-436a-460c-967b-f7941c3d34f8/image.png)
Newton's Method
- 극대/극소 값은 1차 미분식의 값이 0이 되는 점으로도 알수 있다.
- 이 속성을 이용해, 뉴튼 렙슨 방식으로 극대/극소 값의 위치를 찾을수 있다.
Brent's Method
- Parabolic 방식을 쓰다가 안되면 Golden section 방식을 사용한다.
2차원 극대/극소 값 찾기
![](https://velog.velcdn.com/images/ilov1112/post/924ba294-5f42-4f48-986d-8bd4c44dccaf/image.png)
Random Search
- 랜덤한 (x, y) 점을 대입해 최댓값을 갱신하며 찾는다.
Univariate Pattern Search
- 한번에 한개의 변수를 바꿔가며 값이 증가하게 이동한다.
- 아래의 예시를 보면 알수 있겠지만, x값이나 y값중 하나만 변하기에 탐색이 축에 평행하게 이루어진다.
![](https://velog.velcdn.com/images/ilov1112/post/7d2c0a35-f665-40b4-8892-170c657f7fd6/image.png)
Powell's Method
- 시작점 하나와 두개의 방향을 선택한다.
![](https://velog.velcdn.com/images/ilov1112/post/3b8f6f13-d82a-4bff-b8b5-39620ce2d801/image.png)
- 시작점과 h1 방향을 기준으로 하여 1차원 최적화를 진행해 최대값을 찾는다.
![](https://velog.velcdn.com/images/ilov1112/post/b09acabd-16c5-4ad8-90dc-7432b760d397/image.png)
- 찾은 점과 h2 방향을 기준으로 또 1차원 최적화를 진행한다.
![](https://velog.velcdn.com/images/ilov1112/post/0cff5850-aae2-4fbc-bbb4-175dc876acd7/image.png)
- 시작점과 3에서 찾은 최대값의 점을 잇는 방향 h3을 하나 더 찾는다.
![](https://velog.velcdn.com/images/ilov1112/post/c216358a-74c1-44b6-b59d-8160ed2ca2a6/image.png)
- 찾은 선을 기준으로 또 1차원 최적화를 진행해 최대값이 있는곳을 찾는다.
![](https://velog.velcdn.com/images/ilov1112/post/e4e48cb2-fe85-4ab6-a7e6-737473f53d2b/image.png)
- 찾은 점에서 h2 방향을 기준으로 하여 최대값이 있는곳을 찾는다.
![](https://velog.velcdn.com/images/ilov1112/post/6add422a-f6ed-4233-9b3a-b7bb12794f9c/image.png)
반복..
- 즉, 찾아놓은 최대값들의 점들을 이어 새로운 방향을 만들거나, 이전 방향을 그대로 이용해 1D 최적화를 계속 진행해 나간다.
Gradient Method
- 미분을 사용한다.
- 시작점을 찾고, 그 점에서 가장 가파르게 올라가는 벡터를 찾아 그 방향으로 올라가고, 또 다른벡터를 찾아 올라가는 과정을 반복한다.
- 가파르게 올라가는 벡터는 각각 x에 대해 미분한 값과 y에 대해 미분한 값으로 이루어진다.
- 또 이는 함수의 등고선과 직각한다.
![](https://velog.velcdn.com/images/ilov1112/post/eebd929f-3bec-4065-8647-f99b26f481a1/image.png)
- 점에서 방향 * (한번에 이동할 길이) 를 더해 진행된다.
![](https://velog.velcdn.com/images/ilov1112/post/c51d204b-12c3-489e-a50f-e893f140464f/image.png)
- 찾은 방향벡터 f (x, y) 를 역탄젠트에 atan(xy)로 하면 라디안 기준 각도를 찾을수 있다.
이동 거리
- 주어진 방향벡터로 1의 거리만큼 이동한다.
![](https://velog.velcdn.com/images/ilov1112/post/34f2093d-9a31-4a82-ab75-c212fda587d4/image.png)
- (4, 8) f 벡터 기준 x 이동, y 이동 값 계산 예시
- atan(8/4) = 1.107
값 예측
![](https://velog.velcdn.com/images/ilov1112/post/4af38caa-31d4-497f-bc1b-cd315da93f55/image.png)
- 단위 이동 후의 결과를 위 공식으로 대략 예측 가능하다.
- x에대한 미분값 * cos + y에 대한 미분값 * sin
![](https://velog.velcdn.com/images/ilov1112/post/1d0fd0d8-c5ce-4b77-836d-da0d9f499488/image.png)
- 예측값과 실제값을 계산하는 예시
Hessian
- 다변수함수의 극값의 극대, 극소, Saddle을 판정한다.
![](https://velog.velcdn.com/images/ilov1112/post/43bb02a8-09ee-479c-84d9-223181fafe83/image.png)
- x기준 2번미분값 * y기준 2번미분값 - ( x와 y에 대해 미분한 값 ) ^ 2
- 첫항은 2차 미분값을 의미한다!!!
- H가 0보다 크면 극대, 극소값을 가지며, x의 2차 미분값이 0보다 크면 극소값을, x의 2차 미분값이 0보다 작으면 극대값을 가진다.
- H가 0보다 작으면 Saddle point 를 가지게 된다.
Saddle
![](https://velog.velcdn.com/images/ilov1112/post/aded7a06-a2fe-4775-a072-27c893f866bc/image.png)
- 위 그래프에서 빨간색 점은 x로 미분했을때 최소, y로 미분했을때는 최대인 점이 된다.
- 빨간점을 Saddle point 로 부른다.
Steepest Ascent Method
- Gradient method 에서 찾은 방향벡터를 기준으로 값이 감소하기 전까지 계속 이동해 최대값에 도달하면 방향벡터를 다시 찾는다.
![](https://velog.velcdn.com/images/ilov1112/post/d839841a-217e-41c2-b19f-81fcf7a68ba7/image.png)
- h = 이동하는 거리
- 이동하는 거리를 기준으로, 두 변수 x, y으로 구성되었던 함수가 단일변수 함수가 되었다.
![](https://velog.velcdn.com/images/ilov1112/post/585c005b-980d-4a9f-83a1-2c53adc27399/image.png)
- h에 대한 그래프, 값이 최대가 되도록 하는 h의 값을 찾을수 있다.
- 여기서 찾은 h값 만큼 이동하고 다시 방향벡터를 찾아 반복한다.
![](https://velog.velcdn.com/images/ilov1112/post/13204fdc-958b-4ddb-bab3-76fcc9f61fa7/image.png)
라그랑주 보간법
아이디어
- 특정 숫자를 대입하면 0이나 1의 값을 갖는 항을 만든다.
- (x-a)를 곱해주면 x에 a값을 대입할 때 0이 된다.
- (x-a)를 (b-a)로 나누면, x에 b를 대입했을 때 1이 된다.
![](https://velog.velcdn.com/images/ilov1112/post/64b1084e-6736-4282-8ede-bfc62917331f/image.png)
![](https://velog.velcdn.com/images/ilov1112/post/e8207ea9-e93b-4861-9c4d-b9d5cb56fbd2/image.png)
뮬러법
- 방정식의 근을 찾는다.
- 세개의 점을 지나는 2차식의 근을 이용해 방정식의 근을 찾는다.
- 찾은 2차식의 두개의 근 중에서 중간 점과 가까운 근을 찾는다.
![](https://velog.velcdn.com/images/ilov1112/post/9ac2d7ea-072d-459e-860b-eb152415dd46/image.png)
- 찾은 근을 중심으로 앞 뒤 점으로 세개의 점을 구성한다.
- 새롭게 2차식의 근을 찾아준다.
Inverse Quadratic Interpolation
- y = f(x) 가 있다.
- f(x) = 0 일때 x는 근이 된다.
- f의 역함수 g에 대해 g(0) = x가 된다.
- 즉 g(0)이 근이다!
![](https://velog.velcdn.com/images/ilov1112/post/1e7c8cfd-d199-47ff-b5fb-5aa194adc6e0/image.png)
![](https://velog.velcdn.com/images/ilov1112/post/72bba63d-3c84-4976-8a24-0d998a6b9dad/image.png)
- 초기 근 x0, x1, x2를 설정합니다.
- 현재 근 x를 계산
- f(x)의 절대값을 e로 설정합니다.
- x가 근일 경우 f(x)가 0이 되어야 하기 때문이다.
- err가 허용 오차 tol보다 작으면 반복을 종료합니다.
- x0, x1, x2를 각각 x1, x2, x로 업데이트합니다.