기계 학습의 분류와 요소 by 바죠

기계학습(Machine learning)은 명시적 프로그램을 작성하지 않고, 주어진 데이터에 대한 패턴이나 규칙을 스스로 학습하는 전산 알고리듬을 말한다. 귀납 모델링을 지원한다. 통상, 컴퓨터 프로그램이 있다는 것은 새로운 입력에 새로운 결과를 얻을 수 있음을 의미한다. 적절한 이론을 구현한 알고리듬을 이용하여 입력에 대한 출력을 얻어내는 것이다.

기계학습은 다르다. 입력과 출력이 있을 때, 기계학습은 새로운 컴퓨터 프로그램을 만들어 내는 것이다. 물론, 이것을 위해서 계산이 필요하고 프로그램도 또한 필요하다. 따라서, 해당 문제에 대한 이론을 논하지 않는다. 다만, 기계학습에 대한 이론이 있을 뿐이다. 결국, 도출된 프로그램을 의미하는 모델은 입력과 출력을 대표하는 이론이 될 수 있다.

초음파 측정으로 60개의 숫자로 된 데이터를 얻었고 땅을 파 보니 바위가 나왔다.
또 다른 초음파 측정으로 60개의 숫자로 된 데이터를 얻었고 땅을 파 보니 광물이 나왔다.
이러한 측정과 실증 데이터가 쌓였다고 하자.
예를 들어, 208개가 쌓여있다고 하자. 
사실 이 데이터를 얻기 위해서 많은 돈을 들인것은 자명하다.
새로운 초음파 측정 데이터 60개를 얻어고 광물/바위가 있는 것을 추정해 낼 수 있을까?
이러한 예측은 어떠한 연역적 추론으로 얻어내는 것이 아니다. 
순전히 경험으로 추론해내어야 하는 문제이다.
사실 이문제는 물리학적/공학적 접근법으로 해결을 할 수 있는 종류의 문제가 아니다.
확률론적 접근급을 이용하는 것이 가장 바람직해 보인다.
계속해서 땅을 팔 수는 없다. 파야할지 파지 말아야 할지를 예측할 수 있으면 매우 유용할 것이다.
다시 말해서, 인공지능을 활용하면 초귀납적 추론을 행할 수 있다.
기존의 귀납적 접근법을 넘어서는 초귀납적 방법을 활용할 수 있다. 
즉, 딥러닝 기술을 활용할 수 있다. 딥러닝 기술은 2012년에 출현한다.

딥러닝을 알아보기 전에 기계학습을 먼저 알아 보아야 한다. 기계가 데이터를 보고 데이터를 해석할 수 있는 능력을 키우는 것을 기계학습이라고 한다. 데이터속에 숨어 있는 인과관계를 추정해내는 것이다. 쉽게 말하면 스무고개를 여러 번 수행해서 가장 그럴듯한 인과관계를 찾아내는 것이다.

기존의 컴퓨터 계산은 특정한 방정식, 수학공식을 컴퓨터가 계산하는 것이였다. 하지만, 기계학습은 완전히 다르다. 특별한 수학공식, 방정식을 사용하지 않는다. 나타난 현상을 기술하는 데이터에만 집중한다. 데이터에서 상관관계를 찾아내는 것이다. 새로운 컴퓨팅 기술이다. 하지만, 50년 이상의 역사에서 이러한 컴퓨팅 기술이 주목받지 못했다. 
학습만 잘 할 뿐 실제 새로운 데이터에 대한 예측능력이 터무니 없이 낮았기 때문이다. 
그런데, 2012년 부터 새로운 데이터에 대한 예측능력이 향상되었다. 사실은 학습능력이 향상된 것이다.
일반적인 학습능력이 생겨난 것이다. 딥러닝의 시대가 열리게 된것이다. 기존의 기계학습 체계를 전혀 손상시키지 않고 그냥 학습능력이 향상된 것이다.

결국, 학습은 해당 문제를 표현방식, 평가방식, 그리고 최적화방식으로 나누어서 진행된다. 여기에서 표현방식은 문제를 정의하는 것이다. 평가방식은 모델이 얼마나 잘 문제를 이해하는가를 측정하는 것이다. 평가방식에서 좋은 점수를 얻으려면, 즉, 모델이 유용하고 일반적이라고 평가받으려면, 매개변수들을 잘 최적화시켜야한다.




--------------------------------------------------------------------------

AI (인공지능) : 좀더 포괄적인 의미로 활용됨. 예를 들어, 인공지능 도구들에는 최적화, 분류, 인공신경망이 있다. 
 
ML (기계학습) : scikit-learn 라이버리 (파이썬)

