로지스틱 회귀 뉴런으로 단일층 신경망

 신경망 이야기 하게 되면,  제프리 힌튼 교수 처음 강의에 뉴런에 대해서 나온다.  한국어로 번역이 가능 한데,   음성을 영어로 인식 한 다음에  번역한 다음에 한국어로 나오게 할 수 있다.  

즉 사람의 뇌의 구조는 복잡하게 되어 있다는 데  뉴런이 10^10개  100억개가 있다고 한다.  생물학적인 성격의 설명이 있는데,  직접 동영상을 보는 것이 좋을 것 같아서 링크하였다.

    

1. 일반적인 신경망  


 일반적인 신경망은 가장 왼쪽이 입력층(input layer), 가장 오른쪽 출력층(output layer) 그리고 가운데 층들은 은닉층(hidden layer)라고 부른다.

 

2. 단일 층 신경망 

   단일 층 신경 망은  앞에서 이미 설명 하였다.   단일층 신경망에 대해서 알고 싶으면, 아래를 클릭 후 본 다음에 다시 여기로 오면 된다. 

이론 

https://rdmkyg.blogspot.com/2021/05/part-1.html


예제

https://rdmkyg.blogspot.com/2021/05/wisconsin-breast-cancer-dataset.html




위의 예제에서 설명한 자료는 이미 단일층 신경망을 역할을 하였으므로,  신경망을 더 구할 필요는 없다.  

 하지만 Loss Function을 이용해서 Loss 값을 관찰 해서,  여러가지 기능을 추가 시킬 수 있다. 
  




지금까지 학습 한 내용을 Loss Function을 이용하게 되면,  위와 같은 값이 나오지 않는다.  
그 이유는 경사 하강 법을 사용하지 않았기 때문이다.  



3. 경사 하강법  
     샘플 데이터 1개에 대한 그레디언트 계산하는 것을 확률적 경사 하강법(Stochastic gradient decent)이라고 부른다. 


경사 하강 법에는 확률적 경사 하강법만 있는 것이 아니라 배치 경사 하강 법도 존재한다. 
이유는 최적치에 수렴 하는 과정을 안정적으로 하기 위함이다.   배치 경사 하강법에는 아래와 같이 존재 한다. 

  • 배치 경사 하강법(batch  gradient descent)  :  한번에 그레이언트 계산 
  • 미니 배치 경사 하강법 (mini batch gradient descent) : 배치크기를 작게 하여 계산


  직접 딥러닝 프로젝트를 하면,  학습 곡선이 불안정 할때가 있다.  학습곡선이 불안정 할때는 과다계상(Over fitting) 된 것도 있지만,  때로는 경사 하강 법 할때,  배치 사이즈가 커서 불안정 하게 보일 때가 있다.

    학습 곡선이 불안정 하면,  우리는 어떤 가중치를 가져갈지 할수가 없게 된다.   그래서 배치 사이즈를 줄여서 경사 하강법을 적용을 하면 학습곡선을 안정적인데,  계산 시간이 많이 걸린다.  

그런데,  컴퓨터 사양이 낮을 경우 많이 사용하는게 배치 사이즈를 적게 하여,  이미지를 제너레이팅 하는 방법을 많이 사용한다.
  


4. 매 애포크 마다 훈련 세트 샘플 순서 섞어 사용하기 
    경사 하강법을 사용을 할때,  매 애포크 마다 샘플의 순서를 섞어어 가중치의 최적값을 계산 하여야 한다.  
   
   아래 예제코드는  애포크 돌리때 마다,  샘플 데이터를 섞는 작업이 있다. 



  def fit(selfxyepochs =100):
    self.w = np.ones(x.shape[1])   
    self.b = 0                      
    for i in range(epochs):
      loss = 0
      indexes = np.random.permutation(np.arange(len(x)))  # 인덱스를 섞음
      for i  in  indexes:       # 모든 샘플에 대해 반복
        z = self.forpass(x[i])       
        a = self.activation(z)      
        err = -(y[i] - a)
        w_grad, b_grad = self.backprop(x[i], err)  
        self.w -= w_grad   
        self.b -= b_grad    

        a = np.clip(a, 1e-101-1e-10)
        loss += -(y[i]*np.log(a)+(1-y[i])*np.log(1-a)) 
      self.losses.append(loss/len(y))


 numpy에서 np.random.permuation() 함수가 데이터 인덱스를 무작위로 섞는 작업이다. 
모든 샘플 섞으면 조금 불안정 하지만 아래 그래프와 같이 그나마 안정적인 값을 볼 수 있다. 




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


댓글 없음:

댓글 쓰기

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

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