Gradient Decent(경사 하강법)
우리가 기본적으로 방정식을 풀 때 $W$, $b$ 값이 주어졌을 때, $x$ 값 혹은 $y$ 값을 구하려고 한다.
$$ y = Wx+b $$
하지만, 데이터는 주로 $W$, $b$ 값은 주어지지 않고 $x$, $y$ 값을 주거나 혹은 $x$ 값만 준다.
그렇다면, 만약 $x$, $y$값을 가지고 있다고 가정할 때, 최적의 $W$ 값과 $b$ 값을 얻으려면 어떻게 해야 할까?
우리는 $W$ 값과 $b$ 값에 숫자를 대입해보면서 $Wx + b$ 값이 최대한 $y$ 값에 가까워질 수 있도록 할 수 있다.
하지만 우리가 푸는 문제는 대부분 비선형 문제라 $W$ 값과 $b$ 값이 딱 들어맞지 않는 경우가 대다수이므로 $y$ 값과 오차가 발생할 수 밖에 없다.
그래서 우리는 $W$ 값과 $b$ 값을 대입했을 때 $y$ 값과 최대한 오차가 발생하지 않는 방향으로 $W$ 값과 $b$ 값을 개선해야 한다.
이 말은 즉, 위 식을 미분했을 때 미분 계수가 줄어드는 방향으로 개선해야 함을 의미하고, 이렇게 오차를 줄여나가는 방법이 경사 하강법(Gradient descent)이다.
경사 하강법(Gradient Descent)
먼저 $ f(x) = Wx+b $라고 해보자.
이때, $f(x)$의 요소와 $y$의 요소 각각의 오차의 합, 또는 평균이 작아져야 하므로 다음과 같이 작성할 수 있다.
$$J(W,b) = \frac{1}{m}\sum_{i=1}^{m}{(f(x_{i})-y_{i})}^{2}$$
위 오차 계산법을 Mean Square Error(MSE) 라고 한다.
보통 두 요소 간의 차이를 계산할 때, 절대 값으로도 계산하는 방법도 있는데 이렇게 하면 미분이 안되는 구간이 발생할 수도 있어, 주로 제곱을 많이 사용한다. 제곱을 사용하다 보니 값이 커질 수 밖에 없기 때문에 합보다는 평균을 선호한다.
$J(W, b)$을 미분했을 때 미분 계수가 줄어드는 방향으로 개선해야 한다.
하지만 변수가 2개 이므로 $W$ 에 대해서 한 번, $b$ 에 대해서 한 번 편미분을 해야한다.
$$\frac{\sigma J }{\sigma W} = \frac{1}{2m}\sum_{i=1}^{m}{(f(x_{i})-y_{i})}\times x_{i}$$
$$\frac{\sigma J}{\sigma b} = \frac{1}{2m}\sum_{i=1}^{m}{(f(x_{i})-y_{i})}$$
기울기를 줄여나가는 것이 목표이므로 $W$, $b$ 값을 위 $\frac{\sigma J}{\sigma W}$, $\frac{\sigma J}{\sigma b}$ 값으로 각각 뺀다.
그러면 다음과 같이 작성할 수 있는데, 이때 $\eta$ 값은 학습률(Learning rate)로 불린다.
$$W:=W-\eta\frac{\sigma J}{\sigma W}$$
$$b:=b-\eta\frac{\sigma J}{\sigma b}$$
학습률은 어느 정도의 크기만큼 오차를 최소 지점으로 이동할 것 인지를 나타낸다. 학습률이 너무 작다면 최소 지점으로 가기 위한 학습을 하는데 많은 시간이 소요할 수 있다. 반대로 학습률이 너무 크다면 최소 지점으로 도리어 못 갈 수도 있다. 따라서 우리는 적절한 학습률을 설정해야 한다.
적절한 학습률로 $W$, $b$값을 계속해서 개선한다면 오차를 줄일 수 있을 것이다.
경사 하강법(Gradient Decent) 요약
- W 값과 b 값을 초기화한다.
- W 값과 b 값을 각각 편미분한다.
- W 값과 b 값을 개선한다.
- 최적의 W 값과 b 값을 찾을 수 있도록 2~3번을 반복한다.
경사 하강법(Gradient Decent) 코드
우리는 다음과 같이 $x$ = [1, 2, 3], $y$ = [80, 82, 89]의 값을 가졌다고 가정한다.
처음에 우리는 $W$ 값과 $b$ 값을 초기화 시킨다. 편의 상 $W=0$, $b=1$ 으로 초기화했다.
x = [1, 2, 3]
y = [80, 82, 89]
W = 0
b = 1
learning_rate = 0.1
1000번을 반복한다고 했을 때, x의 요소 개수 만큼 $\frac{\sigma J}{\sigma W}$ 값과 $\frac{\sigma J}{\sigma b}$ 값을 계산 후 $W$ 값과 $b$ 값을 개선한다.
for i in range(1000):
differential_W=0
differential_b=0
for j in range(len(x)):
differential_W+=(W*x[j]+b-y[j])*x[j]
differential_b+=(W*x[j]+b-y[j])
differential_W/=len(x)
differential_b/=len(x)
W=W-learning_rate*differential_W
b=b-learning_rate*differential_b
그러면 다음과 같이 $W$ 값과 $b$ 값을 개선함에 따라 기울기가 데이터에 맞게 변화하는 것을 볼 수 있다.