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과 거의 비슷하다.
합성 함수의 미분
전에 구현한 Sqaure
와 Exp
함수를 연결한 합성함수에 대해 미분한 코드는 다음과 같다.
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)
'개인 공부 공간 > 딥러닝' 카테고리의 다른 글
밑바닥부터 시작하는 딥러닝3 - STEP 6 (1) | 2021.03.10 |
---|---|
밑바닥부터 시작하는 딥러닝3 - STEP5 (0) | 2021.03.10 |
밑바닥부터 시작하는 딥러닝3 - STEP 3 (1) | 2021.03.10 |
밑바닥부터 시작하는 딥러닝3 - STEP 2 (0) | 2021.03.10 |
밑바닥부터 시작하는 딥러닝3 - STEP 1 (0) | 2021.03.10 |