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

34~35단계) sin 함수 미분 , tanh 함수 미분

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

Add, Mul, Neg, Sub, Div, Pow 클래스를 구현하여 dezero/core.py에 추가하였다. 이번 단계에서는 DeZero함수를 추가로 구현할 것이다.

 

1. sin함수

 

sin함수와 그 미분 함수의 수식은 아래와 같다.

 

import numpy as np
from dezero.core import Function

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

 

backward메서드 사용 시 모든 계산은 반드시 DeZero함수를 사용해야 한다. gx = gy * cos(x)를 계산하기 위해서는 DeZero의 Cos클래스와 cos함수가 필요하다. 

 


 

2. cos함수 구현

 

sin함수와 그 미분 함수의 수식은 아래와 같다.

 

class Cos(Function):
	def forward(self, x):
    	y = np.cos(x)
        return y
        
    def backward(self, gy):
    	x = self.inputs
        gx = gy * -sin(x)
        return gx
        
def cos(x):
	return Cos()(x)

 


 

3. sin함수 고차 미분

 

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) #n차 미분
    
#variable(-0.8414709848078965)
#variable(-0.5403023058681398)
#variable(0.8414709848078965)

 

gx = x.grad에서 미분 값을 꺼내 gx에서 역전파 한다. 다음 역전파를 하기 전에 x.cleargrad()를 호출하여 초기화한 후 미분을 반복한다. 위의 코드를 그래프로 그려보면 다음과 같다.

 


 

4. tanh 함수

이번에는 tanh함수를 추가할 것이다. tanh쌍곡탄젠트 또는 하이퍼볼릭 탄젠트라고 읽고 수식은 아래와 같다.

 

 

tanh함수는 입력값을 -1~1사이의 값으로 변환한다.

 


 

5. tanh 함수 미분

 

tanh함수의 미분은 다음의 분수 미분 공식을 이용하여 계산할 수 있다.

 

 

 

 


 

6. tanh함수 구현

 

tanh함수의 미분은 y = tanh(x) 일때, 1- y**2이므로 다음과 같이 구현할 수 있다.

 

class Tanh(Function):
	def forward(self, x):
    	y = np.tanh(x)
        return y
        
    def backward(self, gy):
    	y = self.outputs[0]()
        gx = gy * (1 - y * y)
        return gx
        
def tanh(x):
    return Tanh()(x)

 

 

728x90
반응형

댓글