본문 바로가기

머신러닝, 딥러닝

기울기

앞 절의 편미분 에서는 x0 와 x1의 편미분을 따로따로 계산했다. 그럼 x0와 x1의 편미분을 동시에 계산하려면 어떻게 해야할까?

가령 x0 = 3 , x1 = 4 일 때 (x0, x1) 양쪽의 편미분을 묶어서 계산한다고 생각해보자. 이때

$\left(\frac{\partial f}{\partial x_0},\frac{\partial f}{\partial x_1}\right)$(fx0,fx1)

처럼모든 변수의 편미분을 벡터로 정리한 것을 기울기(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