그럼 뉴턴 방법을 구현해봅시다. 뉴턴 방법을 활용한 최적화를 구현하려면 [식 29.5]를 구현하기만 하면 됩니다. 하지만 DeZero는 아쉽게도 2차 미분은 자동으로 구하지 못하므로 다음과 같이 수동으로 2차 미분을 구하기로 합시다.
y = x**4 - 2x**2
dy/dx = 4x**3 - 4x
d2y/dx2 = 12x**2 - 4
이 결과를 사용하면 뉴턴 방법을 활용한 최적화를 다음처럼 구현할 수 있습니다.
이와 같이 1차 미분은 지금까지처럼 역전파로 구하고 2차 미분은 수동으로 코딩해 구합니다. 그런 다음 뉴턴 방법의 갱신 수식에 따라 x를 갱신합니다. 이 코드를 실행하면 x값의 갱신 과정이 다음과 같이 출력됩니다.
이 문제의 답(최솟값)은 1입니다. 앞의 결과를 보면 목적지까지 빠르게 도달했음을 알 수 있ㅅ브니다. 단 7회의 갱신만으로 최솟값에 도달했죠. 한편 경사하강법은 최적값에 도달하는데 오랜 시간이 걸립니다. [그림 29-5]는 두 기법의 갱신 경로를 비교한 모습입니다.
이처럼 경사하강법으로는 갱신을 여러번 해야 합니다. 참고로 [그림 29-5]에서 경사하강법의 모습은 학습률을 0.01로 했을 때의 결과입니다. 이때 x = 1.0 과의 절대오차가 0.001 이하로 좁혀지기까지는 124번이나 갱신해야 했습니다. 그에 반해 뉴턴 방법은 불과 7번 입니다.
이상이 뉴턴 방법의 이론과 구현입니다. 이번 단계에서는 뉴턴 방법을 활용한 최적화를 구현하고 구체적인 문제를 풀어봤습니다. 그리고 실제로 좋은 결과를 얻어냈습니다. 그러나 구현시 2차 미분을 수동으로 계산했다는 한계가 있군요(2차 미ㅜㄴ을 계산하기 위해 수식을 손으로 써내려갔고, 그 결과를 하드코딩했습니ㅏㄷ). 이쯤이면 자연스럽게 집작이 되시겠죠? 다로 다음으로 정복할 목표ㅕ는 자동화하는 것입니다.
댓글 없음:
댓글 쓰기