DL (딥러닝) : tensorflow, keras

--------------------------------------------------------------------------

Deep Learning (2012년 이후의 기계학습)
Rectified linear unit (activation function) [2011]
Dropout [2012]
Gaussian type weights initialization [2015]
Regularization of weights
Convolutional neural network [2012]
--------------------------------------------------------------------------

딥러닝은 새로운 형식의 컴퓨팅이다. 과거에 수학적 공식들을 활용한 컴퓨팅이 대세였다. 지금은 딥러닝을 활용한 계산이 새로운 계산의 한 형태로 발전한 것이다. 

데이터를 잘 분리해 낼 수 있는 새로운 변환을 찾는 것이 딥러닝이다 이게 수학적으로는 많은 은닉층을 활용하면 간단하게 처리 될 수 있는 것이다. 현실적으로 그러한 표현을 찾지 못했다. 사실, 가중치를 찾아내지 못했던 것이다. 하지만, 2012년 이후 이러한 가중치를 찾을 수 있게 되었다. 매우 많은 은닉층이 있어도 찾을 수 있게 된 것이다. 기존에 하지 못했던 학습을 할 수 있게 된 것이다. 당연히 컴퓨터의 발전도 한 몫했다. 예를 들어, 빨라진 CPU 연산 속도를 들 수 있다. 나아가, GPU를 이용한 계산은 병렬처리를 의미하는 것이다. 계산의 정밀도보다는 대량의 계산을 병렬적으로 할 수 있는 것이 주효했다. 학습할 때 병렬적으로 학습이 가능하다. 매우 많은 데이터에 대해서 병렬적으로 학습을 하여 가중치를 결정한다는 것이다.

상하, 좌우, 원점으로부터의 거리로도 구별이 되지 않는다.

데이터를 활용한 새로운 컴퓨터 프로그램 작성. 이것이 기계학습의 접근법이다. 귀납법이 고도로 발달한 형국으로 볼 수 있다. 새로운 형식의 컴퓨터 계산이 가능하다. 딥러닝 방법이 무조건적으로 뛰어난 성능을 발휘하는 것은 아니다. 전통적인 통계학의 방법이 좋은 성능을 발휘한다. 예를 들어, gradient boosting 방법은 소위 테이블 데이터에서 최고의 분류, 회귀 결과를 준다. 딥러닝보다 더 좋은모델 성능을 기대할 수 있다.






모형의 표현방식에 따라서 다음과 같이 분류된다. 모형의 표현 방식은 매우 중요한 항목이다. 
의사 결정트리, 인공신경망, 유전 프로그래밍, 베이즈 분류기, 서포트벡터머신, 랜덤 포레스트, bagging, boosting 

학습 방식과 모형의 속성에 따라서 다음과 같이 분류된다.

기계학습의 분류
** 지도학습(supervised learning)
** 비지도학습(unsupervised learning)
** 강화학습(reinforcement learning) http://incredible.egloos.com/7392473
** 진화학습(evolutionary learning) https://en.wikipedia.org/wiki/Evolutionary_algorithm

기계학습의 요소
** 모형의 표현
** 모형의 평가

\[ \vec{x}   \rightarrow  y(\vec{x})\]
통상 머신러닝는 세가지 양식으로 분류한다. 비지도 학습(unsupervised learning), 지도 학습(supervised learning), 강화 학습(reinforcement learning). 
http://incredible.egloos.com/7392473#15206356.01
http://incredible.egloos.com/7167212

대표적인 경우가 지도 학습이다. 잘 알려진 입력-출력 상관관계를 찾는 것이다. 상관관계는 하나의 모델로 표현할 수 있다고 가정한다. 물론, 이것이 가능한지가 증명된 것은 아니다. 새로운 입력이 왔을 때, 출력을 예측하는 기계를 만드는 것이 문제풀이의 목표이다.   모든 모델들이 갖지 않을 것이다.  물론, 더 좋은 모델이 있을 수 있다.

지도 학습의 경우, 머신러닝 과정의 요약:

