페이지

2022년 10월 2일 일요일

29.1 뉴턴 방법을 활용한 최적화 이론

 이번 단계의 목표는 뉴턴 방법을 활요한 최적화를 구현하는 것입니다. 경사하강법 대신 뉴턴 방법을 사용하여 실제로 더 빨리 수렴하는지 확인할 것입니다. 참고로 설명을 단순화하기 위해 변수를 하나만 받는 함수를 예로 들겠습니다(로젠브록 함수는 두 개의 변수를 입력받는 함수였습니다).

그렇다면 뉴턴 방법은 최적의 값을 어떤 원리로 찾아내는 것일까요? y = f(x)라는 함수의 최솟값을 구하는 문제를 생각해보죠, 뉴턴 방법으로 최적화하려면 데일러 급수에 따라 y = f(x) 를 다음과 같이 변환합니다.

f(x) = f(a) + f'(a)(x-a) + 1/2!f''(a)(x-a)**2 + 1/3!f'''(a)(x-a)**3 + ...

테일러 급수에 따라 어떤 점 aㄹ르 기점으로 f를 x의 다항식으로 나타낼 수 있습니다(테일러 급수에 대해서는 27단계에서 설명했습니다). 이때 1차 미분, 2차 미분, 3차 미분....형태로 항이 증가하는데, 증가하는 걸 어느 시점에 중단하면 f(x)를 근사적으로 나타낼 수 있습니다. 여기에서는 다음과 같이 2차 미분에서 중단하겠습니다.

f(x) = f(a) + f'(a)(x-a) + 1/2f''(a)(x-a)**2

[식 29.2]와 같이 y = f(x) 함수를 2차 미분항까지 사용하여 근사했습니다. 변수 x를 기준으로, 이 식 x의 2차 함수입을 알 수 있습니다. 즉, y = f(x)는 '어떤 함수'를 x의 2차 함수로 근사한 것입니다(그래서 2차 근사라고 합니다). 참고로 이 작업을 [그림 29-2]로 표현할 수 있습니다.



[그림 29-2]와 같이 근사한 2차 함수는 a 에서  y = f(x)에 접하는 곡선입니다. 다행이 2차 함수의 최솟값은 해석적으로 구할 수 있습니다. 2차 함수의 미분 결과가 0인 위치를 확인하면 되죠. 수식으로는 다음과 같습니다.

d(f(fa) + f'(a)(x-a) + 1/2f''(a)(x-a)**2)/dx =0

f'(a) + f''(a)(x-a) = 0

x = a - f'(a)/f''(a)


이 결과로부터 근사한 2차 함수의 최솟값은 x = a - f'(a)/f''(a); 위치에 있을을 알 수있습니다. 즉, [그림 29-3]처럼 a의 위치를 -f'(a)/f''(a)만큼 갱신하면 됩니다.

[그림 29-3] 처럼 a의 위치를 갱신합니다. 그리고 갱신된 a의 위치에서 같은 작업을 반복합니다. 이것이 뉴턴 방법에 의한 최적화입니다. 이 뉴턴 방법을 경사하강법과 비교해보면 특성이 명확히 드러납니다. 다음 식을 살펴보시죠.

x <- x - af'(x)

x <- x - f'(x)/f''(x)

[식 29.4]가 경사하강법이고 [식 29.5]가 뉴턴 방법입니다. 보시는 것처럼 두 방법 모두 x를 갱신하지만 방법이 다릅니다. 경사하강법에서는 a라는 계수를 사람이 수동으로 설정하고 a의 값만큼 기울기(1차 미분)방향으로 진행하여 x의 값을 갱신합니다. 이에 반해 뉴턴 방법은 2차 미분을 이용하여 경사하가업에서 말하는 a를 자동으로 조정합니다. 즉, 뉴턴 방법은 a = 1/f''(a)로 대치한 방법이라고 생각할 수 있습니다.

지금까지 함수의 입력이 '스칼라'일때의 뉴턴     방법을 설명했는데, 입력이 '벡터'인 경우로도 자연스럽게 확장할 수 있습니다. 다른 점은 벡터인 경우 1차 미분으로 기울기를 사용하고, 2차 미분으로 헤세행렬(Hesian matrix)을 사용하는 점입니다. 자세한 내용은 '칼럼:뉴턴 방법과 double backprop 보충 학습'에서 설명합니다.


지금까지의 이야기를 정리하면 경사하강법은 1차 미분만의 정보를 사용하는 반면 뉴턴 방법을 활용한 최적화는 2차 미분의 정보도 이용합니다. 물리 세계에서 예ㅒ를 들면 속도 정보만 사용하는 것이 경사하강법이고, 속도와 가속도 정보까지 사용하는 것이 뉴턴 방법입니다. 뉴턴 방법은 추가된 2차 미분 정보 덕에 효율적인 탐색을 기대할 수 있으며, 결과저4ㄱ으로 목적지에 더 빨리 도달할 확률이 커집니다.

자, 그렇다면 뉴턴 방법을 이용하여 구체적인 문제를 풀업볼 차례입니다. y = x**4 - 2x**2이라는 수식의 최적화를 해볼까 합니다. 이 함수의 모양은 [그림 29-4]와 같이 '오목'한 부분이 두곳이며, 최솟값 x가 각각 -1과 1인 위치입니다. 초깃값을 x =2로 설정한 후 최솟값 중 하나인  x =1에 도달할 수 있는지 검증해볼 것입니다.








댓글 없음: