경사 하강법(gradient descent) 으로 학습 하는 방법 야나두 딥러닝

    선형 회귀의 목표는 입력 데이터 (x)와 타깃 데이터 (y)를 통해 기울기가 절편을 찾는 것이었다.  즉 최소 제곱법에 의해 관측치와 평균치의 차이를 비교해서 기울기와 절편을 찾았다. 

경사하강법(gradient descent) 바로 그 방법 중에 하나이다.   경사 하강법은 모델이 데이터를 잘 표현 할수 있도록 기울기 (변화율)을 사용하여 조금씩 조정하는 최적화 알고리즘 이다.  경사 하강법은 모델이 데이터를 잘 표현 할 수 있도록 기울기(변화율을) 사용하여 조금씩 조정 하는 최적화 알고리즘 이다. 


1. 데이터 셋 설명       

   Diabetes Dataset(당뇨병 데이터 셋)
당뇨병 데이터셋 

위 과 같이 Target은  11개의 정량적인  건강수치를 측정 한 다음 1년후에 어떻게 진행 되었는지 조사하는 것이다.   

    여기에서 회귀분석시 사용하는 독립변수는 bmi 이다  bmi 진행에 따라 에 따라서 당뇨의 결과를 을 측정하여 보는 것이다.    아래는 예제 셋이다. 



 Index 에서 벼열 값이다.    BMI[0] 값을 정하면 0.0617 이다.    해석하면 BMI 0.0617 정도 변화 되면었을때,   1년 후 당뇨진행이 높아 졌다. 

2. 예측값과 변화율 

  예측값은 새로운 모델을 만들고 나서 새로운 공식이 나오면  어떤 입력값을 넣으면 출력 값이 나오는데, 이것을 예측값 이라고 한다. 


      $$ \hat{y} = wx +b $$

 아래 변수를 설명하면
  • $ \hat{y} $  :   예측값 (와이햇)
  • w :  가중치 (웨이트 )  
  • b : 절편


3. 예측값 모델 찾기 

  예측값 모델 찾기 위한  적정 w(가중치) 와 b(절편값)을 찾는 절차는  아래와 같다. 

  1. w와 b 값을 무작위로 초기화 한다.   통상 1로 한다. 
  2. x에서 샘플 하나를 선택하여 $\hat{y}$을 계산 하여 예측  한다. 
  3. $\hat{y}$ 과 선택한 샘플을 진짜 y와 비교 한다. 
  4. $\hat{y}$ 이 y와 더 가까워지도록 w, b를 조정한다. (w, b를 조정함)
  5. 모든 샘플을 처리 할 때까지 2~4번 항목을 계속 돌린다. 

 1) w 와 b 초기화 하기
       w = 1,  b = 1

4. W 가중치 데이터 조금씩 조정

 2)  첫번재 샘플 예측값 얻기
      There  x  is BMI 
      $\hat{y} $ =  x [0] * w +b = 1.06169     
                    =  0.0617 * 1 +1 = 1.06169
       
3)  w 값을 조절해 예측값을 바꾸기 
     Δw = w + 0.1 = 1.1
          = 1 + 0.1 = 1.1
     Δ$\hat{y}$ = x[0] * Δw + b = 1.06787
       
 4) w 값을 조정하여 예측값을  바꾸기 
    w_rate $ =  { {(Δ\hat{y} -\hat{y})  \over (Δw - w)}} = 0.0617  $

   w_rate $ =  {  (1.06787 - 1.06169 )  \over   (1.1 - 1) }   $ = 0.0617

※ w_rate는 x[0]과 같음

 가중치 w 값을 첫번째로 바꾸었다.   예측 값 $ \hat{y}$ (1.06787) 과 종속변수 ( 151 -여기에서는 Target이라고 부른다. ) 차이가 매우 크다.      


5. b 절편을 데이터 조금씩 조정

 2) 첫번재 샘플 예측값 얻기
      $\hat{y} $ =  x [0] * w +b = 1.06169     
                    =  0.0617 * 1 +1 = 1.06169
 
3)  b 값을 조절해 예측값 바꾸기 
      Δb =  b + 0.1 =1.1
           = 1  + 0.1 = 1.1  
      Δ$\hat{y}$ = x[0]*w +  Δb = 1.16169          
                    = 0.0617 + 1.1 = 1.16169

4) 값을 조절해 예측값 바꾸기 
    b_rate $=  { (Δ\hat{y} -  \hat{y} )  \over (Δb - b) }  = 1$ 
              $ =  { (1.16169 - 1.06169)   \over (1.1 -1 ) } = 1 $           

 5) 새로운 b  값
    b_new = b+ b_rate = 2

b 절편값과 w 값이 적용되었다.   1번째 리터레이션 값에 대한 결과는 아래와 같다. 
   There are  result   w = 0.0617,   b =2  input variable 
  $$\hat{y} = 0.0617x +2 $$

아직 끝난게 아니다.  이것을 레코드 442 개를 전부 돌리면 아래와 같은 그래프 모양이 나온다. 




 $\hat{y}$ 이  y에 한참 미치지 못하여 w와 b를 수정하지 못한 Case임 

이 부분을 해결하기 위해 오차역전파(Backpropagation) 생겼다.

6. 오차 역전파 (Backpropagation)

 경사 하강법에서 조금씩 조정하는 방식으로는 최적의 가중치와 절편을 찾지 못하였다.  이것을 해결하고자 아래와 같은 방식을 사용한다. 

 오차 역전파(backpropagation)는 $\hat{y}$과 y의 차이를 이용하여 w와 b를 업데이트 한다. 
