선형 회귀를 위한 뉴런

   선형회귀를 위한 뉴런은 앞서 이야기 한 부분을 클래스 만들어 정리 하는 것이다.  초기에 알고리즘을 만들고 나면 클래스 형태로 정리 해야만,  나중에 큰 프로젝트 할때 유리 하다. 

    선형 회귀는 정방향 계산에서 부터 시작 이 된다.

        $ y  = w * x +b $

   파이썬에서 함수를 사용할때 def를 써야 하는데,  def__init__(self)는 변수 초기화 할때 사용한다. 그리고 나머지는 사용자 함수로서 사용한다. 

    1) 정방향 (forpass) 계산 

     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


  class만들 때는 self가 반드시 들어 간다  self는 현재의 인스턴스 객체를 가르키는 기능으로 쉽게 풀어 이야기 하면  self의 사전적 의미는 그대로 자기 자신을 이야기 한다.  self라는 지시어는 이름공간(namespace)와 관련  있다.  주의점은 클래스 내에서 함수가 정의 될때, 첫번째 매개변수는 self 이어야 한다. 


    2) 역방향(backpropagation) 계산 

       선형회귀에 대한 손실함수는 앞에서 증명 하였다.  손실함수의 증명된 결과는 아래와 같다. 

     $ { \partial SL    \over  \partial  w  }  = -(y - \hat{y})x $

     $ { \partial SL    \over  \partial  b  } = -(y - \hat{y}) $

    def  backprop(self, x, err)
       w_grade = x * err
       b_grade = 1 * err

   위 그림은 가중치 및 절편에 대한 경사하강법(gradient descent) 계산 하는 것이다.    위에 있는 가중치와 절편의 손실값을 계산 하여, 새로운 가중치와 절편을 만드는 것이다.    이렇게 계속 계산 하다 보면,   손실값이 가장 적은 시점이 오게 되는데,  그때가 우리가 이야기하는 최적화 된 값이 나오게 된다. 


   3) 훈련을 위한 fit 구하기  

  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.backporp(x_i, err)
      self.w -= w_grade
      self.b -=  b_grade

  fit에 대하여 구체적으로 살펴보면,  x, y이 인수와  애포크(epochs =100) 옵션값을 받아 수행 하는데,   앞서서 이야기한 가중치 학습 같이  정방향으로 계산 한 다음에 에러 값을 구하고   loss function으로 정의 된 backprop 함수에 넣어,  역방향으로 계산 후 가중치 w와 기울기 b를  업데이트 한다.  

  여기에서 옵션값 향후 파라메터 값인데,   애포크의 숫자에 따라 정확도가 좌우되고 모델이 불안 정할때,  early stop 하는 경우도 애포크를 얼마나 돌리느냐에 따라 바뀐다.  지금 일반 회귀분석이라 많은 양의 데이터를 계산 하지 않지만,  만약에 이미지 분석을 하게 되면 많은 양의 데이터가 들어가서 CPU계산으로 감당이 안되 GPU로 계산 해야 할 때가 온다. 

위의 있는 것을 하나로 묶어서 표현 해보자. 

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
    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_grade, b_grade = self.backprop(x_i, err)
        self.w -= w_grade
        self.b -= b_grade
    

 Neuron 이라는 클래스에  초기화 함수 정방향 함수, 역방향 함수,  모델 fitting화  하는 함수인 fit  함수가 있다.   이를 실행 하는 방법은 아주 간단하다. 

  첫번째 클래스 객체를 활성화 시킨다. 

    neuron = Neuron()

  두번째  객체 에서 x와 y값을 넣고 활성화 한다. 

    neuron.fit(x, y)

 세번째  가중치와 절편을 본다. 

   print(neuron. w, neron.b)

  

   4) 학습 완료된 가중치와 절편 확인 하기                     

     neuron.w(가중치),  neuron.b(절편)

    plt.scatter(x, y)
    plt1 = (-0.1, -0.1 * neuron.w + neuron.b)
    plt2 = (0.15, 0.15 *  neuron.w + neuron.b
    plt.plot([pt1[0], pt2[0]], [pt1[1], pt2[1]]) 
    plt.xlabel(‘x’)
    plt.ylablel(‘y’)
    plt.show()


   경사 하강법을 적용 하여, 회귀 분석 알고리즘을 완성 하였다.   자세한 소스코드는 아래를 클릭 하면 된다. 


※ 참고서적 : 정직하게 코딩하며 배우는 딥러닝 입문 (이지스퍼블리싱)

댓글 없음:

댓글 쓰기

css cheat sheet 클래스 선택자, margin(마진), display , center 조정 간단한 구성 요소

 앞에서는 html의 간단한 sheet를 소개 하였습니다.   html은  주로 골격을 나타나는 것이라, 디자인을 하는데는 css로 하여야 합니다.  아래 코드와 같이 css 관련 하여 매우 간단하게 코딩 하겠습니다.  body 부분의 css 코딩  ...