머신러닝

KimJS·2020년 4월 15일
1

경사하강법

  • 어떤 손실함수(loss function)이 정의되있을때 손실함수의 값이 최소가 되는 지점을 찾는 방법

손실함수

  • 예상한 값과 실제 타깃값의 차이를 함수로 정의한 것을 말한다
  • 이전에 사용한 오차를 변화율에 곱하여 가중치와 절편을 업데이트 하는것은 '제곱 오차'라는 손실함수를 미분한 것이다.

제곱 오차(squared error)

  • 타깃과 예측값을 뺀 다음 제곱한 것

  • 제곱 오차가 최소가 되면 산점도 그래프를 가장 잘 표현한 직선이 그려진다

  • 제곱 오차 함수의 최솟값을 알아내려면, 기울기에 따라 함수의 값이 낮은 쪽으로 이동해야 한다.

  • 기울기를 구하려면 제곱 오차를 가중치나 절편에 대해 미분해야 한다.

  • 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()

0개의 댓글