이론

image

  • 머신러닝이란?

    - 우리가 쓰기위해 만든 보편적인 알고리즘

    - 한국어로는 기계학습이라한다. 영어에 익숙해야져야한다. 그래야 자료를 많이 볼 수 있따.

    - 머신러닝은 크게 3가지로 갈린다.

    • Supervised learning(지도학습)
      - label(암인지 아닌지)를 맞추는데 도움을 주는 것을  feature(성별, 나이, 혹은 픽셀)라 한다.
      - x(feature) 과 y(label)이 있다. 즉, 맞추어야하는 정답에 해당하는 y값(label)이 있으면 supervised learning으로 풀어야한다.
      맞추어야하는 정답에 해당하는 y값(label)이 없다면  unsupervised learning으로 풀어야한다.
      - 현장(일상생활)에서는, unsupervised learning이 많이 쓰일 것이다.
        왜냐하면, supervised learning하나의 feature당 하나의 label이 딱딱 있어야한다.
        하지만, cctv/블랙박스의 많은 사진들 중 각각의 사진마다 하나의 사람을 태깅할 수 없기 때문이다. 즉, x와 y가 정확히 태깅되어있는 데이터를 쉽게얻을 수 없기 때문이다. 반면에 unsupervised learning은 각각의 feature에 해당하는 label이 있어야하는 것이 아니기 때문에, 상대적으로 알고리즘을 적용하기 쉽다.
      - 그러나 실제(현장)로는 supervised learning이 많이 쓰인다.  연구하기도 쉽고 성과가 잘나오기 때문이다.
        즉, 일상생활에서는 unsupervised learning이 많아야하지만, 연구와 실제(현장)는 supervised learning가 많이 쓰이고 있다|
        하지만 요즘 연구의 추세는 unsupervised learning에 대한 연구를 많이 시도하고 있다.
      - 간단히 말하자면, y값이 있으면 supervised / 없으면 unsupervised다.
        연구를 위해서 말해보자면, y값(supervised)이 있어서 잘했는지 못했는지 가이드를 해주는 컨셉이 supervised이고,
        y값이 없는데도 스스로 가이드해서 학습이 가능한 것은 unsupervised다.

    • 1. Supervised learning(지도학습)의 분류

      •  Tree 모델(Decision Tree)
      • Regression 모델 : 이게 딥러닝의 main
        • Linear Regression
        • Logistic Regression
        • support vector motion
        • Artficial Neural Network(ANN, 인공 신경 망)
        • CNN
        • RNN
    •  2. Unsupervised learning(비지도학습)

         - x(feature)만 있고 y(label)는 없다. 
         - x와 y가 정확하게 맞추어져있는 태깅되어있는 반드시 없어도 되므로 적용하기 쉬우나.. 연구에 있어서는 supervised가 많음
            y가 많으므로. 그러나 지금은 un~으로 가는 중 왜냐하면
         - 가이드가 지도해줄 y값이 없는데도 불구하고 스스로 아이가 학습하는 것. 아이가 중력/가속도를 스스로 알아낸다.
    • 3. Reinforcement learning(강화학습) :

         - 알파고가 아니면 다룰 일이 없다. 앞으로 응용할 때도 없음. 응용할 곳이 별로 없다.


  • 딥러닝?

    - 마케팅적인 요소가 적혀있다.  그래서 연구쪽에서는 인공신경망이라고 말한다.

    • - 딥러닝이란? 머신러닝 알고리즘(3)Supervised learning Regression모델 을 먼저 알아보자.
         1) Linear Regression 모델-  y값이 -무한대 ~ +무한대의 범위를 가지는 Regression문제를 푸는 알고리즘,
         2) Logistic Regression 모델 - y값이 0 or 1이 나오는 Classification문제를 푸는 알고리즘,
           - 1)과 2)는 전통적인 Regression모델이다. 이제 3)부터는 요즘시대에 말하는 딥러닝 알고리즘을 담고 있는 Regression모델
         3) Atficial Neural Network(A. N. N) - 사람 뇌의 Neural Network를 모방한 컴퓨터의 알고리즘 모델
           - A.N.N.은 가장 처음 나온 Single-Layer N.N. -> Multi-Layer N.N. -> Convolutional N.N. -> ... 로 발전하였다.
           - A.N.N. 을 사용하여 Regression 문제와 Classification 문제를 푸는 것이 목표이며
            A.N.N. 중 hidden-Layer가 3개이상 들어간 Multi-Layer N.N. 로  Regression/Classification문제를 푸는 것딥러닝이라 한다.
              1) y값이 -무한대 ~ +무한대의 범위를 가지는 Regression문제
              2) y값이 0 or 1이 나오는 Classification문제
    • - 이번시간에는 하나인 Artificial Neural network 중 가장 간단한 Single-Layer Neural Network를 먼저 공부해보자.


  • Artficial Neural Network


