34.1 sin 함수 구현
고차 미분에 대응할 수 있는 sin 클래스를 구현합니다.
y = sin(x)일때 미분은 cos(x)입니다.
import numpy as np
from dezero.core import function
class Sin(Function):
def forward(self, x):
y = xp.sin(x)
return y
def backward(self, gy):
x, = self.inputs
gx = gy * cos(x) # 1
return gx
def sin(x):
return Sin()(x)
backward 메서드에서 메서드 안의 모든 변수가 Variable 인스턴스 이며 cos(x)는 DeZero의 cos 함수입니다.
즉 Cos 클래스와 cos 함수를 구현해야합니다.
34.2 cos 함수 구현
y = cos(x)일 때 미분은 -sin(x)입니다.
class Cos(Function):
def forward(self, x):
y = xp.cos(x)
return y
def backward(self, gy):
x, = self.inputs
gx = gy * -sin(x)
return gx
def cos(x):
return Cos()(x)
backward 메서드에서 구체적인 계산이 sin 함수를 사용하고 있습니다.
그외에는 다른 특별한 점은 없는 것 같습니다.
34.3 sin 함수 고차 미분
2차 미분이 아니라 3차 4차 미분도 계산할 수 있도록 코드를 구현합니다.
import numpy as np
from dezero import Variable
import dezero.functions as F
x = Variable(np.array(1.0))
y = F.sin(x)
y.backward(create_graph=True)
for i in range(3):
gx = x.grad
x.cleargrad()
gx.backward(create_graph=True)
print(x.grad)

for 문을 상ㅇ해 역전파를 반복하여 n차 미분이 가능합니다.
gx = x.grad에서 미분값을 꺼내 gx에서 역전파를 하고 역전파 전에 x.cleargrad()를 호출하여 미분값을 재설정하여 고차 미분이 문제없이 진행되고있습니다.
그래프를 그리는 코드를 추가했습니다.
import numpy as np
import matplotlib.pyplot as plt
from dezero import Variable
import dezero.functions as F
x = Variable(np.linspace(-7, 7, 200))
y = F.sin(x)
y.backward(create_graph=True)
logs = [y.data]
for i in range(3):
logs.append(x.grad.data)
gx = x.grad
x.cleargrad()
gx.backward(create_graph=True)
labels = ["y=sin(x)", "y'", "y''", "y'''"]
for i, v in enumerate(logs):
plt.plot(x.data, logs[i], label=labels[i])
plt.legend(loc='lower right')
plt.show()

입력 변수 x를 수정했는데 np.linspace(-7, 7, 200)은 -7부터 7까지 균일하게 200등분한 배열을 만들어주고 이렇게 만든 배열을 Variable로 감싸 x에 할당했습니다.
해당 그래프를 보면 차수가 증가하면 y = sin(x) -> y = cos(x) -> y = -sin(x) -> y = -cos(x) 식으로 진행되는걸 알 수 있습니다.
'Study 공부할레나' 카테고리의 다른 글
| [스터디/밑시딥3] 제 3고지 고차미분계산_36. 고차 미분 이외의 용도 (0) | 2023.09.11 |
|---|---|
| [스터디/밑시딥3] 제 3고지 고차미분계산_35. 고차 미분 계산 그래프 (0) | 2023.09.11 |
| [스터디/밑시딥3] 제 3고지 고차미분계산_33. 뉴턴 방법으로 푸는 최적화(자동계산) (0) | 2023.09.10 |
| [스터디/밑시딥3] 제 3고지 고차미분계산_32. 고차 미분(구현 편) (0) | 2023.09.09 |
| [스터디/밑시딥3] 제 3고지 고차미분계산_31. 고차 미분(이론 편) (0) | 2023.09.09 |