즉  $\hat{y}$과 y의 차이를 계산 하여, w 값을 많이 바꾸고,  b의 방향을 바꾸게 된다.  
앞에서 계산 한  첫번째 가중치를 Base로 하여,  오차 역전파를 아래와 같이 계산 하겠다.  오차 역전파를 계산 할때는 가중치와 기울기 b를 같이 업데이트 하여 계산 하겠다. 

  1) 데이터 초기화 
       w_rate = 0.0619  (가중치 데이터를 조금씩 조정한 1단계 값)
       w = 1
       b = 1
       
  2) 오차 변화율을  곱하여 가중치 업데이트
       
      첫번째 훈련 데이터  얻기                                             

       $\hat{y} $ =  x [0] * w +b = 1.06169     
                      =  0.0617 * 1 +1 = 1.06169      

      오차값을 구함
        ε = y[0] - $\hat{y} $= 149.938
           = 151 -  1.06169 =  149.938
    
    오차값을 업데이트
       w_new = w +w_rate * ε = 10.2506
                    1  + 0.06169 * 149.938 = 10.2506
   
       b_new = b + 1 *ε = 150.9383
                   1  + 1*149.938 = 150.9383

3) 두번째 샘플 업데이트  
      w_rate (w 가중치) 값이 w 값을 조금씩 조정하는 식을 적용해도 자신의 샘플값과 같아진다는 결론을 얻었다.   정의 하면 아래와 같다. 
   
   w_rate = x[1] , w_rate = -0.0515
  

  두번째 예측치를 구할때는 첫번째 훈련된 결과 값인 w_now와 b_new 를 사용한다.   
  $\hat{y}$ = x[1] * w_new +b_new  
              = -0.0515 * 10.2506 + 150.9383 =  150.410
  ε = y[1] - $\hat{y}$
       75 - 150.410 = - 75.41 
  w_new = w_new + w_rate * ε = 14.1323
               10.2506 + -0.0515 * -75.41 =    14.1323

  b_new = b_new + 1 * ε = 75.527
              150.9383 + 1 * - 75.41  =  75.527


4) 전체 샘플 반복하기 
   전체 샘플을 zip(x, y) x인자와 y인자로  받아서 계산 하는 것이다. 
    
지금까지 계산 한 것을 받아서  루프문을 돌린 것이다.   만약에 zip 문이 이해가 잘 안된다면,
아래 내용을 클릭 하면 된다. 

7. 에포크(epoch)
    당뇨병 데이터 셋 442의 관측치를 위의 for 문 전체를 돌림 (향후 리터레이션 이라고 칭함) 후 나온 결과는 회귀 방정식의 기울기가 중심으로 오지 못한 것을 볼 수 있다.  
        
    
경사하강법 평가

    에포크 : 경사하강법에서는 선형 직선을 찾기 위해 주어진 데이터로 학습을 여러 번 반복한다.  전체 훈련 데이터를 한 단위로 작업하는 것을 에포크(epoch)라고 한다. 

  아래와 같이 오차 역전파를 100회 에포크(epoch)를 돌려 회귀 방적식 직선의 중심점을 찾음,  즉 딥러닝에서는 하나의 모델을 만든 후 최적값을 찾기 위해서는  여러번 학습 하여야 한다. 

   for I in range(1,100)

     for $x_i$, $y_i$ in zip(x, y): 
        $\hat{y}$ = $x_i$w +b
        ε = $ y_i - \hat{y} $
        w_rate = $x_i$
        w =  w + w_rate * ε
        b = b + 1 * ε

   
  위의 그림과 같이 에포크(epoch)를 돌렸을때,  최적의  기울기와 절편이 나왔다.    앞에서 문제를 공식을 풀었을때,  조금 복잡하게 풀었지만, 다음 이야기 할 손실 함수를 이용하면 간단하게 공식을 유도 할 수 있다. 



8. 손실 함수 (loss function)
   손실 함수의 개념을 딥러닝을 하는데,  매우 중요한 요소이다.   딥러닝 연산 자체가 손실 함수를 최소화 하려는  쪽으로 이동 하기 때문이다.    손실 함수는 제곱 오차부터 시작 한다. 

  제곱 오차(squared error)은 관측치와 예측값을 뺀 것을 제곱한 것이다.   공식은 아래와 같다. 

           SE = $ (y- \hat{y})^2 $

 - 제곱 오차가 최소가 되면 산점도 그래프를 가장 잘 표현한 직성이된다.   

-  제곱오차 함수의 최소값은 알려면 오차값이 낮은 쪽으로 이동한다.   

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


- 가중치에 대하여 제곱 오차 미분 (cost function)
 
$  { \partial SE  \over \partial w  }  =  { \partial \over \partial w } (y - \hat{y})^2   = 2(y - \hat{y})^2 = 2(y - \hat{y}) ( -{ \partial  \over  \partial w } \hat{y}) =  2(y - \hat{y}) ( -{  \partial \over  \partial w} wx +b ) $
                             $  =  2(y - \hat{y})(-x) = -2(y - \hat{y})x $





여기에서  $ hat{y} = wx +b $ 이다.    $hat{y}$ 에 wx +b를 미분하면 된다.  여기에서 하는 이분은 편미분인데,  용어만 특이 할 뿐   미분 하는 것은 w 가중치에 대한 것만 미분 하는 것이다.   

   위의 공식에서 초기 제곱 오차 공식을 $ { 1 \over 2 } (y -  \hat{y } )^2 $ 로 정의 하였다면 $ -(y - \hat{y})x$ 를 사용한다.  

  가중치에 대한 제곱 오차 변화율을 구하였고,  가중치는 변화율을 빼는 것으로 업데이트 한다.     즉 앞에서 다루었던 식을 증명 하는 것과 같다. 

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




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

댓글 없음:

댓글 쓰기

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

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