김승일

모두의연구소 연구소장

모두의연구소 딥러닝연구실 DeepLAB 랩짱



모두의연구소 페이지와 모두의연구소 커뮤니티에 오시면 더 많은 정보를 만나보실 수 있습니다.

모두의연구소 페이스북 페이지 : https://www.facebook.com/lab4all

모두의연구소 커뮤니티 그룹 : https://www.facebook.com/groups/modulabs


----------


2014년 7월 24일(목)-25일(금) 양일간 Machine Learning and AI on Big Data Analysis 워크샾에 다녀왔습니다.

이전부터 한번 공부해보고 싶었던 분야가 머신 러닝 (machine learning)이었는데요, 이번 기회에 machine learning에 대해 정리해볼까 합니다. 사실 제가 machine learning 알고리즘을 잘 모르므로, 기초정도만 다룰 수 있겠네요. 일단 기초 정리가 끝나면 최근 주목받고 있는 deep learning 이나 graph분석도 살짝 다뤄보고 싶긴 합니다만, 그날이 올지 -_-;;

 

1. Introduction

다음 동영상을 먼저 보시죠.


 

SK planet의 FaceID Concept 동영상입니다. Face Recognition을 통해 고객을 파악하고 각 고객별로 reward point 를 적립하거나, coupon을 발행해주죠. 이 과정은 모두 Machine이 알아서 척척 해줍니다. Machine이 고객의 얼굴을 배워(Learning)나가기 때문에 가능한 것이지요. 동영상에서는 친절하게도 Face Recognition이 어떻게 구현되는지 설명도 해주고 있네요. ^^

 

data acquisition

먼저 카메라로 고객을 찍고, 그 중에서 얼굴 부분만 잘라낸 image data를 확보하죠.

그림 1. Image Capturing

그림 2. Face Detection

 

feature extraction

Machine은 확보된 얼굴 영상을 그대로 인식하지는 않습니다. 보다 인식하기 쉽도록 feature를 추출합니다.

 

그림 3. Feature Extraction

 

Classifier

그리고 해당 feature를 기존에 저장되어 있던 data와 비교하여 가장 유사도가 높은 ID를 찾아냅니다. 여기서 기존에 저장되어 있던 data란 이러이러한 feature가 들어오면 이러이러한 ID일 확률이 높아요… 에 대한 정보를 의미합니다. 이렇게 data를 실제 test 전에 저장하는 것을 training 한다고 하죠. 즉, training 된 classifier에 feature를 입력해 넣으면 어떤 ID에 해당하는 지 알려줍니다. 이것이 test 단계입니다.

 

그림 4. Classifier

 

이를 종합해 보면 Machine Learning은 '미리 준비된 data를 이용하여 classifier를 training(learning)시키는 Training 단계'와, 'train된 classifier를 이용하여 입력된 data가 어떤 분류결과인지 확인하는 Test 단계'로 나뉘게 됩니다.

 

그림 5. machine learning의 개념도

 

2. Feature Extraction

machine learning을 위해 어떤 feature를 사용해야 좋을까요? 이 문제는 어떤 목적을 위해 machine learning을 사용하는 것인지에 따라 달라질 것입니다. 가령, 곧 급등할 주식을 찾고 싶다!!! 라고 한다면, 위 그림 5는 어떻게 표현될까요?

일단, Raw Data = '매일매일의 주식 종목별 주가' 가 될 것입니다. 그런데 이 Raw Data를 주식 종목이 처음 상장된 날부터 오늘까지의 값이라면, 그것은 너무도 방대한 양의 data일 것입니다. 이것을 classifier의 입력으로 사용했다가는 엄청난 계산량에 training도 못하고 GG를 선언하겠지요. 따라서, 그거보다는 더 압축(?)된 형태의 Feature를 Classfier의 입력으로 사용해야 할 것입니다. 가령 다음과 같은 것들이 Feature의 예가 될 수 있겠지요.

Feature = 5일/20일/60일 이동평균 값, MACD, 기업 정보(PER, PBR, ROE …), 전저점/전고점 값, candle, 거래량 등등 이외에도 수십~수백가지 이상의 지표들이 있겠지요.

