저번 글은 선형 회귀를 위한 최소제곱법에 대한 내용이었는데요 계속해서 선형 회귀를 이어나가보도록 하겠습니다.
이번엔 경사하강법을 공부해보려 합니다.
1. 개념
선형회귀는 임의의 직선을 그어 이에 대한 평균 제곱 오차를 구하고, 이 값을 가장 작게 만들어 주는 기울기 a값과 절편 b값을 찾는 작업입니다.
선형 회귀는 현상을 분석하는 한 방법이고 머신러닝은 이 분석 방법을 이용해 예측 모델을 만드는 것입니다.
두 분야에서의 용어가 약간 다르게 되죠.
선형 회귀에서의 함수 $y=ax+b$ 처럼 문제를 해결하기 위해 가정하는 식을 머신 러닝에선 가설 함수(hypothesis)라고 하고 $H(x)$로 표기합니다.
기울기 a는 가중치(weight)라 하고 $w$로 표기하며 y절편 b는 데이터 특성에 따라 부여되는 값으로 편향(bias)라고 하고 $b$로 표기합니다.
따라서 머신 러닝에서는 $y=wx+b$로 표기되는 것입니다.
또한 실제 값과 예측 값 사이의 오차에 대한 식을 손실 함수(loss function)이라고 합니다.
그리고 이번 글에서 다룰 경사하강법은 딥러닝에서 옵티마이저(optimizer)라고 합니다.
선형 예측 함수를 구하는 대표적인 방법인 경사하강법은 오차의 변화에 따라 이차 함수 그래프를 만들고 적절한 학습률을 설정해 미분 값이 0인 지점을 구하는 것입니다. 식의 y절편 값인 b의 값도 이런 성질을 갖고 있어 최적의 값을 찾기 위해 쓰이기도 합니다.
이 그림은 경사하강법의 과정인데요 반복적으로 기울기 a를 변화시켜서 m 값을 찾아내는 방법입니다.
기울기를 바꿀 때 적절한 거리로 이동시키도록 학습률을 정할 수 있습니다.
식의 a, b에 임의의 값을 대입했을 때 나오는 예측한 값과 실제값으로 오차를 구하는데
평균 제곱 오차(MSE)는 이 예측한 값과 실제 값의 오차를 제곱한 값의 평균입니다.
오차의 합 = $\sum{(y_i - \hat{y_i})^2}$
MSE = $\frac{1}{n}\sum{(y_i - \hat{y_i})^2}$
경사하강법은 미분 값을 구하는 것이기 때문에 MSE의 식을 미분해주어야 합니다.
a값을 구하기 위해 a로 편미분하면
$$\frac{2}{n}\sum{-x_i(y_i - (ax+b))}$$
b값을 구하기 위해 b로 편미분하면
$$\frac{2}{n}\sum{-(y_i - (ax+b))}$$
입니다.
이제 파이썬으로 코딩을 해보겠습니다.
2. 순서도
3. 코딩
코드를 짜보겠습니다.
import numpy as np
import matplotlib.pyplot as plt
#데이터 값
x=np.array([])
y=np.array([])
#a, b 값 초기화
a=0
b=0
lr = #학습률
epochs = #반복횟수
n=len(x)
for i in range(epochs):
y_pred = a*x + b
error = y - y_pred
a_diff = (2/n)*sum(-x*y_pred)
b_diff = (2/n)*sum(-(error))
a = a - lr*a_diff
b - b - lr*b_diff
if i%100 == 0:
print("epoch=%.f, 기울기=%0.4f, 절편=%0.4f" % (i, a, b))
y_pred=a*x + b
plt.scatter(x,y)
plt.plot(x, y_pred, 'r')
plt.show()
4. 실행
책에 있는 데이터로 하기엔 심심해서 다른 데이터 셋을 생각해보았는데요
으음......
지금 노래를 듣고 있는데 가사의 글자수와 곡의 길이에 대해 보고싶어졌습니다.
한 그룹의 곡 데이터를 가져오도록 해보겠습니다.
10곡의 각각의 가사의 글자수와 곡 길이는 다음과 같습니다.
학습률 lr = 0.000001로 해주었고
반복횟수 epochs= 5000로 하였습니다.
x축과 y축의 레이블인
plt.xlabel('number of words')
plt.ylabel("time(s)")
를 추가해주고 실행해보면
다음과 같이 기울기는 0.2870, y절편은 0.0282이 나왔습니다.
이렇게 2가지 데이터에 대한 경사하강법을 해보았는데요 데이터를 늘려주면 다중 선형 회귀 모델도 만들어 볼 수 있습니다. 조금만 더 추가하면 만들어볼 수 있으니 나중에 더 해봐겠습니다.
참고자료: [모두의 딥러닝]_조태호
'프로그래밍 > 인공지능' 카테고리의 다른 글
오차 역전파와 활성화 함수 (0) | 2023.06.01 |
---|---|
다중 분류(multi classification) (0) | 2023.05.31 |
퍼셉트론(Perceptron) (0) | 2023.05.30 |
로지스틱 회귀 (0) | 2023.05.17 |
선형회귀 - 최소 제곱법 (0) | 2023.03.23 |