본문 바로가기
AI/딥러닝 프레임워크 개발

33단계) 뉴턴 방법 최적화 자동화 , 2차 미분 자동 계산

by 채채씨 2021. 7. 9.
728x90
반응형

이전 단계에서 고차 미분을 가능하게 DeZero를 확장시켰으므로 이번 단계에서는 실제로 2차 미분을 계산한 후, 뉴턴방법을 이용한 최적화를 해볼 것이다.

 

1. 2차 미분 계산하기

 

import numpy as np
from dezero import Variable

def f(x):
	y = x**4 - 2 * x**2
    return y
    
x = Variable(np.array(2.0))
y = f(x)

#첫 번째 역전파 진행
y.backward(create_graph=True)
print(x.grad) #variabe(24.0)

#두 번째 역전파 진행
gx = x.grad
gx.backward()
print(x.grad) #variable(68.0)

 

gx.backward()를 하여 gx.grad = None이니 np.ones_like()를 통해 1값을 갖게 되고, 그것을 f.backwaard의 인자로 넣어서실행하면 2차 도함수 * gx(=1) 식이 계산된다.

그러나 두 번째 역전파 계산의 결과값이 44가 아닌 68이 나왔다. x.grad에 1차 미분한 결과값이 저장되어 있으므로 그 값과 더해진 것이다. 따라서 새로운 미분을 계산하기 전에 cleargrad()함수를 통해 초기화해야 한다.

 

x = Variable(np.array(2.0))
y = f(x)
y.backward(create_graph=True)
print(x.grad) #variable(24.0)

gx = x.grad
x.cleargrad() #미분값 재설정
gx.backward()
print(x.grad) #variable(44.0)

 

이제 2차 미분도 자동으로 구할 수 있음을 확인하였다.

 


 

2. 뉴턴 방법을 활용한 최적화

 

import numpy as np
from dezero import Variable

def f(x):
	y = x**4 - 2 * x**2
    return y
    
x = Variable(np.array(2.0))
iters = 10

for i in range(iters):
	print(i, x)
    
    y = f(x)
    x.cleargrad()
    y.backward(create_graph=True)
    
    gx = x.grad
    x.cleargrad()
    gx.backward()
    gx2 = x.grad
    
    x.data -= gx.data / gx2.data

 

728x90
반응형

댓글