그 중 어떤 feature를 사용하면, 남들보다 조금은 더 높은 확률로 급등주를 찾을 수 있을까요? 알면 모두가 이미 워렌 버핏이 되어 있겠죠? 어려운 문제입니다. 즉, 어떤 feature를 선택하고 extract할지를 결정하는 것은 매우 어려운 문제가 됩니다. 다행히도 얼굴 인식, 음성 인식 등 특정 분야에서는 어떤 feature가 효과적인지 많은 분들이 이미 연구해 놓았기 때문에 대부분의 엔지니어들은 가져다 쓰기만 해도 되겠지요.. 인식 분야에 계신 분들 어떤 feature가 최고다!! 알려주시면 블로그 내용 업데이트 할께요!!

 

3. Classifier

Classifier는 machine learning 알고리즘의 핵심이겠죠. Neural Network, Support Vector Machine, AdaBoost, Random Forest 등 많은 알고리즘들이 있습니다. 이에 대한 소개는 다음 장에서 하기로 하고….

일반적으로 Classfier를 training하는데에는 많은 양의 data가 필요하게 됩니다. 하지만 data를 수집하는 것 자체가 굉장히 비용이 많이 듭니다. Facebook 정도 되면 tagging을 이용하여 많은 양의 얼굴 데이터를 확보하는 데 어려움이 없겠지만, 대부분의 연구소들은 그렇게 방대한 양의 얼굴데이터를 수집하기 어렵겠죠. 그래서 한정된 양의 database로 training 시키기 위해 Cross Validation 기법이나 Bootstrap 기법 등이 사용된다고 합니다.

Cross Validation 은 database중 일부를 이용해서 training set 으로 정하되, 그 일부를 바꿔가면서 training and test 하는 방법입니다. 다음 그림 6에 잘 나타나 있네요. 

Bootstrap은 training set을 선택하는데 있어서, 정해진 값를 선택하는 것이 아니라, 해당 값의 확률분포를 modeling하고, 그 model에서 원하는 만큼의 data를 뽑아서 사용하는 것입니다. 가령 1,2,3,3,4 라는 데이터가 있으면, 1,2,4는 나올 확률이 0.2 이지만, 3은 0.4가 되죠. 이 확률값을 바탕으로 data를 resampling하여 데이터를 재구성합니다.

