경사법에서는 기울기 값을 기준으로 나아갈 방향을 정하는데, 기울기란 무엇인지와 학생 때 배운 '미분'을 복습해보고자 한다.

미분

마라톤 선수가 처음부터 10분에 2km씩 달렸다고 해보자. 이때의 속도는 간단히 2/10 = 0.2 [km/분]이라고 계산할 수 있다. 즉 1분에 0.2km만큼의 속도(변화)로 뛰었다고 해석할 수 있다. 이 마라톤 예에서는 '달린 거리'가 '시간'에 대해서 얼마나 변화했는가를 계산했다. 다만 여기서 0.2km는 10분 동안의 평균 속도를 구한 것이고, 미분은 특정 순간의 변화량을 뜻한다. 그래서 10분이라는 시간을 1분, 1초, 0.1초 이렇게 간격을 줄여가면서 어느 한 순간의 변화량을 얻는 것이 미분이다.

수식으로 표현하면 위와 같다. 극한을 취해 h를 한없이 0에 가깝게 하여 시간에 따른 아주 작은 변화량을 구하는 것이다. 위 수식을 python 그대로 구현하면 다음과 같다.

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

이 함수는 수치 미분에서 따와 '함수 f'와 '함수 f에 넘길 인수 x'라는 두 인수를 받습니다. 얼핏 보면 문제가 없어 보이지만, 실제로 개선해야 할 점이 2개 있습니다.

첫 번째는 반올림 오차 문제입니다. h에 매우 작은 값을 넣고 싶어 10e-50을 대입했으나 너무 작은 값을 넣어 컴퓨터는 계산하는 과정에서 0.0으로 인식하게 됩니다. 그래서 미세한 값 h는 10e-4정도를 대입하면 더 좋은 결과를 얻는다고 알려져 있습니다.

두 번째 개선은 함수 f의 차분(임의의 두 점에서 함수 값들의 차이)과 관련한 것입니다. 미분은 x위치에서 순간 기울기의 의미이지만, 위 구현에서는 (x + h)와 x사이의 기울기에 해당합니다. 그래서 엄밀히 일치하지 않고, 이 차이는 h를 무한히 0으로 좁히는 것이 불가능해 생기는 한계입니다.

위 그림과 같이 수치 미분에는 오차가 포함되기 때문에, (x + h)와 (x - h)일 때 함수 f의 차분을 계산하는 방법을 쓰기도 합니다. 이 차분은 x를 중심으로 그 전후의 차분을 계산한다는 의미에서 중심 차분 혹은 중앙 차분이라고 합니다.

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

두 개선점을 적용해 수치 미분을 다시 구현하면 위와 같다.

※ 해석적 미분은 우리가 수학 시간에 배운 바로 그 미분이고, 수치 미분은 근사치로 계산하는 방법이다.


수치 미분의 예

위 수식을 미분하면 0.02x + 0.1이고 x가 5와 10일 때의 미분값은 각각 0.2, 0.3입니다. 아래 python으로 구현한 수치 미분과 비교하면 오차가 매우매우 작음을 알 수 있습니다.

python 수치 미분 예시


편미분

이어서 다음 식은 지금까지 배운 식과 다르게 변수가 2개이다. 이 함수를 그래프로 그리면 아래와 같이 3차원으로 그려진다.

함수와 그래프를 알아봤으니 이제 미분에 대해 알아보도록 하자. 여기서 주의할 점은 변수가 2개이기 때문에 x0와 x1중 어느 변수에 대한 미분이냐를 구별해야 한다. 덧붙여 이와 같이 변수가 여럿인 함수에 대한 미분을 편미분이라고 합니다. 

예시로 각각 x0에 대한 미분을 구해보자. x0=3, x1=4일 때 x0에 대한 편미분을 2 * x0가 되고 뒤에 x1은 상수 취급되어 0이 된다. 다시 2 * 3 이기 때문에 6이 된다.


기울기

앞에서는 x0와 x1의 편미분을 변수별로 따로 계산했습니다. 그렇다면 x0와 x1의 편미분을 동시에 계산하고 싶다면 어떻게 할까?

편미분의 기울기

위 식과 같이 양쪽 편미분을 벡터로 정리한 것을 기울기(gradient)라고 한다.

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기