밑바닥부터 시작하는 딥러닝3 - STEP 4

2021. 3. 10. 22:51개인 공부 공간/딥러닝

미분이란

미분이란 변화율을 의미합니다. 정확한 정의는 극한으로 짧은 시간(순간)에서의 변화량입니다. f(x)라는 함수가 있을 때 미분은 다음 식으로 정의된다.

$$f(x)=\lim_{h \to 0}\frac{f(x+h)-f(x)}{h}$$

수치 미분 구현

컴퓨터는 극한을 취급할 수 없으니 h를 극한으로 비슷한 값으로 대체하여 미분을 계산하는 코드를 구현할 수 있다. 이러한 방식을 이용한 미분을 수치 미분이라고 한다. 어쩔 수 없이 오차가 발생하는데 이를 줄이기 위해 $f(x)$와 $f(x+h)$ 지점에서의 기울기를 구하는 방법 대신에 f(x-h)와 f(x+h)의 차이를 구하는 중앙차분을 사용한다. 이를 코드로 구현하면 다음과 같다.

 

def numerical_diff(f, x, eps=1e-4):
  x0 = Variable(x.data - eps)
  x1 = Variable(x.data + eps)
  y0 = f(x0)
  y1 = f(x1)
  return (y1.data - y0.data) / (2 * eps)

 

numerical_diff에서 f는 미분의 대상이 되는 함수이며 앞에서 구현한 Function의 인스턴스이다. x는 미분을 계산하는 변수로 Variable 인스턴스이다.

 

f = Square()
x = Variable(np.array(2.0))
dy = numerical_diff(f, x)
print(dy)

 

실행 결과

4.000000000004

 

$y=x^2$에서 $x=2.0$일 때의 미분값을 수치 미분으로 구한 값이 위와 같고 실제 미분값인 4.0과 거의 비슷하다.

합성 함수의 미분

전에 구현한 SqaureExp 함수를 연결한 합성함수에 대해 미분한 코드는 다음과 같다.

 

def f(x):
  A = Square()
  B = Exp()
  C = Square()
  return C(B(A(x)))

x = Variable(np.array(0.5))
dy = numerical_diff(f, x)

 

실행 결과

3.2974426293330694

 

위 코드에서는 일련의 계산을 f라는 함수로 정의했다. 함수도 객체이기 때문에 다른 함수에 인수로 전달이 가능하다.

수치 미분의 문제점

수치 미분에는 오차가 포함되어 있고, 계산에 따라 오차가 매우 커질 수 있는 문제점이 존재합니다. 수치 미분에서 오차가 발생하는 이유는 주로 자릿수 누락 때문이다. 하지만 이보다 더 심각한 문제는 바로 계산량이 많다는 점이다. 특히 신경망에서는 매개변수를 수백만 개 이상 사용하는 경우가 빈번한데 이 경우 이 모두를 수치 미분으로 계산하는 것은 매우 비현실적이다.


출처: 사이토 고키, 『밑바닥부터 시작하는 딥러닝3』, 개앞맵시, 한빛미디어(2020)

출처: https://privatedevelopnote.tistory.com/81 [개인노트]