이번시간엔 A. N. N. 중 가장 간단한 Single-Layer Neural Network를 배울 것이다.
- 딥러닝, 알고리즘의 특성을 나타낼 수 있는 가상의 가장 심플한 dataset을 만드는 것이 중요하다.
  ANN의 datasetSupervised Learning으로서 기본적으로 featurelabel이 기본적으로 필요하다
- ANN은 Supervised Learning으로서 feature와 label이 있다고 했다.
- 실습은  1) Single Layer Neural Network에 관련된 RandomSearch / h-step Search / Gradient Descent 모델을 학습할 것이다.


image
image

실습 - 생략

로컬 노트북에 저장된 파일

이론2 - Gradient Descent 자세히 알아보기

머신러닝 3가지 중에 Supervised Learning은 x들과 더불어 y(답)이 있는 학습방법이다.

그 중 Regression 모델인 ANN, RNN, CNN, 선형회귀, 로지스틱회귀 등이 있지만, 그 중 ANN을 다루고 있다.

  • Artficial Neural Network
    1. Single-Layer Neural Network
    2. Multi-Layer Neural Network
    3. Convolutional Nerual Network

Single-Layer Neural Networkperceptron은 동일한 개념이라고 생각하자.
image

  • y(답)과 x(feature들) 있는 어떠한 데이터가 주어졌다고 가정하자. (x는 여러개 일 수 있지만 하나라고 가정)
    이러한 데이터는 Supervised learning을 적용할 수 있고, 그 중에 Regression 모델을 쓴다고 했을 때,
    A.N.N 중 가장 간단한 S.L.N.N.로 Regression문제를 풀 때는, feature에서 -> label예측값을 도출해내는 weight와 bias를 구해야한다.
    이러한 과정을 Optimalization이라고 한다.
    이러한 최적화 기법에는 여러가지 방식(Random Search, h-step Search, Gradient Descent)이 있지만,
    그 가운데 가장 효율적으로, A.N.N.을 학습시켜 weight와 bias를 구하는 알고리즘Gradient Descent이다..
    - 기본적으로 앞으로 학습하는 모든 A.N.N.은 이 Gradient Descent를 사용해서 학습시킬 것이다.
    - Gradient의 핵심은 loss, cost function을 편미분하여 w와 b의 업데이트량을 구할 수 있는 알고리즘이다.
    - 제대로 학습되었다면 좋은w(배점, weight)와 b(bias)를 찾아내서 -> 다음data에 대한 y를 예측할 수 있다.
  • 이러한 S.L.N.N.로서 문제를 풀 때, w와 b를 잘 찾아냈는지를 나타내는 함수Loss function이다.
    그리고 y_predict(예측값)에 해당하는 함수가 hypothesis function이다
    Loss function이 하나의 데이터에 관한 얘기라면, Cost function전체 데이터에 관한 Loss function이다

  • 즉, 답을 알고 있는 data를 보고서, w와b를 예측하여, 다음의 답을 예측할 때
    Single-Layer Neural Network를 사용해서 풀고자 한다면,
    • 가장 먼저해야할 것Hypothesis function -> Loss function -> Cost function을 정의하는 것이다.
    • 다음은 Cost function을 w에 대해 편미분하여 -> 더 나은 w(점프거리)를 대략적으로 알아서 업데이트 시켜주는 것이다.
      - 결과적으로는 Loss function만 편미분 해주면, 알아서 나온다.
    • 마지막으로 epoch-loop 수 learning_rate를 통해  좀더 정확하게 w를 업데이트 해준다.

  • Loss function(y, h(x)) -( w에 대한 2차함수) 편미분하여
    Gradient Descent 알고리즘 속에서 갱신해줘야할 w의 방향성과 양을 대략적으로 알 수 있다고 했는데
    그림으로 표현해보면 아래와 같다.
    - L(y,h(x))를 편미분한 것이 w의 점프거리 갱신량과 대략적으로 비슷하다
    - 그래프상 접선의 기울기0이라면, 갱신할 것도 없이 w와 거의 같다. 기울기가 가파르다갱신량이 많은 안좋은 경우다..
    - 정확한 w의 갱신량은 epoch을 통한 loop와 learning_rate가 결정해 줄 것이다.
    image

    Loss function에 대해 정리하자면
    Regression문제를 - S.L.N.N.로 이용해서 풀 때,
    정의한 Loss function( L(y,h(x) = 1/2 ( h(x)-y)^2 )는  0이면 error가 0이라서 좋고, 무한대로 나오면 error가 큰 안좋은 경우다
    그러므로 w를 계속 업데이트 시켜서 h(x)-y = 0이 나오도록 만들어야 하는데,
    Loss function의 편미분한 값w를 찾아가는 점프거리를 반복해서 갱신해주는 방향성과 양(w변화량)을 의미한다.
    그래프상으로 접선의 기울기이다.

    참고) Regression문제에 쓰이는 Loss function을 MSE(mean square error) = 1/2 ( y_predict - y)^2 이라 한다.
    앞으로나올 classification문제에 쓰이는 Loss functiond을 Cross-entropy라 = -y*log(h(x)) - (1-y)log(1-h(x)) 한다.

  • Cost function은 결국에는 Loss function을 미분하면 되지만, 증명해보자.
    image

  • 결과적으로 코드상의 매칭은
    h(x) = wx+b  ---> y_predict
    image

    L(y,h(x))의 편미분  ---> w 의 변화량(점프거리 갱신)의 대략적인 것
    image

    J(w,b)의 편미분 ---> w의 변화량(learning_rate = 람다 제외)
    image



