Deep learning/모델 구현

30. 테일러 급수 미분

jwjwvison 2021. 10. 12. 18:06
  • sin 함수 구현

 Sin 클래스와 sin 함수는 다음처럼 구현할 수 있다.

class Sin(Function):
    def forward(self,x):
        y=np.sin(x)
        return y
    
    def backward(self,gy):
        x=self.inputs[0].data
        gx=gy * np.cos(x)
        return gx
    
def sin(x):
    return Sin()(x)

 

  • 테일러 급수 이론

 Sin 함수의 미분은 다음과 같은 테일러 급수를 이용한 방법으로 계산할 수 있다. 테일러 급수란 어떤 함수를 다항식으로 근사하는 방법으로, 수식으로는 다음과 같다.

 여기서 f(x)=sin(x)를 위 식에 적용시켜 보면 다음과 같은 식이 나온다.

 위 식에서 보듯 sin 함수는 x의 거듭제곱으로 이루어진 항들이 무한히 계속되는 형태로 표현된다. 여기서 중요한 점은 시그마의 i가 커질수록 근사 정밀도가 좋아진다는 것이다. 또한 i가 커질수록 시그마 뒤의 항의 절대값은 작아지므로, 이 값을 참고하여 i의 값(반복 횟수)을 적절히 결정할 수 있다.

import math

def my_sin(x,threshold=0.0001):
    y=0
    for i in range(100000):
        c=(-1) ** i / math.factorial(2*i+1)
        t=c*x**(2*i+1)
        y=y+t
        if abs(t.data) < threshold:
            break
            
    return y

 

'Deep learning > 모델 구현' 카테고리의 다른 글

32. 고차 미분  (0) 2021.10.14
31. 함수 최적화(중요)  (0) 2021.10.12
29. 연산자 오버로드  (0) 2021.10.10
28. 변수 사용성 개선  (0) 2021.10.10
27. 메모리 관리  (0) 2021.10.04