레이블이 python인 게시물을 표시합니다. 모든 게시물 표시
레이블이 python인 게시물을 표시합니다. 모든 게시물 표시

Linear algebra 선형대수 야나두 딥러닝

어느 딥러닝 책에서 이런 카피가 나왔다. 
 딥러닝과 수학엔 어떤관계가 있을까? 

 딥러닝은 미분적분학, 선형대수학, 통계학과 관련 있고 이중에서 선형대수학이 단연 으뜸이라 한다. 그런데 도대체 어떤 관계가 있다는 걸까?

  선형대수는 관련 성이 아주 깊다.  딥러닝 모델을 만들때, Single Layer를 만들어서 하는 경우는 거의 없기 때문이다.   Single Layer는  만드는 경우는  교육 받을 때 이외에는 거의 쓰지 않는다.   실제로 모델을 만들때는 Multi Layer를 사용한다.   Multi Layer의 기본적인 공식이 행렬로 이루어 졌으니,  반드시 알고 넘어가야 한다. 


  
선형대수  Linear algebra




numpy 기초 브로드캐스팅, array, arange, indexing, slicing 야나두 딥러닝

  딥러닝 초반에 공부 할 때,  사람들이 굉장히 많이 헤깔려 하는 분야가 있다.  바로 numpy이다.  기본적으로 Python을 할때,  리스트 및 배열을 표현한다.  numpy.에서   주로 하는 것은 배열을 차원으로 표현하는 것이다.   Image연산은 3차원 배열이 되고,   일반적인 머신러닝은 2차원 배열로 한다.  주로 사용하는 명령어는  array, arange, 이다.  

기본적으로 알고리즘을 표현 하려면, 일반적인 Python 과  numpy로 표현 해야 하는데,  이것을 모르는 상태에서  그냥 데이터 셋만 불러와서 모델을 돌리는 것은 의미가 없다.     딥러닝의 CNN의 모델이 있다고 가정 하면,   그 모델에 대하여,  파라메터 튜닝에 의해 모델의 성능이 달라지는데,   파라메터 튜닝을 알려면 기본적인 알고리즘은 이다.  
 




numpy의 국내 서적이 거의 없다. 있긴 한데,  굉장히 헤깔리게 많이 늘려 놓았다.  차라리 아래의 사이트에서 참조해서 코드를 익히는 것이 좋아서 아래의 사이트를 참고 하였다. 

넘파이 기초



교차 검증 (cross validation) 야나두 딥러닝

   교차 검증(cross validation)은  샘플의 갯수가 적을 때, 하는 알고리즘이다.  샘플이 많은 경우 굳이 교차 검증을 수행할 필요가 없다.  보수적으로 보았을때,  약 2,000개의 샘플 데이터가 있으면, 교차 검증을 할 이유가 없다.

   머신러닝에서 매우 많이 사용하는 것임,  이미지 계열의 딥러닝을 갔었을때,  너무나 많은 데이터가 있어,  굳이 할 필요가 없다.  그리고 소량의 이미지를 연산 하였을때,  전이학습을 통해서 학습을 하니,  교차 검증이 필요 없다.   


교차 검증(cross validation)

 

가중치 규제 (regularization) L1, L2 란 야나두 딥러닝

      과대적합을 해결 하는 대표적인 방법 중 하나인 가중치 규제(regularization) 이다.  가중치 규제란 말 그대로 가중치의 값이 커지지 않도록 제한 하는 기법이다.  가중치를 규제하면 모델의 일반화 성능이 올라간다. 


아래 경사가 급한 것과 낮은 그래프 특정 샘플에만 적용 하는 사례를 보여 준다.   즉 가중치를 제한 하면,  모델 몇 개의 데이터에 집착하지 않는다. 

노름(norm) 의 이란 야나두 딥러닝

 Norm, 노름 

과대적합(overfitting), 과소적합(underfitting) 야나두 딥러닝

  모델 돌린 이후에 분석하는 overfitting, underfitting

검증세트 분할, 데이터 스케일 과적합 및 모델 튜닝

