타깃과 예측값을 뺀 다음 제곱한 것
제곱 오차가 최소가 되면 산점도 그래프를 가장 잘 표현한 직선이 그려진다
제곱 오차 함수의 최솟값을 알아내려면, 기울기에 따라 함수의 값이 낮은 쪽으로 이동해야 한다.
기울기를 구하려면 제곱 오차를 가중치나 절편에 대해 미분해야 한다.
w에서 변화율을 더하지 않고 빼는 이유는 손실 함수의 낮은 쪽으로 이동하고 싶기 때문이다.
오차 역전파에서 적용하였던 수식(w + w_rate*err)은 제곱 오차를 미분한 것과 같다.
손실 함수에 대해 일일이 변화율을 계산하는 것이 아니라 편미분을 사용하여 변화율을 계산한다.
변화율은 인공지능 분야에서 그레디언트(gradient)라고 부른다.
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 backpass(self, x,err):
w_grad=x*err
b_grad=1*err
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.backpass(x_i,err)
self.w-=w_grad
self.b-=b_grad
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()