실제 데이터를 S.L.N.N.로 분석해보기

실습 노트북(로컬용)

어떠한 데이터를 보고서, label 칼럼에 대한 label(predict) 칼럼을 생성할 것이다.
예를 들어, 보스턴 집값에 대한 데이터를 가지고, 집값을 예측하는 알고리즘을 Gradien Desecent(Single-Layer Neural Network)로 만들어서 예측하자.

  1. numpy와 pandas 패키지를 import한다.
  2. Dataset데이터프레임으로 만든다.
    - 데이터 중에 칼럼명만 나열된 칼럼이 있다면, 가져와서 columns인자로 같이 DataFrame으로 만든다.
    - 데이터 중 target인 label데이터가 따로 있다면, label만 받아와서 DataFrame의 칼럼으로 추가해준다.
    - 만든 데이터는 shape와 head()를 확인한다.
  3. Gradient Descent 기본 코드를 가져와 적용해보자.
    image

    - 데이터의 각 feature에 해당하는 칼럼들을 x1, x2로 받자. 각 데이터 수만큼 리스트로 들어갈 것이다.
    - for문에 들어가기 전에,
      num_epoch과  learning_rate는 기본적으로 시작
      w는 feature수만큼 랜덤균등분포로 -1.0 ~ 1.0으로 생성
      b는 1개만 랜덤균등분포로 -1.0 ~ 1.0으로 하나 생성
    - for문 안에서는 돌면서 더 해피한 값으로 갱신들어야 할 것인
      y_predict 계산식이 있다. feature수만큼 수정해준다.
      error(예측값- 정답에 절대값씌운 평균)식은 그대로다.
      if error < 기준error값: break의 기준error값도 수정해준다.
      *기준error값은 해당 데이터의 y(label)을 기준으로 생각해준다.
      *만약, 집값 예측이라면, error기준이 5로 주어도, 5000달러(500만원)으로서 에러범위로서는 충분하다.
      if epoch 갯수별 print는 0 : 해당epoch과 1: error 수치만 띄워주도록한다.
      w값과 b 갱신식을 만들어준다. feature수에 맞게만 만들어주면 된다.
    image

  4. 만일 epoch 100, learning_rate 100으로 시작했는데, error가 줄지않고 늘면서 발산한다면,
    - 가장 만만한 것은 learning_rate를 줄여주는 것이다.
      *너무 줄이면, w가 없데이트가 안됨->y예측값 그대로->error도 그대로-> 발산 그대로-> 올려줘야함. 다른 것을 수정하더라도 error가 멈쳐있으면 learning_rate를 올려줘야함.
    - 1.0 -> 0.1 ->  0.01 -> ...-> 0.00001 식으로 나누기10씩 소수점을 넣어준다.
    - 0을 늘려줬는데, 발산하면 다시 0을 줄인다.
    - 그다음 마지막 자리수를 1->2->3으로 늘여준다.
    - 그다음 epoch을 10000, 100000 씩으로 늘여준다.
    - epoch만큼 print 단위와, 자리수배열을 예쁘게 만들어준다.
      
    * 딥러닝은 data에 따라 configuration(hyper-parameter)이 천차만별로 바뀌기때문에 tensorflow코드만 가져온다고해서 실행이 되지않는다. 그러므로 이론을 자세히 공부한 상태에서 응용이 가능하다.

  5. 이제 원하는 기준error수준으로 label이 예측가능해지면, 결과값을 뽑아낸다.
    - y_predict식을 가져와서 예측값을 데이터수만큼 확인해본다.
    - dataFrame을 .copy()해서 result라는 새로운df에 옮겨담는다.
    - y_predict를 데이터의 label예측 칼럼(predict)으로 추가해준다.