과적합 및 모델 튜닝에 대하여..



    요새 Tensorflow나 Keras에 들어가면,  우리가 필요한 소스코드가 API 형태로 되어 있다.  따라서 데이터 전처리가  수행 되고 나면,    CNN인 경우  필터의 크기  및   dens의 크기 epochs 배치 사이즈, 데이터 분할 등  같은 파라메터 만 조정 하게 된다.    사실상 프로젝트에 들어가면,  모델 돌리는 것 보다  더욱 중요 한 것이,  데이터 셋 준비하는 것이다.  

특히 CNN 같은 경우에는 사람 눈으로 식별 할 수 있을 정도로 데이터 셋이 준비가 되어야 하는 것은 필수 적이다. 


검증 세트 분할 

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

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

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

    

1. 일반적인 신경망  

유방암 데이터 세트 (Wisconsin breast cancer dataset)

     제조업에는   금융하고, 의학 분야와 같이 분류 할 수 있는 데이터들이 많이 있다.  이번에 소개할 데이터 셋은 사이킷런에 있는 위스콘신 유방암 데이터 셋이다.  유방암 데이터 셋은 유방암 세포 특징 10개에 대하여 평균, 표준오차, 최대 이상치가 기록되어 있다. 


유방암 데이터 세트의 분석 목표는 유방암 데이터 샘플이 악성 종양인기 정상 종양인지 분류하는 문제 이다.  

 1. 유방암 데이터 세트 

분류 하는 뉴런 part 1

  분류하는 뉴런은  딥러닝에서 가장 많이 사용하는 것이다.   일반 데이터를 분류하고자 할때는 데이터가 없어서, 분류를 하지 못하였다면,  사진이나  글 같은 비정형 데이터는 상당히 많다.  하지만,  그것을 하는데도  사전에 전처리 기술이 필요하지만,  딥러닝은 퍼셉트론을 기반으로 지속적으로 발전 해 온 것도 사실이다.       


1. Perceptron(퍼셉트론)

기초 통계 2 [ 최대 우도법, 오즈비, 로짓 함수, 로지스틱 함수, 크로스 엔트로피]

    분류에 관련된 통계를 시작한다,   항상 분류에 대한 통계를 들어 갈 때는 강좌를 하는 사람이나 받는 사람 모두  부담이 된다.    최근에 딥러닝이,  그나마 성숙하고 성장하게 된 계기는 분류에 대한 부분이 최근에 발달이 잘 되어서 이다.   조금 어렵지만,   강의 자료인 만큼 쉽게 풀어서 쓸 것이다. 


 1. 최대 우도법   

선형 회귀를 위한 뉴런

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

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

        $ 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()


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


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

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

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

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


1. 데이터 셋 설명       

통계 기초 1 [평균, 분산, 표준편차, 정규분포, 회귀분석]

   딥러닝에서 왜 통계를 다루는 이유는  딥러닝을 배우려면 초기 모델부터 가야 하는데,  초기 모델은 대부분 통계에서 시작 되기 때문이다.  초기의 뉴런은 회귀 방정식에서 나온 직선 가지고 검증을 하였기 때문이다.    통계 기초는 다른 깊은 부분을 이야기 하기 보다는 회귀 분석 까지 가기 까지의 과정만 이야기 할 예정 이다. 


     회귀분석까지 가려면, 아래의 그림과 같다.   그리고,  통계 기초에 대해서는 이 한 개의 포스트로  정리 한다.  





1. 평균

엔트로피 𝑒𝑛𝑡𝑟𝑜𝑝𝑦 대한 이해 딥러닝 기초

  딥러닝 손실 함수 사용할때,  약방의 감초처럼 나오는 엔트로피 함수,   이것을 모르면, 일단 딥러닝을 모른 다 할 정도로 엔트로피 함수는 중요 하다.    딥러닝에서는 손실값을 구할때 사용하는 것으로,  사실상 손실 값을 계산 하지 않으면,  실제로 모델을 실행 시키고 나서 모델의 결과 값을 알수 가 없다.    모형에 대한 평가는 엔트로피 함수 기반으로 한다. 


이것의 기원은 볼츠만의 엔트로피로 부터 나온다. 

 

공식은 S = K log W 이다. 


  불츠만이라는 분은 살아서는 인정을 받지 못하였는데,  죽어서 인정을 받으셨던 분이다.  이것이 있어서  오늘날 통계학이나 인공지능이 많이 발전 했다.  

1. 불츠만의 앤트로피

