• 신경망 학습 # 1

    2020. 7. 15. 20:38

    by. 위지원

    밑바닥부터 시작하는 딥러닝 1
    국내도서
    저자 : 사이토 고키 / 이복연(개앞맵시)역
    출판 : 한빛미디어 2017.01.03
    상세보기

    위의 책 일부를 보고 공부한 내용


    - 퍼셉트론 : 다수의 신호를 입력받아 하나의 신호를 출력함 x+x2+..+xn => y 

    입력이 2개인 경우는

         출력 신호(y)를 입력(x)에 가중치(w)를 곱하여 얻을 수 있으며

         이 때 :

            임곗값(세타)을 넘으면 1

            그렇지 않으면 0

         이 때 :

            편향 값 b(bias)를 더해서 활성화 정도를 정할 수 있음

    활성화 함수 : 가중치 신호를 조합한 결과 a가 존재할 때, 활성화 함수 h()를 통과하여 최종 값 y가 도출됨.

    - 신경망 : 입력층 + 은닉층 + 출력층으로 나뉘어져있음 

     


    학습과 데이터

     

    학습이란 가중치 매개변수의 값을(w)를 데이터(x)를 보고 자동으로 결정한다는 것이다. 목적을 위하여.(cost 함수를 줄인다던가)

     

    학습(學習) 또는 배움은 본능적인 변화인 성숙과는 달리, 직간접적 경험이나 훈련에 의해 지속적으로 지각하고, 인지하며, 변화시키는 행동 변화이다. (https://ko.wikipedia.org/wiki/%ED%95%99%EC%8A%B5)

    ㅇㅕ담이지만,, 저 위에 있는 위키 링크에 있던 미래의 학교를 상상한 그림이라고 한다. 아마 저 기계들이 지금의 인공지능들이지 않았을까..? 

     

     

    선형 분리 가능 문제는 아래와 같이 선으로 데이터가 어떠한 그룹으로 분류가 될 수 있는 형태이다.  그래서 유한 번의 학습을 통해 풀수 있다. ( 퍼셉트론 수렴 정리 ) 하지만 (b)와 같은 경우는 분리가 불가능하다. 그래서 비선형 문제는 자동으로 학습이 불가능하다. 

    (a)

    (b)

    퍼셉트론 수렴 정리에 대한 내용은 아래 블로그에 자세하게 작성되어있습니다. (사실 아직 이해 못함)

     

    https://nbviewer.jupyter.org/github/metamath1/ml-simple-works/blob/master/perceptron/perceptron.ipynb

     

    Jupyter Notebook Viewer

    245번째 업데이트에 타겟값 [1,1,-1,-1]에 수렴하였습니다. 그림을 아래처럼 그려보면 결정경계가 잘 형성됨을 알 수 있습니다. 두번째 점이 경계위에 있는것처럼 보이는데 확대해서 그려보면 결정

    nbviewer.jupyter.org

     

    가령 아래와 같이 MNIST 데이터에서 사람은 눈으로 보면 구분이 가능하지만 컴퓨터는 바보라 모른다.  이를 구분 짓기 위해서는 이미지의 특징 벡터를 뽑아야한다. 

    추억의 mnist.. 저 때 집에도 못가고,, 아련하다.(눈물 찡)  https://weejw.tistory.com/search/mnist

     

    'mnist'의 검색결과

    공부를 기록해놓은 블로그입니다. 다른 문제는 upsidejiwon@gmail.com로 연락주세요. 오신김에 저희 고양이도 구경하세요

    weejw.tistory.com

    특징을 뽑기 위한 알고리즘은 여러 종류가 있다 SIFT, SURF, HOG 등으로 특징 데이터를 뽑고 SVM, KNN을 이용하여 데이터에 대해서 학습하여 분류하고 이후 데이터를 구분할 수 있다.

    • SIFT(Scale Invariant Feature Transform) : 이미지의 크기나 회전에 불변하는 특징을 추출
    • SURF(Speed-Up Robust Feature) : SIFT 보다 속도를 향상하고 Robust한 알고리즘 SIFT와 비슷하나 박스필터와 적분영상(Integral Image)을 사용하여 처리속도를 향상 시킴
      • box filtering은 아래와 같다.

    https://tech-algorithm.com/articles/boxfiltering/

    • HOG(Histogram of Oriented Gradients) : 보통 보행자를 검출하거나 사람 형태에 대한 검출에 많이 사용된다. 이미지의 지역적인 Gradient를 특징으로 사용한다. 
    • SVN(Support Vector Machine : 안정적인 데이터 분류 경계선을 찾기 위해 어떠한 제한 조건을 걸어 둔것 
    • KNN(K-nearest neighbor)은  : K 개의 가장 가까운 이웃들을 포함하여 분류 

    딥러닝(신경망)은 위와 같이 특징 알고리즘(사람이 생각함)을 이용해서 특징을 뽑고 분류 알고리즘(기계 학습)을 이용해서 처리한 결과를 전체 다 스스로 할 수 있다(end-to-end machine learning). 모두가 알고있듯이 모델을 학습할 학습 데이터와 모델을 평가할 실험 데이터 두 가지로 나뉘어야 한다. 그 이유는 모델의 범용성을 증대시키기 위함이다. 그러나 너무 학습 데이터만 지나치게 학습하면 오버피팅(overfitting)이 발생한다. 오버피팅은 데이터 세트에 지나치게 최적화가 되어 다른 데이터가 들어왔을 때, 예측 결과가 엉망인 경우를 이야기한다.

     

     

    손실 함수

    신경망 학습은 손실함수를 최소화 시키는것이 목적이다.  손실 함수의 종류는 여러가지가 있지만 일반적으로는 오차제곱합(SSE:Sum of Squares for Error)과 교차 엔트로피 오차(CEE:Cross Entropy Error)를 사용한다. 

     

     

    오차제곱합은 아래와 같이 계산한다. yk는 신경망의 출력, tk는 정답 레이블, k는 데이터의 차원 수 

    yk = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
    #softmax함수의 출력 값
    # 이미지가 0일 확률 0.1, 1일 확률 0.0, 2일 확률 0.6 ....
    tk = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]  #one-hot coding
    # 이 이미지는 2입니다(idx=2)
    
    그러므로 2일 확률을 0.6으로 예측했기때문에 이 예측은 성공

    ** Softmax(소프트맥스)는 입력받은 값을 출력으로 0~1사이의 값으로 모두 정규화하며 출력(단, 값의 총합은 항상 1)

     


    예제

     

    아래와 같이 오차제곱합 함수를 만들고 y와 t를 입력하여 코딩을 해보자. 

    첫 번째는 신경망 출력이 제대로 된 경우로 오차제곱합이 약 0.09

    두 번째는 신경망 출력이 제대로 안된 경우로 오차 제곱합이 약 0.5

     

    그러므로 첫 번째 결과가 정답에 가까운 것을 알 수 있다.

     

    교차 엔트로피 오차는 아래와 같이 계산한다.( 단, 로그는 자연 로그)

    y = logx 의 함수는 다음과 같다. 

     

    x가 1일 때, y는 0이고 

    x가 0에 가까워질 수록 y값이 점점 작아진다 (-값으로 향하는 중)

     

    교차 엔트로피 오차에 적용하면 정답에 해당하는 출력이 커질 수록(-4,-3,-2..) 0에 가까워지고 출력이 1이 되는 순간 0이 됨(1, 0)

     

    예를들면 -log0.6 = 0.51 이고 -log0.1 = 2.30 으로 나옴


    예제

    **delta : np.log()에 0이 입력되면 마이너스 무한대인 -inf가 되어 더 이상 계산 진행이 불가능해 아주 작은 값  .0000007을 더해서 절대 0이 되지 않도록.. 방지!

     

    위에 설명했듯이, 높은 확률을 가진 값일 수록 작은 값을 가지게 됨.

     

     

    미니배치 학습

    미니 배치는 전체 데이터 중 무작위로 훈련 데이터를 뽑아 하는 것이다. 데이터가 굉장히 많을 때 이것을 다 학습한다는 것은 무리..무리..

    데이터가 여러개인 경우의 엔트로피 손실함수는 다음과 같이 구할 수 있다. 그냥 N개로 확장한 것뿐임. (N으로 나누는 이유는 데이터의 정규화를 위해 이렇게 나누어 '평균 손실 함수') 

    https://github.com/WegraLee/deep-learning-from-scratch

     

     

    WegraLee/deep-learning-from-scratch

    『밑바닥부터 시작하는 딥러닝』(한빛미디어, 2017). Contribute to WegraLee/deep-learning-from-scratch development by creating an account on GitHub.

    github.com

    위에 가서 mnist 데이터를 우선 받아오자 mnist가 있는 dataset 폴더를 내 프로젝트 내에 넣어주고 

    import 해서 load_mnist 함수를 사용하면 다운중..

     

    다운로드에 실패했다. 찾아보니 공지가 있었구나!. 시키는대로 dataset 폴더에 넣어두자!

     

     

    그럼 아래와 같이  numpy array로 converting 작업이 이루어진다. MNIST 데이터는 총 6만개임

     

    입력 데이터는 총 784열, 정답 레이블은 10줄 짜리 

    랜덤으로 데이터를 뽑기 위해서는 np.random.choice() 함수를 사용하면 된다. 데이터의 크기와 batch 크기를 전달하면 랜덤으로 값을 생성한다. np.random.choice(0이상 train_size미안,무작위로 batch_size개)

     

    오차 제곱의 합을 배치용으로 수정하면 다음과 같다. 차이점은 형광펜으로 칠한 부분 2군데이다.

    배치 즉, 데이터가 한번에 여러개가 batch로 묶여 들어오는 경우를 거르는 if 문 dim == 1 (데이터가 한개)

    그리고 batch_size로 나누어 데이터를 정규화 하는 부분

    **shape[0]은 행, shape[1]은 열을 뜻한다. 행의 개수 = batch의 개수

    아래 코드는 원-핫 인코딩 배열이 아니라 label로 데이터를 건내주었을 때의 코드이다. 

    두 번째 코드는 -np.sum(np.log(y[np.arange(batch_size), t]+ 1e-7)) /batch_size 로 굵게 강조한 부분이 원 코드와 차이점이다.

    1. np.arange(batch_size)는 0부터 batch_size미만까지 배열을 생성

    2. y[np.arange(batch_size),t]는 각 데이터의 정답 레이블에 해당하는 신경망의 출력을 추출

       t=[2, 7, 0, 9, 4] then y[np.arange(batch_size), t] =  [y[0,2], y[1,7], y[2,0], y[3,9], y[4, 4] (단, batch_size = 5)

     

     

    않2.. 내가 이해를 잘못한건가? 책에 있는 코드를 주피터로 돌렸는데, 에러 뜨고 동일한 cost함수 값만 뱉어낸다. 뭐지?

     

    근데 왜  shapes가 784열 다들어간걸까? batch로 random pick 되었으면 784보다 작아야 하는거아닐까 .. 

    bath.. 무작위로 batch_size만큼 뽑아서...

    np.random.choice() 함수로 뽑아낸 배열을 미니 배치로 뽑아낼 데이터의 인덱스로 사용 .. 으로 나온게 저 값인데.. 분명 코드도 똑같이 했는데,, bath_size도 변경해봤는데 ,,

     

    위지원 해결하면 글을 더 쓰도록 ...

    '2020년 > Development' 카테고리의 다른 글

    신경망 학습 #3  (0) 2020.07.19
    신경망 학습 #2  (0) 2020.07.17
    아래 한글 HWP 개요 번호 새로 시작하기  (1) 2020.06.25
    is already defined  (0) 2020.06.11
    VScode에서 원격접속으로 코딩하기  (0) 2020.06.11