수치 미분
* 미분은 순간 변화량을 구하는 것과 같다. h를 0에 한없이 가깝게 할 때의 y값의 변화량을 뜻한다.
* 만약 위 수식을 쓰여있는 대로 구현하면 아래와 같을 것이다.
# 나쁜 구현의 예
def numerical_diff(f, x):
h = 10e-50
return (f(x + h) - f(x)) / h
* 위 코드는 2 가지 면에서 문제가 있다.
1) 컴퓨터는 부동소수점 표현을 정확히 하지 못한다. 이는 부동소수점을 그 값 그대로 계산하지 않고 근사값을 통해 계산하기 때문인데 나중에 기회가 된다면 CS 정리에 올려보도록 하겠다. python에서도 위와 같이 너무 작은 소수가 들어오면 0으로 반올림해버리는 문제가 있다. 때문에 위의 코드에서 h를 $10^{-4}$ 정도로 설정해줘야 한다.
2) 위 수식은 h가 0에 한 없이 가까워질 경우를 가정한다. 하지만, 실제로 우리는 h를 0에 한없이 가까운 값으로 설정할 수가 없다. 때문에 $10^{-4}$와 같이 h가 0에 한없이 가까울 때와 비교했을 때 훨씬 큰 값을 사용하게 되는데, 이 때문에 해석적으로 미분한 결과인 기울기와 실제로 우리가 근사적으로 구할 수 있는, 수치적으로 구한 기울기는 차이가 발생한다.
중심 차분
* 0과 한없이 가까운 h를 사용할 수 없기 때문에 필연적으로 발생하는 이 오차를 줄이기 위해 (x+h)와 (x-h)일 때의 함수 f의 차분을 계산하는 방법을 사용하기도 하는데, 이를 중심 차분 혹은 중앙 차분이라고 한다. 중심 차분 방법을 적용해 위 코드를 바꿔보자.
def numerical_diff(f, x):
h = 1e-4 # 0.0001
return (f(x + h) - f(x - h)) / (2*h)
편미분
$f(x_0, x_1) = x^2_0 + x^2_1$
def function_2(x):
return x[0]**2 + x[1]**2
# 또는 return np.sum(x**2)
* 위와 같이 변수가 2개인 식을 graph로 구현하면 아래와 같다.
* 변수가 2개이기 때문에 미분할 변수를 정한 뒤 나머지 변수를 고정시키고(상수값으로 보고) 변수별로 미분한다.
* 아래는 $x_0=3, x_1=4$ 일 때, 각 변수별 편미분값을 구하는 코드이다.
def function_tmp1(x0):
return x0*x0 + 4.0**2.0
numerical_diff(function_tmp1, 3.0)
>> 6.00000000000378
def function_tmp2(x1):
return 3.0**2.0 + x1*x1
numerical_diff(function_tmp2, 4.0)
>> 7.9999999999999919
기울기(Gradient)
* 변수 별 편미분값을 벡터로 정리한 것을 기울기라고 한다. 기울기를 구하기 위해 이번에는 변수별로 따로 편미분을 시행하지 않고 한꺼번에 시행해보자.
def numerical_gradient(f,x):
h = 1e-4 #0.0001
grad = np.zeros_like(x) #x와 shape이 같은 배열을 생성
for idx in range(x.size):
tmp_val =x[idx]
#f(x+h)계산
x[idx] = tmp_val + h
fxh1 = f(x)
#f(x-h)계산
x[idx] = tmp_val - h
fxh2 = f(x)
grad[idx] = (fxh1 - fxh2)/(2*h)
x[idx] = tmp_val #값 복원
return grad
numerical_gradient(function_2, np.array([3.0,4.0]))
>> array([6., 8.])
* 위 함수를 통해 (3, 4)의 기울기는 (6, 8)인 것을 알 수 있다.
* 위 그림은 각 변수 조합별 기울기에 마이너스를 붙인 벡터를 나타낸 그림이다. 각 기울기에 마이너스를 붙인 벡터는 가장 기울기가 낮은 점을 가리키는 것 처럼 보인다. 또한 기울기가 가장 낮은 지점으로부터 멀어질 수록 기울기 벡터의 크기가 커지는 것을 볼 수 있다.
'Deep Learning > 밑바닥부터 시작하는 딥러닝' 카테고리의 다른 글
Backpropagation (0) | 2022.01.27 |
---|---|
경사하강법(Gradient Descent method) (0) | 2022.01.25 |
손실 함수 (0) | 2022.01.25 |
신경망 (0) | 2021.11.23 |
퍼셉트론 (0) | 2021.11.17 |