0.
학습용 데이터 확보 {xi, yi
training set, valdation set, test set 데이터 셋들로 구분한다. 이들 데이터는 읽어들일 때, 그 순서를  무작위로 바꿈으로서 쉽게 분류하여 보관할 수 있다. 따라서, 프로그램은 항상 training set, validation set 순서로 데이터를 보관하면 된다.
feature vector를 새로 정의할 수 있다. 그대로 사용할 수도 있다. 하지만, 일반으로 특정한 처리를 해야한다. 매우 중요한 항목이다.

1.
학습 프로그램과 예측 프로그램으로 각각 불리우는 두 가지 프로그램들을 만드는 것이다.
이들 둘 사이에는 하나의 데이터가 필요할 것이다. 매개변수를 저장하고 있는 파일이다. 학습이 끝났을 때 얻게되는 것이다.  
학습 프로그램을 활용한 학습이 완료되면 인공신경망 매개변수들을 파일에 저장해 두어야 한다. 저장된 인공신경망 매개변수들은 예측 프로그램이 활용할 것이다.  
예를 들면, 아래와 같이 이름을 지을 수 있다.
trainingpot.x       [병렬, unformatted 양식을 활용한 feature vector 적고 읽기 사용]
predictionpot.x   [성공적으로 만들었을 경우, 응용 프로그램으로서 활용을 기대한다.]
지도학습(supervised learning)의 경우, 대량의 데이터가 필요하다. 데이터가 많을수록 좋다. 따라서 학습 컴퓨터 프로그램도 대량의 데이터를 취급할 수 있는 방식으로 작성되어야만 한다. unformatted 양식이 좋은 예이다. 많은 데이터들에 대한 feature들을 unformatted 양식으로 적어준다. 물론, 간단한 경우에는 컴퓨터 메모리상에서 모든일들을 처리할 수 있다. 많은 응용 문제의 경우 상황이 조금 다르다. 메모리가 부족할 정도로 많은 데이터가 필요하다. feature 들을 모두다 메모리로 들고 있을 수 없을 정도의 많은 데이터가 필요하다. 물론 병렬 컴퓨팅이 필요하다. 반면, 예측 프로그램은 상황이 완전히 다르다. 하나의 입력에 대해서 하나의 출력을 주면 되는 것이다. 가능하면 간단하게 만들어 둘 필요가 있다.  지도학습을 실행할 경우, 데이터를 training data, test data로 나누어야 한다. training data로 나누어서 학습을 진행시킨다. 이 때, test data에 대해서 예측 능력을 알아보아야 한다. 결국, overfitting 되는 지점을 찾아내야 한다.
https://en.wikipedia.org/wiki/Training,_test,_and_validation_sets
https://en.wikipedia.org/wiki/Cross-validation_(statistics)
training set, validation set 두 가지를 이용하여 overfitting 되지 않게 한다. 결국, validation set은 이 상황을 위해서 존재하는 것이다.
다시 말해서, overfitting 시작점을 직접 확인해야만 한다.
최종적인 모델의 성능은 test set을 통한 계산 결과로 발표한다.

training set 크기에 따라서 RMSE를 그려본다. 일반으로 training set 크기가 클수록 RMSE가 작아질 수 있다.
R square provides goodness of fit the model. Higher the value of R square model will be good.
Root Mean Square Error (RMSE)
Mean Absolute Error (MAE)
Mean Absolute Percentage Error (MAPE)
https://en.wikipedia.org/wiki/Mean_absolute_error
https://en.wikipedia.org/wiki/Root-mean-square_deviation

간단한 문제의 경우, 개발되어 있는 환경을 사용한다. 파이썬, R, C,  C++, 포트란, 텐서플로우 등 여러 가지 컴퓨터 언어들을 활용한 방법들이 사용자들을 기다리고 있다.
보다 더 전문적인 응용의 경우, 처음부터 개발하는 것이 정석이다. 시간이 많이 걸리지만 어쩔수 없다. 

2.
지도 학습의 경우, overfiting 문제 해결을 위해서는 어쩔수 없이 MAE 또는 RMSE versus training step 의 그림이 반드시 필요하다.
https://en.wikipedia.org/wiki/Mean_absolute_error
https://en.wikipedia.org/wiki/Root-mean-square_deviation
https://en.wikipedia.org/wiki/Mean_squared_error

3.
observation vs predicted 그림을 그려서 모델의 정밀도를 논의한다.
Observations, Predictions, and Residuals
그림 출처: 구글 이미지
-------------------------------------------------------------------------------------------------------------------
Gaussian radial basis function neural network

내적대신에 거리를 이용한다.
그림 출처: 구글 이미지
-------------------------------------------------------------------------------------------------------------------
net4 보다는 net5가 더 좋은 모델이다.

overfitting 의 확인 과정.

그림 출처: 구글 이미지

-------------------------------------------------------------------------------------------------------------------






그림 출처: 구글 이미지
-------------------------------------------------------------------------------------------------------------------


그림 출처: 구글 이미지
-------------------------------------------------------------------------------------------------------------------
epoch :  중요한 사건, 변화가 일어난 시대

엄청난 데이터, 예제들을 이용하는 경우가 대부분이다. 실제 계산에서도 이러한 부분들을 잘 이해해야한다.

batch gradient descent        : 목적함수 0.5 sum_i (y'_i-y_i)^2 를 이용하여 gradient를 계산하는 방법, 모든 예제들을 이용함.
mini-batch learning             : 모든 예제들을 다 활용하지 않고 일부만 활용하는 방법, 예를 들어 무작위 추출을 통하여.
stochastic gradient descent  : 예제 하나마다 매개변수 갱신하는 방법
hyperparameters                 : 뉴런의 수, 배치 크기, 학습률 등, 즉, 학습하기 이전에 설정된 매개변수들을 지칭한다.
https://en.wikipedia.org/wiki/Hyperparameter_(machine_learning)


------------------------------------------------------------------------------------------------------------
물리학과 첨단기술, 기계학습 특집:
http://webzine.kps.or.kr/contents/data/webzine/webzine/15204897481.pdf
http://webzine.kps.or.kr/contents/data/webzine/webzine/15193635731.pdf
http://webzine.kps.or.kr/contents/data/webzine/webzine/15193636141.pdf
http://webzine.kps.or.kr/contents/data/webzine/webzine/15211841431.pdf
http://webzine.kps.or.kr/contents/data/webzine/webzine/15211841581.pdf
http://webzine.kps.or.kr/contents/data/webzine/webzine/15211841831.pdf
알파고 쇼크:

Convolutional Neural Network (CNN) : 이동 불변 데이터 특성을 추출할 수 있다는 특징이 있다. 결정해야할 파라메터 수가 줄어드는 효과가 부수적으로 존재한다. 
Fully connected Neural Network : 기본적인 신경망이다. deep하게 만들어버리면 굉장히 많은 파라메터를 결정해야만 한다.

두 가지가 많이 활용된다.

특히, CNN은 굉장히 인풋의 사이즈가 클 때, 즉, 이미지 데이터가 인풋일 때 활용한다.
convolution의 의미를 잘 이해해야 한다.

* Square (box) function: uniform averaging 
* Gaussian: center-weighted averaging



ANN 응용에서 weight들을 초기화하여 사용한다.
weight들의 초기화는 통상 가우시안 분포를 사용한다. 평균값이 0이고 표준편차가 sqrt(2/n) 정도 되는 분포를 활용한다.
여기서 n 은 앞 쪽 층에 포함된 뉴우런의 갯수이다.

      call random_number(tmp) ; call random_number(tmq)
       weight2(k,j,i)=sqrt(-2.d0*log(tmp))*cos(2.d0*3.141592653589793d0*tmq)  *sqrt(2.d0/dble(ns))




vanishing-gradient, exploding-gradient 문제들을 해결하는 방법:



10가지 문제:




import numpy as np

def datafrom8():
   imode=-1
   with open("fort.7", 'r') as afile:
        for line in afile:
            if(len(line.split()) == 1 and line.split() == '&' ):
                continue
            if(len(line.split()) == 1 and line.split() == '#' ):
                continue
            if(len(line.split()) == 5 and line.split()[0] == '#' and line.split()[2] == 'training'):
                ntrain=int(line.split()[4])
                xtr=np.zeros(ntrain)
                ytr=np.zeros(ntrain)
                imode=0
                kount1=0
            if(len(line.split()) == 5 and line.split()[0] == '#' and line.split()[2] == 'validation'):
                nvalid=int(line.split()[4])
                xva=np.zeros(nvalid)
                yva=np.zeros(nvalid)
                imode=1
                kount2=0
            if(imode == 0 and  len(line.split()) == 2):
                xtr[kount1]=float(line.split()[0])
                ytr[kount1]=float(line.split()[1])
                kount1=kount1+1
            if(imode == 1 and  len(line.split()) == 2):
                xva[kount2]=float(line.split()[0])
                yva[kount2]=float(line.split()[1])
                kount2=kount2+1
   return ntrain,nvalid,xtr,ytr,xva,yva

ntrain,nvalid,xtr,ytr,xva,yva= datafrom8()
print ntrain,nvalid
tp=0
tn=0
p=0
n=0
fn=0
fp=0
for i in range(ntrain):
    if(xtr[i] == 1):  
        p=p+1
    if(xtr[i] == 2):  
        n=n+1
    if(xtr[i] == ytr[i] and xtr[i] == 1):
        tp=tp+1
    if(xtr[i] == ytr[i] and xtr[i] == 2):
        tn=tn+1
    if(xtr[i] != ytr[i] and xtr[i] == 1):
        fn=fn+1
    if(xtr[i] != ytr[i] and xtr[i] == 2):
        fp=fp+1
print 'ACC',float(tn+tp)/float(p+n),float(tn+tp)/float(tp+tn+fp+fn)
print 'F1',float(2*tp)/float(2*tp+fp+fn)
print 'sensitivity', float(tp)/float(p)
print 'precision', float(tp)/float(tp+fp)
print float(tp)/float(p)+float(tn)/float(n)-1
tp=0
tn=0
p=0
n=0
fn=0
fp=0
for i in range(nvalid):
    if(xva[i] == 1):  
        p=p+1
    if(xva[i] == 2):  
        n=n+1
    if(xva[i] == yva[i] and xva[i] == 1):
        tp=tp+1
    if(xva[i] == yva[i] and xva[i] == 2):
        tn=tn+1
    if(xva[i] != yva[i] and xva[i] == 1):
        fn=fn+1
    if(xva[i] != yva[i] and xva[i] == 2):
        fp=fp+1

print 'ACC', float(tn+tp)/float(p+n),float(tn+tp)/float(tp+tn+fp+fn)
print 'F1',float(2*tp)/float(2*tp+fp+fn)
print 'sensitivity', float(tp)/float(p)
print 'precision', float(tp)/float(tp+fp)
#print float(tp)/float(p)+float(tn)/float(n)-1
print 'recall', float(tp)/float(tp+fn)
print 'BM', float(tp)/float(p)+float(tn)/float(n)-1.
print 'MCC',(float(tp)*float(tn)-float(fp)*float(fn))/np.sqrt((tp+fp)*(tp+fn)*(tn+fp)*(tn+fn))





vanishing gradient problem을 해결하기 위해 기존에 사용하던 sigmoid 함수 대신에 ReLU(Rectified Linear Unit)라는 함수가 새롭게 고안되었으며, dropout layer를 사용하여 학습 중일 때 무작위로 뉴런을 비활성화 함으로써 학습이 학습 데이터에 치우치는 overfitting 문제를 해결하였습니다.
딥러닝의 출현:
두 번의 암흑기를 지나서 나타난 딥러닝, 이것은 그냥 기존의 인공신경망인데, 다만 여러 개의 은닉층을 사용한 것이다. 
여러 개의 은닉층을 사용해도 되는 이유, 그렇게 하고도 안정적인 훈련이 가능하게 된 것이다. 
이것이 딥러닝의 핵심이다. 
사람들이 오랬동안 염원해왔던 것이 바로 다층의 은닉층을 가지고 있는 인공신경망의 안정적인 훈련이다.
사람들이 이것을 알게되었다. 
아울러, 훈련된 인공신경망의 신뢰도가 확보된 것이다.
다양한 방법으로 인공신경망을 활용할 수 있게된 것이다. 


딥러닝 방법은 연속적으로 변화하는 데이터에 대해서 아주 강력한 솔루션이 될 수 있다.
하지만, 소위 테이블 데이테에 대한 회귀, 분류는 여전히 트리 기반 알고리듬들이 좋은 성능을 발휘한다.
LightGBM, XGBoost 알고리듬들이 매우 좋은 분류, 회귀 성능을 자랑한다. 특히, LightGBM 방법은 매우 뛰어난 실행 성능과 정밀도를 제공한다.

2012년이 딥러닝의 원년이다.
2011년 Relu 함수의 출현 : vanishing gradient problem 해결, 표현력이 높은 딥러닝이 시작됨.
2012년 Dropout 방법의 출현 : overfitting problem 해결, 정규화된 훈련이 가능함.
2012년 CNN 출현 : 방대한 이미지 데이터 처리 문제 해결, 비대칭 데이터에 대한 처리가 가능함.
2013년 VAE 출현: 생성 모델로서 다양한 가능성을 제안함.
2015년 TensorFlow 구현의 출현과 보급 : 실질적인 딥러닝의 민주화가 단행됨.
2016년 알파고 출현 : 바둑 정복
2017년 알파고 제로 출현 : tabula rasa, first-principles 방법을 이용하여 바둑 정복, 진정한 바둑의 정복이 가능함. 기보없이 바둑 정복함. 프로기사에게 절대로 지지 않는 사실상 바둑의 신이 탄생함.
2018년 알파폴드
2020년 알파폴드 2


 다이오드를 생각하시요!
 

핑백

덧글

  • 2018/03/19 17:09 # 답글 비공개

    비공개 덧글입니다.
  • 바죠 2018/09/04 09:11 # 답글

    https://ieeexplore.ieee.org/document/7813761/?part=1

댓글 입력 영역

최근 포토로그



MathJax