33.1 2차 미분 계산하기
수식 y = x**4 - 2x**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))
y = f(x)
y.backward(create_graph=True) # 1
# 두번째 역전파
gx = x.grad # 2
gx.backward() # 3
print(x.grad)

1의 y.backward(create_graph = True)에 의해 첫 번째 역전파가 진행되고
True로 지정하여서 역전파 계산에서도 게산 그래프를 만들게 하였습니다.
2의 gx = x.grad 코드로 y의 x에 대한 미분값을 꺼내고 3에서 방금 꺼낸 미분값인 gx를 한번 더 역전파 합니다.
그렇게 하면 gx의 x에 대한 미분이 구해지고 이것이 2차 미분에 ㅎㅐ당합니다.
1차 미분 y' = 4x**3 - 4x에서 x는 2니까 24의 미분값이 나오고
2차 미분 y'' = 12x**2 - 4 에서 x는 2니까 42인데 이차 미분값 68이랑 다릅니다.
왜냐면 1차 미분 값에 2차 미분이 더해진 값이기 때문인데 Variable에 미분값이 남아 있는 상태에서 새로운 역전파를 수행했기 때문에 새로운 미분값이 더해진 건데요.
해당 코드 부분은 Variable 클래스에서 아래에 부분입니다.
x.grad가 있어서 x.grad + gx의 계산이 진행 된거죠
for x, gx in zip(f.inputs, gxs):
if x.grad is None:
x.grad = gx
else:
x.grad = x.grad + gx
Variable 클래스 안에 구현한 cleargrad를 사용해서 x의 미분값을 None으로 설정해줍니다.

TaDa! 원하는 결과대로 잘 나온것을 확인할 수 있었습니다.

33.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
위의 뉴턴 방법으로 최적화 하는 코드에서 gx를 x 미분값 None해주고 역전파를 계산해주도록 수정해줬습니다.
그런 후 실행하면 아래처럼 결과가 나옵니다. 7회 만에 최솟값 1에 도달합니다.(=빠릅니다)

'Study 공부할레나' 카테고리의 다른 글
| [스터디/밑시딥3] 제 3고지 고차미분계산_35. 고차 미분 계산 그래프 (0) | 2023.09.11 |
|---|---|
| [스터디/밑시딥3] 제 3고지 고차미분계산_34. sin 함수 고차 미분 (0) | 2023.09.11 |
| [스터디/밑시딥3] 제 3고지 고차미분계산_32. 고차 미분(구현 편) (0) | 2023.09.09 |
| [스터디/밑시딥3] 제 3고지 고차미분계산_31. 고차 미분(이론 편) (0) | 2023.09.09 |
| [스터디/밑시딥3] 제 3고지 고차미분계산_30. 고차 미분(준비편) (0) | 2023.09.09 |