- 선형 회귀 목표는 입력 데이터(x)와 타깃 데이터 (y)를 이용해 기울기(a)와 절편(b)을 찾는 것
- 산점도 그래프를 잘 표현하는 직선의 방정식을 찾는 것
-
경사 하강법의 목표
- 선형 회귀의 방법 중 하나이다
- 기울기(변화율)를 이용해 모델을 조금씩 조정하는 최적화 알고리즘
-
예측값과 변화율
- 딥러닝 분야에서 기울기 a를 가중치를 의미하는 w나 계수를 의미하는 θ로 표기하고 y는 y^를 사용해 화이 햇으로 읽음
- y = ax + b의 알고리즘 ==> y^ = wx + b로 변형
- 가중치(w)와 절편(b)는 알고리즘이 찾는 규칙
- y^는 우리가 예측한 값(예측 값)을 의미
- 예측 값이란?
- 입력과 출력을 통해 규칙을 발견하면 모델을 만들었다 명명
- 그 모델에 대해 새로운 입력값을 넣으면 어떤 출력이 나오는데 이 값이 모델을 통해 예측한 값
- y == y^지만 y^는 예측 값이라는 점
-
예측 값으로 올바른 모델 찾기
훈련 데이터에 잘 맞는 w와 b를 찾는 방법 |
무작위로 w와 b를 정한다(무작위 모델 만들기) |
x에서 샘플 하나를 선택하여 y^를 계산(무작위 모델 예측하기) |
y^과 선택한 샘플의 진짜 y를 비교(예측 값과 진짜 정답 비교, 틀릴 확률 99%) |
y^이 y와 더 가까와 지도록 w, b를 조정(모델 조정) |
모든 샘플을 처리할 때 까지 위의 항목 반복 |
1. w와 b 초기화 하기
- w와 b를 무작위로 초기와 ex) 1.0
w = 1.0
b = 1.0
2. 훈련 데이터의 첫 번째 샘플 데이터로 y^ 얻기
- 임시로 만든 모델로 훈련 데이터의 첫 번째 샘플 x [0]에 대한 y^ 계산, 계산한 값을 y_hat변수 저장
y_hat = x[0] * w + b
print(y_hat)
3. 타깃과 예측 데이터 비교하기
print(y[0])
4. w 값 조절해 예측값 바꾸기
- 예측한 y_hat의 값은 1.06
- 타깃은 151.0
- w를 0.1만큼 증가시켜 y_hat의 변화량 확인
w_inc = w + 0.1
y_hat_inc = x[0] * w_inc + b
print(y_hat_inc)
5. w 값 조정 후 예측 값 증가 정도 확인
- w가 0.1만큼 증가 했을 때 y_hat의 증가도를 계산하기
w_rate = (y_hat_inc - y_hat) / (w_inc - w)
print(w_rate)
- 앞에서 계산한 값 0.0616.....을 첫 번째 훈련 데이터 x [0]에 대한 w의 변화율이라 한다.
- w_rate에 대한 코드를 수식으로 정리할 경우 변화율은 결국 훈련 데이터의 첫 번째 샘플인 x [0]이다
- 이로 인해서 y_hat의 값이 y보다 작으므로 y_hat의 값을 증가시켜야 한다
- 변화율이 양수(y_hat값이 작을 타깃보다 작을 경우) 일 때는 w를 증가하고 음수 일 땐 w를 감소시킨다.
-
변화율 가중치 업데이트
- 변화율이 양수일 때 가중치 업데이트 방법
- 변화율이 0보다 큰 경우
- w가 증가하면 y_hat도 증가하여 변화율에 w를 더하는 방식으로 w증가
- 변화율이 음수일 때 가중치 업데이트 방법
- w가 감소하면 y_hat이 증가
- 변화율이 음수이기 때문에 변화율을 더하는 방식으로 y_hat을 증가시킬 수 있다.
결론 : 가중치(w)를 업데이트하는 방법은 모두 w + w_rate이다
w_new = w + w_rate
print(w_new)
-
변화율로 절편 업데이트 하기
- 절편 b에 대한 변화율을 구한 다음 변화율로 b를 업데이트
- 0.1만큼 증가시킨 후 y_hat이 얼마나 증가했는지 계산, 변화율 계산
b_inc = b + 0.1
y_hat_inc = x[0] * w + b_inc
print(y_hat_inc)
b_rate = (y_hat_inc - y_hat) / (b_inc - b)
print(b_rate)
- 결과론 변화율의 값은 1
- b가 1만큼 증가하면 y_hat도 1만큼 증가
- b의 업데이트는 1을 더하면 변화가 이뤄진다.
b_new = b + 1
print(b_new)
지금까지 한 w와 b를 업데이트하는 방법이 매우 수동적으로 이뤄지는 이유
- y_hat이 y에 한참 미치지 못하는 값인 경우, w와 b를 더 큰 폭으로 수정이 불가능(기준이 없음) |
- y_hat이 y보다 커지면 y_hat을 감소시킬 수 없음 |
-
오차 역전파로 가중치와 절편은 더 적절하게 업데이트 하기
- 오차 역전파(backpropagation)는 y^과 y의 차이를 이용해 w와 b를 업데이트한다.
- 오차가 연이어 전파하는 방식으로 수행
- 가중치와 절편을 더욱 적절하게 업데이트하는 방법
- y에서 y^를 뺀 오차의 양을 변화율에 곱하는 방법으로 w를 업데이트해보기
- 특징 : y^이 y보다 많이 작은 경우 w와 b를 많이 바꿀 수 있음, y^이 y를 지나칠 경우 w와 b방향 전환 가능
1. 오차의 변화율을 곱하여 가중치 업데이트 하기
- x [0]일 때 w의 변화율과 b의 변화율에 오차를 곱한다
- 업데이트된 w_new와 b_new를 출력해보기
err = y[0] - y_hat
w_new = w + w_rate * err
b_new = b + 1 * err
print(w_new, b_new)
2. 두 번째 샘플 x [1]을 사용해 오차를 구하고 새로운 w와 b 구하기
- w_rate를 별도로 계산하지 않는다(샘플 값과 같아진다는 것을 이미 알고 있기 때문)
- 현재 계산하는 w_rate는 x [1]
y_hat = x[1] * w_new + b_new
err = y[1] - y_hat
w_rate = x[1]
w_new = w_new + w_rate * err
b_new = b_new + 1 * err
print(w_new, b_new)
- w는 4만큼 증가하고, b는 약 절반으로 감소함
- 이 방식을 이용해 모든 샘플을 업데이트
3. 전체 샘플 반복
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
print(w, b)
4. 3의 과정을 통해 얻은 모델을 그래프 그려 표현
plt.scatter(x, y)
pt1 = (-0.1, -0.1 * w + b)
pt2 = (0.15, 0.15 * w + b)
plt.plot([pt1[0], pt2[0]], [pt1[1], pt2[1]])
plt.xlabel('x')
plt.ylabel('y')
plt.show()
5. 여러 에포크 반복하기
- 경사 하강법에서 사용되는 방법은 주어진 훈련 데이터로 여러 번 학습을 진행한다.
- 전체 훈련 데이터를 모두 이용하여 한 단위의 작업을 진행하는 것을 에포크(epoch)라 부른다
- 4에서 표현한 그래프를 보니 직선에 대한 표시가 중앙에서 멀게 표시된 것을 느낄 수 있다.
- 100번의 반복을 통해 직선이 어떻게 이동하는지 확인하기
for i in range(1, 100) :
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
print(w, b)
plt.scatter(x, y)
pt1 = (-0.1, -0.1 * w + b)
pt2 = (0.15, 0.15 * w + b)
plt.plot([pt1[0], pt2[0]], [pt1[1], pt2[1]])
plt.xlabel('x')
plt.ylabel('y')
- 어느 정도 직선이 데이터의 경향을 잘 따라가는 모습
머신 러닝 모델 : y^ = 913.6x + 123.4
6. 모델로 예측하기
- 입력 x에 없던 새로운 데이터가 발생했을 경우의 예측값 찾기
- 위에서 발견한 머신러닝 모델에 x값을 수정하면 된다
- x = 0.18일 때의 예측하기
x_new = 0.18
y_pred = x_new * w + b
print(y_pred)
- 산점도 표현
plt.scatter(x, y)
plt.scatter(x_new, y_pred)
plt.xlabel('x')
plt.ylabel('y')
plt.show()
- 그래프 오른쪽 위 붉은 점이 x = 0.18일 경우 예측한 y^의 값
정리
모델 제작 과정 |
w와 b를 임의의 값(1.0, 1.0)으로 초기화 하고 훈련 데이터의 샘플을 하나씩 대입해 y와 y^오차 구하기 |
위에서 구한 오차를 w와 b의 변화율에 곱하고 이 값을 이용해 w와 b업데이트 |
만약 y^이 y보다 커질경우 오차는 음수가 되어 자동으로 w와 b가 줄어드는 방향으로 업데이트 |
반대로 y^이 y보다 작으면 오차는 양수가 되고 w와 b는 더 커지도록 업데이트 |
'AI' 카테고리의 다른 글
3-4 선형 회귀를 위한 뉴런 만들기 (0) | 2020.11.18 |
---|---|
3-3 손실 함수와 경사 하강법의 관계 (0) | 2020.11.17 |
3-1. 선형 회귀 모델을 이용한 첫번째 문제 해결하기 (0) | 2020.11.13 |
2. 딥 러닝을 위한 기초 도구 (0) | 2020.11.11 |
1. 인공지능 소개 (0) | 2020.11.11 |