그림 6. Cross Validation
(그림 출처 : http://genome.tugraz.at/proclassify/help/pages/XV.html )

 

4. Neural Networks

4.1. Perceptron

Structure

Neural Network는 기본적으로 다음 그림 7과 같은 구조를 지니고 있습니다. 입력이 들어오면 적절한 weight가 곱해지고 더해집니다. 그리고 activation function이 취해진 후 그 결과값을 출력합니다. 이와 같이 input layer와 output layer 로 이루어진 neural network 구조를 perceptron이라고 합니다. 기본적으로 신호처리에서 말하는 FIR filter와 같은 형태인데, filter output에 activation function이 존재합니다. 이것은 neuron 을 흉내내면서 생긴 것인데요.. 일정 역치 이상의 전류가 neuron에 입력되지 않으면 출력이 나가지 않고, 역치(threshold) 이상이 입력되면 출력이 나갑니다. 출력은 -1과 1로 정해져 있으므로, 기본적인 activation function은 step function이 됩니다.

 

그림 7. 일반적인 Neural Network 구조.

 

linear Classifier : OR Classification

결국, 그림 7의 perceptron은 filter output이 0보다 크면 1, 0보다 작으면 -1이 되겠지요. 이것을 수식으로 쓰면 다음 식 과 같은 linear classifier 가 됩니다.

 

다음의 OR classification 문제를 한번 살펴볼까요?


input이 (0,0) 이면 à output 이 -1

input이 (0.1), (1,0), (1,1)이면 à output 이 1

이 나오는 Neural Network Classifier는?

 
OR classification은 그림 8과 같은 Neural Network로 풀 수 있습니다. (x1,x2)에 (0,0), (0,1), (1,0), (1,1)을 대입해보면, 위 문제를 만족시키는 것을 알 수 있습니다.

그림 8. OR classifier

본 예제는 Neural Network가 linear classifier라는 것을 잘 보여줍니다. weight가 각각 -0.5, 1, 1인 neural network는 다음 그림 9에서처럼 직선으로 표현되는 detection threshold 를 지니게 됩니다. 즉, 직선보다 위에 있으면 1, 직선보다 밑에 있으면 -1이 되는 것이지요.

그림 9. Linear Classifier : OR Classfication

 

Limitation : XOR Classfication

XOR classification 문제는 위의 OR 문제보다는 훨씬 복잡합니다. (0,0), (1,1)일때는 1, (0,1), (1,0)일때는 -1을 출력해야 합니다. 이것은 다음 그림 10과 같이 두개의 직선이 있어야 문제를 풀수 있으며, 다시 말해 perceptron으로는 절대 풀 수 없다는 의미를 지닙니다. perceptron은 하나의 직선으로 표현되는 판별식만을 가질 수 있기 때문입니다. 이에 Multi-Layer Perceptron 이라는 새로운 Neural Network가 제안됩니다.

그림 10. Linear Classifier : XOR classfication

 

4.2. Multi-Layer Perceptron

Input layer와 output layer만을 가지는 Perceptron으로는 XOR 이라는 간단한 문제도 풀 수 없습니다. 따라서 Hidden Layer를 두어 보다 복잡한 문제를 풀 수 있도록 한 것이 Multi-Layer Perceptron입니다. 이와 같이 Hidden Layer를 두면, 선형 판별식을 추가로 둘수 있으므로 XOR문제도 충분히 풀어낼 수 있습니다.

그림 11. Multi-layer Perceptron

Multi-Layer Perceptron의 문제는 어떻게 수많은 Neural Network의 weight 값을 update(training, learning)할 수 있느냐입니다. 가장 유명한 방법이 Error Back-Propagation 알고리즘입니다. Error Back-Propagation 은 전형적인 Gradient Descent 알고리즘입니다. (Gradient Descent 알고리즘은 이전에 정리해 놓은 글이 있으므로, 링크를 참고하시기 바랍니다.) 

참고 링크 : Gradient Descent Algorithm - whyDSP

cost function은 다른 여러 알고리즘과 마찬가지로 mean squared error가 됩니다. 일반적인 adaptive filter와 다른 점이 있다면, Nerual Network는 output signal을 얻기 위해 step function이라는 activation function이 들어간다는 점입니다. step function은 불연속 함수이므로, 미분이 되지 않습니다. 따라서 Gradient Descent 알고리즘을 적용하는 데 문제가 발생합니다. 이에 Error Back-Propagation 에서는 step function 대신 다음과 같은 sigmoid 함수를 사용합니다.

Sigmoid 함수는 다음 그림 12와 같이 표현됩니다. 그림에서 보이듯이 전구간에서 미분가능하고, step function가 비슷한 형태를 지니고 있음을 알 수 있습니다.

그림 12. Sigmoid 함수

(그림 출처 : http://www.codeproject.com/Articles/16419/AI-Neural-Network-for-beginners-Part-of )

 

3. Support Vector Machine

3.1. Neural Network vs Support Vector Machine(SVM)

Machine Learning 알고리즘은 training set 데이터를 어떻게 나눌 것인지 rule을 결정합니다. 그리고, 그 rule을 일반화하여 다른 test set 데이터들에도 적용을 시키게 되는데, 다른 test set에도 그 rule이 잘 적용되면 일반화가 잘되어 있다고 부를 수 있습니다. 이러한 일반화의 관점에서 볼 때 Neural Network는 optimum한 solution을 제공하지 못합니다. 다음 그림 13과 같이 training set이 공간상에 분포한다고 가정해 보았을 때, A 점선과 B 직선 중 어느 직선(hyperplane)이 더 좋은 판별식이 될까요? 당연히 B 직선일 것입니다. A와 B모두 training set은 완벽히 분리해낼 수 있지만, 추후 test data를 판별하고자 할 때A는 B에 비해 많은 오류를 야기할 가능성이 높겠지요. Neural Network는 이런 A에서 update(learning)를 멈춰버립니다. 이미 Mean Squared Error를 최소화 해버렸기 때문에 더 이상 학습할 필요가 없기 때문이죠. 하지만 이것이 B직선과 같이 margin을 극대화 함을 의미하지는 않습니다.

그리고, 그림 13에서 B 직선에 가장 가까운 두 data(빨간 테두리로 표시된 data)를 support vector라고 합니다.

 

그림 13. Generalization of the Classifier

 

3.2. SVM

SVM은 margin을 극대화하는 결정면 d(X)을 구하는 것을 목표로 합니다. 그림 13의 예에서 B직선이 d(X)가 되겠지요. d(X)를 다시 표현해보면 다음 식과 같습니다.

이 때 평면상의 임의의 점 Xany 에서 hyperplane d(X)까지의 거리는 (고등학교 수학시간에 배웠던 공식을 써보면.. 사실 오래되어 기억 잘 안납니다 -_-;;; )

가 됩니다. 그림 13에서 support vector 중 세모 data를 xsv,1이라고 하고, 네모 data를 xsv,2라고 가정해봅시다. 그러면,

가 되겠지요.

계산상의 편의를 위해

라고 가정해 봅시다. [1]

그러면 각 support vector 점들로부터 가장 멀리 떨어진 직선(hyperplane)까지의 거리는

와 같이 표현될 수 있습니다.

결국 SVM 에 의한 최적화된 판별식(hyperplane)은 support vector점들로부터 가장 멀리 떨어진 직선을 찾는 문제가 되며, 결국 다음과 같이 수식으로 표현할 수 있습니다.

뭐 눈으로만 구경해도 복잡합니다. ^^;;; 결국 Wolfe Dual / Lagrange Multiplier 등등을 이용해서 solution w를 구해내는데, 그 과정은 블로그에서 다룰 내용은 아닌 듯 하구요… ^^

여하튼 이렇게 해서 SVM에 의한 판별식(hyperplane)이 결정되게 됩니다.

 

3.3. Nonlinear(Kernel) SVM

위에서 적은 SVM 역시 Perceptron과 마찬가지로 XOR문제는 풀 수 없습니다. SVM 역시 linear한 하나의 hyperplane으로 data set을 구분하기 때문입니다. Neural Network에서는 hidden layer를 추가하여 해당 문제를 해결하였지만, SVM에서는 차원을 늘리는 방법으로 XOR 문제를 풀 수 있습니다. 다음 그림을 보면 쉽게 이해가 가실 것입니다. 원래의 2차원 공간에서의 XOR문제가 그림 14-(a)입니다. 이것을 다음의 매핑 함수 Φ(x)를 통해 3차원으로 확장시키면 그림 14-(b)가 됩니다. 물론 이때는 직선이 아닌 평면으로 각 데이터를 구분해낼 수 있게 됩니다.

그림 14. Mapping the data into High-Dimensional Space

하지만, 이렇게 공간상의 매핑을 하지 않고도 비슷한 효과를 낼 수 있는 방법이 있는데 그것이 kernel trick을 적용하는 것입니다. 3.2절에서 SVM은 support vector와의 거리를 최대화 하는 hyperplane을 찾는 방법이라고 설명하였습니다. 하지만 단순히 거리를 사용하는 것이 아닌, 거리에 kernel 함수를 통과시켜 사용하면 그림 14와 같은 효과를 얻을 수 있습니다.

kernel 함수의 예는 다음과 같습니다.

(출처 : Wikipedia http://en.wikipedia.org/wiki/Support_vector_machine )

대충 보시면 알겠지만 단순히 거리 (벡터 내적)을 이용한 것이 아닌 그것을 약간 변형/수정한 것임을 알 수 있습니다. 다음 그림 15 는 kernel 함수가 어떤 역할을 하는지 보여줍니다.

그림 15. kernel trick.

(출처 : Wikipedia http://en.wikipedia.org/wiki/Support_vector_machine )

 

4. AdaBoost

 

어느덧 마지막 절이 되었네요. 사실 Adaboost와 Random Forest의 경우 시간상의 문제로 워크샵에서 심도있게 다루질 못하였습니다. 당연히 저의 이해도도 급락했겠지요 ^^;; 따라서 블로그에서도 자세히 다루기는 힘들겠지만 그래도 나름대로 이해한 것들이라도 옮기도록 하겠습니다.

Adaboost 는 Ensemble-based Classifier 입니다. 기존에는 아주 strong한 classifier를 설계하고자 했습니다. Neural Network나 SVM은 strong한 classifier이며, 그래서 그 결과는 곧 진리라고 받아들이게 되는 것이지요. 근데 그래도 오류가 생기는 겁니다. 어찌보면 왕의 말이 곧 법인 군주전제정치에 가깝다고 할 수 있죠. 근데 Ensemble-based Classifier는 민주주의에 가깝습니다. weak한 간단한 classifier를 많이 만들어두고, 각 classifier에게 물어보는 겁니다. 이런 입력이 들어왔는데, 이것은 원래 뭐였을까? 그러면 각 classifier는 자기가 생각하는 결과에 투표합니다. 가장 많은 득표를 한 값을 결과로 출력하는 것이지요. 또한 주목해야 할 점은 현대 민주주의와는 달리 각 weak classifier들마다의 신뢰도(추정 능력치)가 다르므로, 신뢰도에 따라 투표 수를 달리합니다. 개인적으로 상당히 재밌는 기법이라 생각됩니다.

 

4.1. AdaBoost

Bagging (Bootstrap AGGregatING)

투표를 할 weak classifier(ck)가 K개 있다고 할 때, 각 classifier를 학습할 data를 K번 bootstrapping하여 선택하고, 그것을 가지고 training 하는 방법입니다. 간단하죠.. ^^

 

AdaBoost

Bagging은 모든 weak classifier가 상관성없이 random한 data를 학습했다고 말할 수 있습니다. 하지만 AdaBoost는 classifier를 학습시켜나갈 때마다 이전 classifier의 학습 결과를 이용합니다. 다음 그림 16을 살펴봅시다. 먼저 첫번째 weak classifier (c1)을 학습시킵니다. 그러면 어느정도는 구분을 해내지만 틀린 data sample들이 나오겠지요.  그리고, 그 때의 오류값(ε1)을 이용하여 첫번째 weak classifier의 신뢰도(α1)를 구합니다. 이 신뢰도는 추후 투표권 갯수에 영향을 미치는 값이 되겠지요. 그리고 나서 그 틀린 data sample은 다음 classifier가 더 잘 구분할 수 있도록 weight 를 높여줍니다.

그 상태에서 두번째 weak classifier (c2) 를 학습시킵니다. weight를 올려주었기 때문에 당연히 c1 에서 구분하지 못했던 녀석들을 잘 구분해 내겠지요. 하지만 그래도 또 구분못하는 녀석이 생깁니다. 역시 오류값(ε2)과 신뢰도(α2)를 구해줍니다. 그리고 분류하지 못한 그 data sample의 weight를 또 높여줍니다. 그리고 나서 다시 세번째 weak classifier를 학습시킵니다. 이 과정을 반복합니다. 모두 학습이 되었으면, 각 weak classifier는 투표원이됩니다. 어떤 입력 x가 들어오면 그게 무엇인지 투표를 하게 되면 투표 결과에 따라 decision은 완료됩니다. 그림 16에서 투표의 과정 식 H(x)가 잘 나타나 있습니다.

  

그림 16. AdaBoost의 학습 과정.

(그림 출처 : http://www.cc.gatech.edu/~kihwan23/imageCV/Final2005/FinalProject_KH.htm )

 

 

[1] 여담으로…

d(x)에 임의의 상수 c를 곱해도 hyperplane은 변하지 않기 때문에, 정확하게는

와 같이 표현해야 겠지만, 추후에 c를 크게 고려할 필요가 없으므로, 생략하는 것 같습니다.


신고
  1. 이일용 2014.07.30 11:15 신고

    대단하시군요.역시 능력자!!

  2. 나누구게 2014.07.31 22:17 신고

    ㅎㅎ 안그래도 나도 요즘 Machine Learning쪽 좀 보고 있는데. 거의 9년전에 좀 봤었는데 하나고 기억이 안나네.
    열심히 공부해서 나중에 나 좀 알려다오.

  3. 이일용 2014.08.27 12:52 신고

    특별칼럼이요? 제가 무슨... ㅎ
    기회되면 Face Recognition 하고, 3A에 대해 써볼까요? ㅎ

  4. 정진범 2014.10.24 10:25 신고

    좋은 정보 감사합니다!!

  5. kipid 2014.11.13 07:54 신고

    오! 정리하느라 고생 많으셨겠네요.

    • 날이 갈수록 알아야 할(?) 것들이 많아져서 힘이 들긴 합니다만, 그래도 새로운 걸 배우는 건 언제나 재미있는 일인 것 같아요. 응원 감사합니다.

  6. aaljo2 2014.12.19 16:59 신고

    좋은 정보 공유 감사드립니다. 앞으로 많은 가르침부탁드립니다.

  7. smileyujacha 2015.04.15 21:54 신고

    진짜 도움 많이 받아 갑니다. 깔끔한 정리와 이해도가 높게 글을 적어주셔서 정말 감사합니다 !

  8. 이봉진 2015.06.05 16:09 신고

    기계학습으로 검색하니까 위키피디아 결과에 이어 2등으로 나오네요^^ 제가 아는 내용도 딱 이정도인데... 요새는 다들 DNN을 하는듯 해요ㅠㅠ

  9. good 2015.08.11 17:34 신고

    도움 많이 받아갑니다. 깔끔한 정리 뿐 아니라 쉽게 읽힐 수 있게 쓰여서 개인적으로 많은 도움 되었어요!

  10. park.suhyuk 2016.02.10 21:36 신고

    오랜만에 보니 새롭기도 하고, 옛날 책을 뒤적거리게 되고 즐거운 시간이었습니다.
    정리가 잘 되어 있어 보기에 아주 편했습니다. :-)

  11. 박성진 2016.06.28 16:12 신고

    와 대박....
    이런 지식들 얻기 힘든데 덕분에 잘배워갑니다 ㅜㅜ
    감사합니당!!

  12. 김종곤 2016.06.28 17:19 신고

    안녕 하십니까
    딥러닝쪽을 공부하고 직접 구현해 보고있는 대학원생입니다.
    자바가 주 언어이지만, 파이썬의 딥러닝 라이브러리가 좋다는 소리가 있어서, 아직 잘은 모르지만 나중에는 테아노- keras와 같은 라이브러리 를 써서 구현 해 볼것이지만, 현재는 파이썬으로 low-level 수준으로 mnist 인식 을 구현 해보는 중입니다.
    딥러닝의 기반이 신경망에 있다고 생각하여 신경망 책을 보고 거기에 있는 이론(모멘텀, l2 정규화(현재도 많이 쓰더군요.) Gradient 알고리즘, 공액, 마르코프 (수학적으로 이해가 가지 않아 아직은..) 쨌든. mnist 등을 적용하고 모멘텀, 가변학습률 drop out soft max 크로스 엔트로피 와 같은 알고리즘을 적용하여
    DNN 을 일반화 하는 코드를 작성하고 98.5%의 학습률까지는 나왔는데요.

    이제 CNN도 구현해보려고 하는데, Theano 를 쓰기전에 RNN 까지 LOW LEVEL로 구현하고 들어가보려고 합니다.
    혹시 이게 멍청한 짓인지, 아니면 잘하고 있는건지 답변좀 해주세요...

    한국에는 자료가 많이 없고 , 구글링, 파이썬 라이브러리 참고 하면서 개념 습득및 구현을 해보고 있는데요.
    조언이나 지도? 부탁드립니다.!!!



    • 원하시는게 빨리 응용을 하고 싶으냐? 깊숙히 들어가는 연구를 하고 싶으냐? 에 따라 다를 것 같습니다만, 저라면 low level 구현은 하지 않을 것 같습니다.

      딥러닝은 연구속도가 매우 빨라서 새로 나오는 지식을 습득하기도 벅찬 것이 사실입니다. 오래된 기본 알고리즘을 low level부터 구현하는 것 보다는 새로운 알고리즘을 빨리 습득하는 것이 더 좋을 것 같아요.

      low level 구현이 필요한 시기가 올 수도 있는데 (실제 제품에 적용한다던지..), 그 때가 온다면 그 때 해보시면 될 것 같습니다.

  13. 완전감동 2016.11.01 20:36 신고

    음파선생님~ 설명 감사드립니다~~~
    이렇게 이해하기 쉽고, 재밌는 글은 처음봤어요~

  14. Jonathan Jung 2017.03.14 21:30 신고

    잘봤습니다. 기초적인 이해를 돕는데 많이 도움이 됐네요 .

    북마크 등록해두고 자주 찾아뵐게요~
    감사합니다.

+ Recent posts