경사하강법(Gradient descent)란?
경사하강법의 기본 개념은 함수의 기울기를 구하고 경사의 반대 방향으로 계속 이동 시켜 극값에 이를때 까지 반복 시켜 제시된 함수의 기울기로 최소값을 찾아내는 머신러닝의 알고리즘입니다.
이것은 머신러닝에서 훈련데이터를 훈련을 마친 후 타겟데이터와 비교해서 손실값을 찾게 됩니다.
이러한 손실값이 최소화 하는 위치가 가장 좋은 훈련을 한 모델이 되는 것이므로 이러한 손실값이 최소화 되는 위치를 찾을때 경사하강법을 사용하게 됩니다.
선형회귀와 경사하강법의 관계
선형회귀의 목표는 산점도 그래프를 잘 표현하는 직선의 방정식 y = ax + b 에서 입력데이터(x)와 타깃데이터(y)를 통해 기울기 (a)와 절편 (b) 를 찾는 것입니다.
경사하강법은 모델이 데이터를 잘 표현 할 수 있도록 기울기(변화율)를 사용하여 모델을 조금씩 조정하여 최적화 하는 알고리즘입니다.
예측값이란?
우리가 입력과 출력 데이터를 통해 기울기(a)와 절편(b)를 발견하면 모델을 만들었다고 합니다.
그 모델에 대해 새로운 입력값을 넣으면 어떤 출력값이 나오는데 이 값이 모델을 통해 예측한 값입니다.
즉 새로운 모델 y = 2x + 1 을 만들었다고 하면 x에 1을 넣으면 타깃 데이터는 3이 됩니다.
이 값이 모델을 통해 예측한 값입니다.
예측값으로 올바른 모델 찾기
1) 무작위로 기울기(w)와 절편(b)를 정합니다.
2) x에서 샘플 하나를 선택하여 이 모델의 예측값을 계산합니다.
3) 예측값과 실제 타깃값을 비교합니다.
4) 예측값이 타깃값과 가까워 지도록 w와 b를 조정합니다.
5) 모든 샘플을 처리할 때까지 2~4를 반복합니다.
파이썬 코드 예)
w = 1.0 #초기값으로 w=1.0,b=1.0
b = 1.0
y_hat = x[0] * w + b #첫번째 데이터로 예측값 계산
print(y_hat) #1.061
#타깃값과 비교
print(y[0] #151
#w값 조절
w_inc = w + 0.1 #0.1 만큼 증가 시키고 변화량을 관찰해 보자.
y_hat_inc = x[0] * w_inc + b
print(y_hat_inc) #1.067
#w값 조정한 후 예측갑 증가 정도 확인하기
w_rate = (y_hat_inc - y_hat) / (w_inc - w)
print(w_rate) # 0.061
위에서 계산한 w_rate 를 x[0] 에 대한 w의 변화율이라고 합니다.
그런데 이러한 변화율은 결국 훈련 데이터의 첫번째 샘플 x[0]입니다.
w_rate = (x[0]*(w+0.1)-w)/((w+0.1)-w) = x[0]
여기서 y_hat 의 값이 y 보다 작으면 y_hat의 값을 증가시켜야 합니다.
이 때 변화율은 양수이므로 w 값을 증가 시키면 y_hat을 증가 시킬 수 있습니다.
만약 변화율이 음수이면서 y_hat을 증가 시켜야 한다면 w값을 감소시키면 됩니다.
변화율로 가중치 업데이트 하기
위에서 변화율이 양수 일때 w 값을 증가 시켜야 했고
변화율이 음수 일때 w 값을 감소시켜야 하는 것을 확인 했습니다.
따라서 w에 변화율을 더해 주면 되는 것을 알 수 있습니다.
w_new = w + w_rate
변화율로 절편 업데이트하기
이번에는 절편 b에 대한 변화율을 구한 다음 변화율 b를 업데이트 해 보겠습니다.
w = 1.0 #초기값으로 w=1.0,b=1.0
b = 1.0
y_hat = x[0] * w + b #첫번째 데이터로 예측값 계산
print(y_hat) #1.061
#타깃값과 비교
print(y[0] #151
#b값 조절
b_inc = b + 0.1 #절편을 0.1만큼 증가
y_hat_inc = x[0] * w + b_inc
print(y_hat_inc) #1.161
#b값 조정한 후 예측값 증가 정도 확인하기
b_rate = (y_hat_inc - y_hat) / (b_inc - b)
print(b_rate) # 1.0
변화율 값을 확인배 보니 1.0 입니다.
1차 함수로 만든 그래프를 놓고 생각해 보면 절편이 1만큼 올라가면 y도 1만큼 올라가므로 당연한 결과 입니다.
즉 b를 업데이트 하기 위해서는 변화율이 1이므로 단순히 1을 더하면 됩니다.
다만 여기서 y_hat이 y에 한참 미치지 못하는 경우 w와 b를 큰 폭으로 수정할 수 없습니다.
이러한 문제를 해결하기 위한 오차역전파에 대해 알아 보겠습니다.
오차 역전파로 가중치와 절편을 업데이트
y와 y_hat 의 차이가 크면 w와 b를 더 많이 증가시키는 방법은 w의 변화율과 b의 변화율에 오차를 곱하는 방법이 있습니다.
err = y[0] - y_hat
w_new = w + w_rate * err
b_new = b + 1 * err
print(w_new,b_new) # 10.25 150.93
첫번째 샘플을 출력해 보면 w_new,b_new 가 큰 폭으로 바뀌었음을 알 수 있습니다.
이러한 방식을 모든 샘플을 사용해 가중치와 절편을 업데이트 하면 됩니다.
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
참고)
박해선님의 정직하게 코딩하며 배우는 딥러닝 입문
'강의자료 > 인공지능수학' 카테고리의 다른 글
[인공지능 수학] 주성분 분석 (6) | 2022.11.09 |
---|---|
[인공지능수학]MNIST (7) | 2022.10.31 |
[인공지능수학] 표준편차 (5) | 2022.08.10 |
[인공지능수학] 상관계수 (10) | 2022.07.11 |
[인공지능수학] 확률 (7) | 2022.04.04 |