수치 미분이란 무엇일까? 우선 미분의 개념부터 간략하게 짚고 넘어가자.
미분의 가장 쉬운 예로는 속도를 들 수 있다.
어떤 사람이 10분 동안 2km를 달렸다고 하자. 이때 이 사람이 달린 10분 동안의 평균 속도는 `2km / 10분 = 0.2 km/분` 이다.
만약 우리가 그중 특정 1분 동안에 달린 거리를 알 수 있다면, 그건 1분 동안의 평균 속도라고 할 수 있다.
마찬가지로 어떤 1초, 또 0.1초, 0.01초에 대한 평균 속도도 구할 수 있다.
만약 여기서 더 짧은 시간 동안의 속도를 구할 수 있다면, 그건 '평균'보다는 '순간 속도'라는 표현이 더 적절할 것이다.
이처럼 한 순간의 변화량을 '미분'이라고 한다.
어쩌면 우리는 아래와 같이 미분을 표현한 수식이 익숙할 것이다.
즉 `h`라는 값이 0에 수렴할 만큼 아주 작아질 때, 그에 따른 함수 `f`값의 변화량이 바로 미분이다.
$$\frac{df(x)}{dx} = \lim_{h \to 0}\frac{f(x+h)-f(x)}{h}$$
이걸 파이썬 코드로 구현해볼 수 있을까?
물론 가능하다. 하지만 미리 두 가지 유의해서 개선할 점을 알아두는 것이 좋다.
백문이 불여일견! 첫 번째 유의할 점은 바로 코드를 보며 알아보자.
# 수치 미분을 코드로 구현해보자
def numerical_diff(f, x):
h = 10e-50 # h는 아주 작은 수로 할당해보았다.
return (f(x+h) - f(x-h)) / (2*h)
np.float32(10e-50) # 출력 값: 0.0
가능한 정확한 미분을 구현하기 위해 `h`를 아주 작은 값을 할당해 보았다.
그런데 이 값은 float32(32비트 부동소수점)에서 반올림 오차(rounding error) 문제를 일으키며 결국 '0에 가까운 수'가 아닌 '0'이 되어 버렸다.
따라서 `h` 값으로는 `10^-4` 정도의 값을 사용하는 것이 가장 만족스러운 결과를 얻을 수 있다.
두 번째 개선이 필요한 부분도 사실은 애당초 `h` 값을 무한히 0에 가깝게 만들 수 없기 때문에 생긴다.
즉 진정한 순간 변화량은 근사로 구한 값과 비교해 차이가 발생할 수밖에 없다는 것이다.
그렇기 때문에, 결론부터 말하자면 같은 미분 값을 가지지만 오차를 줄일 수 있는 새로운 계산식을 제안할 것이다.
`f(x)`를 `x`에 대해 미분한다는 것은 `x`일 때의 `f(x)`의 접선 또는 기울기를 구한다는 것이다. 이를 해석적 미분(Analytic Differentiation)이라고 한다. 이는 오차를 포함하지 않는 진정한 미분 값이다.
우리는 지금까지 이 값의 근사 값을 `h`가 무한히 작을 때 `f(x+h)`와 `f(x)`의 차이(전방 차분)로 구하고자 했다.
그리고 사실 이 값은 수학적으로 `f(x+h)`와 `f(x-h)`의 차이를 `2h`로 나눈 값과 같다. 이 값은 x를 중심으로 그 전후의 차분을 계산한다는 의미에서 중심 차분 혹은 중앙 차분이라고 한다.
이게 어떻게 전방 차분과 같은지 간단히 증명해볼 수 있다.
$$\lim_{h \to 0} \frac{f(x+h)-f(x)}{h} = \lim_{h \to 0}\frac{f(x+2h)-f(x)}{2h} = \lim_{h \to 0}\frac{f(x+h)-f(x-h)}{2h}$$
$$\lim_{h \to 0}\frac{f(x+h)-f(x-h)}{2h} = \lim_{h \to 0}\left \{ \frac{f(x+h)-f(x)+f(x)-f(x-h)}{2h} \right \}$$
$$= \frac{1}{2}\lim_{h \to 0}\frac{f(x+h)-f(x)}{h} - \frac{1}{2}\lim_{h \to 0}\frac{f(x-h)-f(x)}{-h}$$
$$= \frac{1}{2}\lim_{h \to 0}f'(x) + \frac{1}{2}\lim_{h \to 0}f'(x) = f'(x)$$
즉 우리는 수학적으로는 같은 미분 값을 가지지만, 이 중심 차분을 적용해 수치 미분을 구현할 것이다.
왜 중심 차분을 적용하는 걸까? 그 이유는 그래프에서 명확히 드러난다.
진정한 접선인 파란 선은 `f'(x)`를 의미한다.
그리고 방금 위에서 새롭게 제안한 중심 차분 값은 `x+h`와 `x-h`를 잇는 빨간 선에 해당한다.
반면 우리가 맨 처음에 구하려고 했던 전방 차분 값은 동일하게 `2h`를 기준으로 했을 때 `\frac{f(x+2h) - f(x)} {2h}`로 표현되므로 초록 선에 해당한다.
보다시피 초록색인 전방 차분 값보다는 빨간색인 중심 차분 값이 진정한 접선인 파란색 선에 가깝다.
따라서 가장 정확하게 미분 값을 구현하기 위해서는 중심 차분을 이용하는 것이 유리하다.
이렇게 이해한 수치 미분이 딥러닝에서 어떻게 쓰이는지는 다음 글에서 정리해 보려고 한다.
아래 내용을 참고했습니다.
- 책 『밑바닥부터 시작하는 딥러닝』
'공부하며 성장하기 > 인공지능 AI' 카테고리의 다른 글
앙상블 학습(Ensemble Learning)이란? (2) | 2021.08.15 |
---|---|
경사하강법(Gradient Descent)이란? (0) | 2021.07.27 |
퍼셉트론(perceptron)이란? (0) | 2021.07.21 |
판다스Pandas 가 뭔가요? (+ 와인 리뷰 데이터 탐색 맛보기) (1) | 2021.07.10 |
[단단한 머신러닝] 01/ 머신러닝은 뭘 하는 건가요? (0) | 2021.07.03 |