경사하강법의 보다 기술적 표현
손실 함수
제곱오차 (squared error)
SE = (y - y^)**2
이전에 가중치와 절편을 업데이트하기 위해 가중치와 절편의 변화율을 각각 구하고, 타깃값과 예측값의 오차를 곱한 것을 가중치와 절편에 더해주는 방식을 이용했다.
그러나 손실함수를 이용한 방식은 다음과 같다.
-2(y - y^)
1/2(y - y^)**2
``
앞으로는 손실함수에 대해 일일이 변화율의 값을 계산하는 대신 편미분을 사용하여 변화율을 계산한다. 변화율은 인공지능 분야에서 특별히 그레이디언트(gradient, 경사)라고 부른다.
인공지능 분야에서는 이 세가지 용어를 크게 구분하지 않고 사용하는 경우가 대부분.
y^ = w*x + b
class Neuron:
# 가중치 절편 초기화
def __init__(self):
self.w = 1.0
self.b = 1.0
# 정방향 계산 만들기
def forpass(self, x):
y_hat = x * self.w + self.b # 직선 방정식 계산
return y_hat
# 역방향 계산 만들기
def backprop(self, x, err):
w_grad = x * err # 가중치에 대한 Gradient를 계산
b_grad = 1 * err # 절편에 대한 Gradient를 계산
return w_grad, b_grad
# 훈련 메서드 만들기
def fit(self, x, y, epochs=100):
for i in range(epochs):
for x_i, y_i in zip(x,y):
y_hat = self.forpass(x_i)
err = -(y_i - y_hat)
w_grad, b_grad = self.backprop(x_i, err)
self.w -= w_grad
self.b -= b_grad
from sklearn.datasets import load_diabetes
import matplotlib.pyplot as plt
diabetes = load_diabetes()
x = diabetes.data[:,2]
y = diabetes.target # 배열 슬라이싱 샘플 0 1 2 뽑아내기
print(x.shape, y.shape)
(442,) (442,)
neuron = Neuron()
neuron.fit(x,y)
plt.scatter( x, y )
pt1 = (-0.1, -0.1 * neuron.w + neuron.b )
pt2 = (0.15, 0.15 * neuron.w + neuron.b )
plt.plot( [ pt1[0],pt2[0] ],[ pt1[1],pt2[1] ] )
plt.xlabel('x')
plt.ylabel('y')
plt.show()