딥러닝 하면서 필요한 것 및 수학 필수 이론

   딥러닝을 그냥 시작 하면 매우 어려울 수도 있다.  왜냐 하면,  선형대수학이나,  통계학에 대한 기초 이론이 있어야 어느 정도 가능 하다.   이번에 하는 시간은 매우 적지만,  기초에 대한 부분을 우선 적으로 다룰 예정이다.    


1. 딥러닝에 필요한 것들

야나두 딥러닝 R 과 Python의 비교

통계학과 출신인 필자는 R위주로 업무를 해오고, R에 대한 것만 다루었다. R과 Python의 차이점은 아래 그림과 같다.



R은 통계 패키지 이다. 개발 툴이 아니다. R을 CRAN 사이트에서 수없이 많은 Package를 받아 사용 할 수 있다. 전 세계의 개발자나, 통계 학자들이, 아주 어려운 것을 쉽게 풀어 패키지를 만든다. 따라서 R은 누가 만들어 놓은 것 가지고, 데이터 파라메터를 조정 하면서 사용 할 수 있다.

필자가 사용한 예는 고장 분석의 와이블 분포인데, 신뢰성 공학에서 가장 어려운 부분이다. 하지만 UCL의 Yves Deville 교수가 "Renext" 라는 패키지를 만들어 쉽게 사용 할 수 있게 만들었다.


Python은 조금 다르다. numpy가 있는데 그건 기본 패키지 이고, Pandas는 데이터 프레임을 다루는것이고, 사이킷럿인 있는데, 그것은 머신러닝을 다루는 툴이다. 딥러닝을 다루는 텐서 플로우나 케라스가 있으나, 전부다 개발하는 사람의 역량에 따라 코드가 바뀌어 진다.


R이나 Python 전부 전처리를 하는데R을 전처리하는 패키지를 돌리지만 Python은 직접 코드를 짜서 하는 경우가 많다.


R은 통계학의 기본 이론만 알면 되는데, 파이썬은 개발자의 개인기와 수학에 의해 많이 의존이 된다.하지만, 파이썬이 R보다 좋은 이유는 R은 데이터 분석에서 끝나지만, Python은 머신러닝/딥러닝과 같이 모델링을 한 후에 그 결과를 하드웨어 컨트롤 하는데 사용 할 수 있다. 산업 현장에서는 파이썬이 R 보다 더욱 중요 해 졌다.



R은 하드웨서 컨트롤을 할 수 없으니, 전사 ERP 시스템과 연동 하는 과제나, 아니면 IOT 플랫폼 내에서 고장에 대한 예측이나, 빅데이터를 다룰 수 있다. 일반적으로 R은 C++ 이나, JAVA를 입혀서 Pakcage 를 만든다. 그것 때문에 속도가 늦는 측면이 있는데, 사용하기는 편리 하다.


Python은 용접 심추적 장치와 같이 사진을 보고 하드웨어 컨트롤 하는데, 주로 사용한다. 4차 산업의 메카가 된것은 Python이 아닐까라는 생각이 든다. 4차 산업은 2차 산업의 확대 버전 이기 때문이다.

야나두 딥러닝 [ 많이 사용되어 지는 통계 및 인공지능]

   모형에 많이 사용 되어 지는 통계 및 인공지능은 아래와 같다.     선형 예측 보다는 Classifier 들이 더 많이 존재 한다.   실무에서는 Classifier가 거의 없다.   거의 대부분은 변화 하는 수가 아니라,   정의 되어 있는 수 (즉 Information 정보) 데이터 이다.   

  종속 변수에 영향을 주는 독립 변수가 대부분 1개 ~2개 정도 되기 때문에 Classifier를 사용하기가 어렵다.   변수들의 구성을 보았을때, 정보성 변수등 등급이 있는 경우가 있다.  회사내에서는 직급, 근속년수, 근무지역 별로 나누어 지는데,   어떤 것을 분석 하느냐에 따라서,  전부 달라 진다. 