Single-Layer Neural Network도 실전에 이용할 수 있다.
real데이터에서도 어느정도 성능이 보장된다.


dot product

지금은 13개의 feature밖에 안되지만, 만약 feature가 300개가 넘어가면 y_predict 식을 작성하기가 쉽지가 않다. 그 때 쓰는 것이 dot product이다.
image

위의 그림를 보면, y_predict 계산식에서 가로는 x, 세로는 w가 될 것이다.

  • feature의 수만큼 생성했던 w를, 한번에 생성해도 된다.(size=13인자)
  • X에서는 feature들만 모아놓았기 때문에, y_predict = X(506 ,13).dot(w(13,1))+b 로 한번에 계산된다.
  • w를 업데이트해줄 때, 기존은  w = w - learning_rate * ( (y_predict - y)*x).mean()
    - feature 데이터만 모아놓은 X에 dot()을 적용하여, 순서대로 앞의 y_predict-y와 곱해져야한다.
    - X(506, 13)를 X.T로서 (13, 506)로 바꾸고,
    - y_predict - y(506, 1)을 dot하여 (13, 506)dot(506,1) -> (13,1)의 w데이터가 각각 업데이트 될 것이다.
    - 이제 .mean()의 개념을 도입하기 위해서, for문전에 num_data = X.shape[0]을 통해 X의 (506, 13)중 데이터의 수를 의미하는 506을 가져와서 나눠준다.

  • 만약, 공식상에서 나온 행렬의 곱에 dot product를 적용시킬 때, shape가 맞지 않아서 계산이 안된다면,
    1) 뒤에놈을 .T로 변형시키고
    2) 그놈을 앞으로 빼서 .T.dot( ) 해주면 된다.

    예를 들어, X(506데이터, 13feature수) * w(feature수13, output수 1)는 바로 X.dot(w)로 적용이 되지만
    w의 업데이트량을 의미하는 y_predict - y ( 506, 1 ) * X(506, 13) 의 계산에서는
    1) X.T(13, 506) -- y_predict-y(506, 1) 로 뒤에것을 T.로 뒤집고
    2) X.T.dot( y_predict -y ) 로 앞으로 빼서 dot을 적용시킨다.


image

+ Recent posts