y = x^2에서 다음과 같이 a1, a2 그리고 m을 대입해 그 자리에서 미분하면 순간 기울기를 알수 있음
중요한 점은 최솟값 m에서의 기울기임.
1. 한 점에서 기울기를 구한다.
2. 구한 기울기의 반대 방향 (기울기가 +면 음의 방향, -면 양의 방향)으로 얼마간 이동시킨 a2에서 미분을 구한다.
3. 앞에서 구한 미분 값이 0이 아니면 1, 2를 반복
반복하다보면 기울기가 0인 점으로 수렴
학습률 기울기의 부호를 바꾸어 이동시킬 때 적절한 거리를 찾지못해 멀리 이동시키면 a의 값이 최솟값 0으로 가지 않고 위로 팅겨버림.ㅣ
얼마나 이동시킬지를 정하는 것이 중요한데 이동거리를 정해주는 것이 바로 학습률
경사 하강법은 오차의 변화에 따라 이차 함수 그래프를 만들고 적절한 학습률을 설정해 미분 값이 0인 지점을 구하는 것
(복습) 평균 제곱의 오차식
ti ==> yi로 생각
yi는 y=ax+b의 식에 xi를 집어 넣었을 때 값이므로 yi = ax + b를 대입
y-(axi+b)^2 이 때 우리가 궁금한 것은 a와 b 식 전체를 미분하는 것이 아니라 필요한 값을 중심으로 미분해야함.
a와 b로 편미분한다
이를 파이썬 코드로 구현하면
import numpy as np
import matplotlib.pyplot as plt
#공부 시간 x와 성적 y의 넘파이 배열을 만든다
x = np.array([2, 4, 6, 8])
y = np. array([81,93,91,97])
#데이터의 분포를 그래프로 나타낸다
plt.scatter(x, y)
plt.show()
#기울기 a값과 절편 b값을 초기화 한다
a = 0
b = 0
#학습률을 정한다.
Ir = 0.03
#몇 번 반복될지 설정한다.
epochs = 2001
#x값이 총 몇 개인지 셉니다.
n = len(x)
#경사 하강법을 시작합니다
for i in range(epochs) : ##에포크 수 만큼 반복합니다
y_pred = a*x + b ## 예측값을 구하는 식
error = y-y_pred ##
a_diff = (2/n) sum(-x(error)) #오차함수를 a로 편미분
b_diff = (2/n) * sum(-(error)) #오차 함수를 b로 편미분
a = a - Ira_diff
b = b - Irb_diff
if i% 100==0:
print("epoch = %.f, 기울기 = %.04f, 절편 = %.04f" % (i, a, b))
#앞서 구한 최종 a값을 기울기, b 값을 y절편에 대입해 그래프를 그립니다.
y_pred = a*x +b
#그래프를 출력합니다.
plt.scatter(x, y)
plt.plot(x, y_pred,'r')
plt.show()
대충 결과가 잘 나온다. 근데 문제는 파이썬 들여쓰기 에러가 나는게 슬프다.
a의 값이 2.3에 수렴하는 것과 y절편의 b값이 79에 수렴하는 과정을 볼수 있음
이렇게 최소 제곱법을 쓰지 않고 평균 제곱 오차와 경사 하강법을 사용해서 원하는 값을 구하기 가능
예측한 값과 다른 값이 나타나는 이유는 하나의 x값 말고 다른 요소가 결과에 영향을 미치기 때문임
정보를 추가해 새로운 예측 값을 구하려면 다중 선형 회귀를 만들어 주어야한다.
ex) 독립 변수를 2개 만든다..!
x1, x2 두개가 있다고 하자
이 코드를 구현해서 경사 하강법을 이용해서 만들어보자
아까 위에서 적은 코드에 2개를 추가해서 코드를 작성함.
점점 예측이 맞아지는 과정
텐서플로 : 라이브러리의 케라스 API
기울기 a는 변수 x에 어느 정도의 가중치를 곱하는 지 결정, 가중치 w
데이터의 특성에 따라 부여되는 값 편향 b
y = ax + b ==> H(x) = wx + b
평균 제곱 오차 ==> 손실 함수
최적의 기울기와 절편을 찾기 위해 경사 하강법 사용 ==> 옵티마이즈
텐서플로에 포함된 케라스 API중 필요한 함수들을 불러옴
model.add(Dense(1, input_dim = 1, activation = 'linear'))
model.compile(optimizer='sgd', loss='mse')
model.fit(x,y, epochs =2000)
딥러닝의 목적에 따라 다른 함수를 적을 수 있는데 예를 들어 sigmoid를 적을 수 있음
변수가 2개인 경우 x1, x2