머신러닝 & 딥러닝/기초 이론

[머신러닝/딥러닝 기초] 12. 미분과 수치미분

by seokii 2022. 2. 17.
728x90
반응형

정확도 대신 손실 함수를 사용하는 이유

https://seokii.tistory.com/83 

 

[머신러닝/딥러닝 기초] 11. 정확도 대신 손실 함수를 사용하는 이유

손실 함수에 대하여 https://seokii.tistory.com/81 [머신러닝/딥러닝 기초] 10. 손실 함수: 평균 제곱 오차와 교차 엔트로피 오차 항등함수와 소프트맥스 함수 https://seokii.tistory.com/78 [머신러닝/딥러닝..

seokii.tistory.com

지난 글에서는 신경망에서 정확도라는 지표를 두고 왜 손실 함수라는 지표를 사용하는지에 대해서 정리했습니다. 이번 글에서는 손실 함수를 정리하면서 말이 나왔던 미분과 수치 미분에 대해 정리해보도록 하겠습니다.

 

미분과 수치 미분

다들 잘 알고 계시겠지만 미분은 한 순간의 변화량이라고 할 수 있습니다.

수식으로는 다음과 같습니다.

$$\dfrac{df\left( x\right) }{dx}=\lim _{h\rightarrow 0}\dfrac{f\left( x+h\right) -f\left( x\right) }{h}$$

 

수치 미분이라는 것은 아주 작은 값을 주고, 그것의 차분으로 미분하는 것을 수치 미분이라 합니다.

차분이라는 말은 임의의 두 점에서의 함수 값들의 차이를 뜻합니다.

수치 미분을 계산하는 코드를 파이썬으로 구현해보면 다음과 같습니다.

def diff(f,x):
    h = 10e-50
    return (f(x+h)-f(x)) / h

하지만, 위의 코드에는 해결해야하는 문제가 있습니다.

1. 반올림 오차

2. 차분의 계산으로 인한 오차

 

먼저, 첫 번째는 반올림 오차 문제입니다. 파이썬에서 10e-50이라는 아주 작은 값을 넣게 되면 0.0으로 인식해 최종 계산 결과에 오차가 생기게 됩니다. 따라서 이 미세한 값 h를 \(10^{-4}\)로 사용하겠습니다. 일반적으로 이 값을 사용하면 좋은 결과를 얻는다고 합니다.

 

두 번째는 차분으로 인한 오차 문제입니다. 위의 코드에서는 x+h와 x사이의 함수 f의 차분을 계산하지만, 본래의 미분은 x 위치의 함수의 기울기(접선)을 구하는 것이지만 위의 경우에는 x+h와 x사이의 기울기에 해당합니다. h를 무한히 0으로 좁히는 것이 불가능해 생기는 한계입니다.

따라서, 이 오차를 줄이기 위해 (x+h)와 (x-h)일 때의 차분을 구하는 것으로 개선할 수 있습니다.

이 차분을 중심 차분 혹은 중앙 차분이라고 합니다.

 

위의 개선점을 적용해 코드를 다시 작성하면 다음과 같습니다.

def diff(f,x):
    h = 1e-4
    return (f(x+h)-f(x-h)) / (2*h)

 

수치 미분 그려보기

import numpy as np
import matplotlib.pylab as plt

def diff(f,x):
    h = 1e-4
    return (f(x+h)-f(x-h)) / (2*h)

def function(x):
    return 0.01*x**2 + 0.1*x

def tangent_line(f, x):
    d = diff(f, x)
    print(d)
    y = f(x) - d*x
    return lambda t: d*t + y

x = np.arange(0.0, 20.0, 0.1)
y = function(x)

tf = tangent_line(function, 5)
y2 = tf(x)

tf2 = tangent_line(function, 10)
y3 = tf2(x)

plt.xlabel("x")
plt.ylabel("f(x)")
plt.plot(x,y)
plt.plot(x, y2)
plt.plot(x, y3)
plt.show()

numpy와 matplotlib를 이용해 수치 미분을 그래프로 나타낸 구현 코드입니다.

diff() 함수는 수치 미분을 구하는 식이며,

function() 함수는 \(y = 0.01x^{2}+0.1x\) (파란색 그래프)를 나타내는 식입니다.

tangent_line() 함수는 주어진 식에 대한 미분의 값을 구하고 접선을 나타내기 위한 함수입니다.

주황색 선은 x가 5일 때(tf 변수 참고)의 미분 값을 기울기로 하는 직선이며,

초록색 선은 x가 10일 때(tf2 변수 참고)의 미분 값을 기울기로 하는 직선입니다.

 

 

728x90
반응형

댓글