앞 절의 편미분 에서는 x0 와 x1의 편미분을 따로따로 계산했다. 그럼 x0와 x1의 편미분을 동시에 계산하려면 어떻게 해야할까?
가령 x0 = 3 , x1 = 4 일 때 (x0, x1) 양쪽의 편미분을 묶어서 계산한다고 생각해보자. 이때
$\left(\frac{\partial f}{\partial x_0},\frac{\partial f}{\partial x_1}\right)$(∂f∂x0,∂f∂x1)
처럼모든 변수의 편미분을 벡터로 정리한 것을 기울기(gradient) 라고 한다.
기울기는 예를 들어 다음과 같이 구현할 수 있다.
import numpy as np
import matplotlib.pylab as plt
from mpl_toolkits.mplot3d import Axes3D
def _numerical_gradient_no_batch(f, x):
h = 1e-4 # 0.0001
grad = np.zeros_like(x) # x와 형상이 같은 배열을 생성
for idx in range(x.size):
tmp_val = x[idx]
# f(x+h) 계산
x[idx] = float(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
def numerical_gradient(f, X):
if X.ndim == 1:
return _numerical_gradient_no_batch(f, X)
else:
grad = np.zeros_like(X)
for idx, x in enumerate(X):
grad[idx] = _numerical_gradient_no_batch(f, x)
return grad
def function_2(x):
if x.ndim == 1:
return np.sum(x**2)
else:
return np.sum(x**2, axis=1)
def tangent_line(f, x):
d = numerical_gradient(f, x)
print(d)
y = f(x) - d*x
return lambda t: d*t + y
if __name__ == '__main__':
x0 = np.arange(-2, 2.5, 0.25)
x1 = np.arange(-2, 2.5, 0.25)
X, Y = np.meshgrid(x0, x1)
X = X.flatten()
Y = Y.flatten()
grad = numerical_gradient(function_2, np.array([X, Y]) )
plt.figure()
plt.quiver(X, Y, -grad[0], -grad[1], angles="xy",color="#666666")#,headwidth=10,scale=40,color="#444444")
plt.xlim([-2, 2])
plt.ylim([-2, 2])
plt.xlabel('x0')
plt.ylabel('x1')
plt.grid()
plt.legend()
plt.draw()
plt.show()
위의 식으로 기울기를 계산할 수 있다. 앞의 예에서 점 (3,4)의 기울기는 (6,8), (0,2)의 기울기는 (0,4) 점 (3,0)의 기울기는 (6,0)이라는 결과를 얻게 된다.
그런데 여기서 이 “ 기울기 “ 라는게 무엇을 의미할까?
위의 그래프는 기울기의 결과에 마이너스를 붙인 벡터의 그래프이다.
기울기 그림은 위의 그래프 처럼 방향을 가진 벡터 ( 화살표 ) 로 그려진다. 이 그림을 보면 기울기는 함수의 “ 가장 낮은 장소 (최솟값) “를 가리키는 것 같다.
마치 나침반처럼 화살표들은 한 점을 향하고 있다. 또 “ 가장 낮은 곳 “에서 멀어질수록 화살표의 크기가 커짐을 알 수 있다.
위의 그래프에서 기울기는 가장 낮은 장소를 가리킨다. 하지만 실제는 반드시 그렇다고는 할 수 없다. 사실 기울기는 각 지점에서 낮아지는 방향을 가리킨다.
더 정확히 말하자면 “ 기울기가 가리키는 쪽은 각 장소에서 함수의 출력 값을 가장 크게 줄이는 방향 “ 이다.
매우 중요하니 꼭 기억하길 바란다.
'머신러닝, 딥러닝' 카테고리의 다른 글
패딩, Padding (0) | 2020.01.20 |
---|---|
합성곱 연산 (0) | 2020.01.20 |
편미분 (0) | 2020.01.20 |
수치 미분 ( numerical differentiation ) (0) | 2020.01.20 |
왜 손실함수를 사용하는가? (0) | 2020.01.20 |