위의  PPT 자료는 선형 회귀 빼고는 모두 Classifier를 사용한 모형이다.  하지만, Random forest 랜덤 포레스트는   Classifier 말고 회귀 분석을 하는 경우가 있다.  

 

    Linear Regression :  종속변수  y와 한 개 이상의 독립변수 X와의 선형상관관계 모델링 

    Logistic Regression  :  독립변수의 선형 결합을 이용하여 사건의 발생 가능성 예측

                                 종속변수가 범주형 데이터를 대상으로 하여 분류문제로 봄

   


    Decision Tree :  입력 변수를 바탕으로 목표변수의 값을 예측 하는 분류 모델

   K-Nearest Neighbor :  입력이 특징 공간 내 k개의 가장 가까운 훈련 데이터로 구성되어 있다. 


Support Vector Machine :  기계 학습의 분야 중 하나로 패턴 인식, 자료 분석을 위한 지도 학습 모델이며, 주로 분류와 회귀 분석을 위해 사용한다.

Random forest :  분류 , 회귀 분석 등에 사용되는 앙상블 학습 방법의 일종으로 훈련 과정에서 다수의 결정트리로 부터 분류 또는 평균 예측치를 출력 함으로 동작됨


  

  분석하는 데이터 성격에 따라 다르기는 하지만, 일반적으로 데이터를 돌리면 Random forest가 제일 잘 나온다.  하지만,  컴퓨터 연산도 많이 이루어 진다.    

 위 부분을 사용하기 위해서는 다수의 독립변수들이 존재 하여야 한다.  하지만,  실제 데이터들은 독립 변수들이 존재 하지 않는 경우가 대부분이다.   독립 변수가 존재 하는 대표적인 것은 부동산과,  사람의 신용정보 인데,  산업 현장에서 이런 데이터가 나오기는 매우 어렵다. 

하지만, 분류가 기계학습에서 머신러닝으로 발전 하게 된것은 바로,  이미지를 인식할 수 있는 딥러닝이 나오기 시작 하면서 였다.   즉 사진을 분류 할 수 있는데,  정확도가 높아 졌다는 것은 획기적인 것이다.   즉 산업 현장에서도 사용 할 수 있는 것이 많다는 것이다.   대표적인 산업군에서는 자동차 기술 등이다.    이번 강좌가 생겨난 것도 이 때문이다.    

  

Ubuntu에 CUDA /Tensorflow 2.4 GPU 사용

   아래와 같이 하면 안되는 경우가 매우 많다..  콘솔 환경 설정 이후에 하여야 한다. 
콘솔 환경이 설정되지 않았다면,  아래를 클릭 해서 설정 후 와야 한다.  


   컴퓨터 환경 마다 약간 환경이 다르지만, 앞에서 한 바와 같이 콘솔 환경을 만들어 놓고, 아래와 같이 하면 잘된다.   이것은 카이스트에서 클라우드를 세팅 하는 방법을 배포 한것인데,  RTX3080, RTX3090 모델을 아주 잘 붙는다.   CUDA 설치 살질을 날려버릴 수 있는 문서 이다.  

여기에서 아래와 같이  root 유저로 하는 것이 좋다. 
$ sudo su



3. Nvidia CUDA 설치 

Cuda 설치 하기 위한 Ubuntu 기본 세팅

 R 에도 TensorFlow가 돌아간다.  GPU설정만 잘하면 되는데,  항상 Path문제가 발생 하는데,  일단,  아직 그 적정한 Path를 찾지 못하고 있다.  하지만,  Python에서는 아래와 같이 TensorFlow가 잘 돌아 간다. 

     RTX3080 GPU를 구입 하고 나서, GPU설정 하려고,  구글링을 엄청 나게 하였지만, 성공하지 못하였다가  카이스트에서 인공지능 교육 받고 있을때,  RTX 관련된 문서를 받았다.   이것도 처음에는 잘 되지 않다가,  카이스트 문서를 Base로 해서 여러번 구글링 하다가   결국은 찾아 냈다. 

   지금 개인 서버 운영 하고 있는데,  지금은 R을 하고 있고,  딥러닝은 겨울철에 돌려야 난방효과도 좋으니,   계절에 따라서 바꾸어 하려고 한다.   정말 더운 여름철에 에어컨 까지 틀면서,  딥러닝 서버를 일반 가정집에서 돌리기에는 정말로 비용부담이 크다. 

여름을 나기 위해,  점검 중에 문제가 생겨서,  우분투 리눅스를 설치 하고 나서 아래와 같이 정리 하였다.   


1. 우분투 그래픽 및 ssh 설정 

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

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