경사 하강법이란?
저번 포스트에서 선형 회귀를 다루었다.
데이터에 가장 적합한 함수를 그려나갈 때 어떻게 데이터에 맞춰 나가며 그릴 것인가?
그에 대한 답 중 하나가 경사 하강법이다.
경사 하강법 적용
y = ax + b라는 식이 있다. 이 식을 데이터에 맞는 식으로 바꾸기 위해서는 a, b를 조정해야 한다.
우선 a, b를 임의의 값으로 초기화한다. 나는 모두 1이라 하겠다.
a = 1.0
b = 1.0
첫 데이터를 x에 입력한다면 y값을 예측할 수 있다. (예측값 y를 k라 하자)
그다음 우리는 k와 y(실제 답)을 비교하여 얼마나 잘 예측했나 판단할 수 있다.
내가 임의로 초기화한 값이 바로 들어맞을 확률은 거의 0%라고 생각한다.
그럼 이제 a와 b값을 조정하여 더 잘 맞추는 모델을 만들어 보자.
그렇다면 a, b를 몇으로 조정해야 할까??
임의의 값을 증가시켜보자. (이 값을 inc라 하자)
y_inc = a_inc * x + b 가 된다.
증가된 결괏값을 증가시킨 a값으로 나누면 결국 데이터의 값이 나온다.
즉, 데이터를 더한다면 기울기를 맞춰나가는 꼴이 된다. 이는 데이터가 음수이든 양수이든 옳게 적용된다.
그럼 이제 절편(b)은 어떻게 변경할까
증가된 결괏값을 증가시킨 b값으로 나누면 1이 나온다.
즉 1만 더하면 b는 잘 업데이트가 된다는 얘기이다.
정리하자면, 기울기는 데이터를 절편은 1을 더하면 잘 업데이트한다는 얘기이다.
하지만 무조건 더한다고 되는 것은 아니다.
여기에는 정도라는 게 적용이 된다. 데이터에 가까운 모델을 만들 때 계속 데이터와 1을 더하기만 하면 좋은 모델이 나올 일이 없다.
따라서, 실제 답(y)과 예측값(k)의 차이를 곱해서 더해주면 더욱 최적화된 모델로 갈 수 있다.
전체 데이터에 대해 위의 과정을 반복하면 최적화된 모델을 얻을 수 있다.
다음은 해당하는 코드이다.
for x_i, y_i in zip(x,y):
y_hat = x_i * w + b #모델 조정
err = y_i - y_hat #결과와 예측값 차이 계산
w_rate = x_i #기울기 변화율 계산
w = w + w_rate * err #기울기 조정
b = b + 1 * err #절편 조정