2017-10-21 20:15:36

서포트 벡터 머신(SVM)은 딥 러닝이 나온 이후에도 여전히 환영받고 있는 머신러닝(기계학습) 알고리즘이다. 웬만한 상황에서 딥 러닝 못지 않은 성능을 내고, 무엇보다도 가볍기 때문이다. 나도 분류(classification)나 회귀(regression)의 목적으로 SVM을 자주 활용하고 있다. 이 글은 나와 같은 SVM 사용자를 위한 글이다. 사용자의 입장에서 SVM에 대해서 알아야할 것들을 정리해보려고 한다. 이미 온라인 상에 SVM에 대한 많은 글들이 있지만, 대부분 복잡한 수식적인 것에 치우쳐서 너무 어렵거나 아니면 너무 수박 겉핡기인 글들이 많다.   

 

알고리즘의 개발자가 아닌 사용자라면 어떻게해야 SVM을 좀 더 잘 사용할 수 있을지를 아는 것이 중요하다. 여기에 초점을 맞춰 필요한 이론을 설명하겠다. 주로 가장 많이 사용되는 SVM은 radial basis function (RBF) 커널을 사용한 SVM이다. 거의 모든 머신러닝 알고리즘이 그렇듯이 RBF 커널 SVM도 두 개의 매개변수(C, gamma)가 사용자에 의해 세팅되어야 한다. 그런데 사실 대부분 이 두 개의 매개변수를 grid search라는 경험적인 방법의 의해서만 선택한다. grid search란 그림1과 같이 매개변수들의 여러 조합들을 테스트해서 가장 좋은 성능을 내는 매개변수를 찾아내는 것이다. 그러나 매개변수들이 SVM 내에서 어떤 역할을 하는지 의미를 알고 grid search를 진행한다면 좀 더 빠르게 적합한 매개변수값들을 찾아낼 수 있다. 

 

그림1. grid search의 예

  

이 매개변수들이 어떤 의미를 갖는지 알려면, 우선 RBF 커널 SVM에 대해서 어느 정도 이해하고 있어야 한다. 또 RBF 커널 SVM을 알려면 먼저 가장 간단한 선형 SVM에 대해서 알아야 한다. 선형 SVM에서 사용자가 설정해야하는 매개변수가 cost이고, RBF 커널 SVM은 cost와 함께 gamma라는 매개변수를 추가적으로 조정해야한다. 따라서, 선형 SVM(매개변수 C), RBF 커널 SVM(매개변수 C와 gamma) 순으로 글을 진행하겠다.

 

 

 

선형 SVM

SVM을 한마디로 소개하자면 데이터를 선형으로 분리하는 최적의 선형 결정 경계를 찾는 알고리즘이다[1]. 그 중 가장 간단한 것이 선형 SVM(linear SVM)이다. SVM 알고리즘의 목표는 아래 그림2와 같이 클래스가 다른 데이터들을 가장 큰 마진(margin)으로 분리해내는 선 또는 면을 찾아내는 것이다. 이 선 또는 면을 결정 경계 또는 분리 초평면이라고 부른다. 마진에 대해서는 잠시후에 설명할 것이다. 

 

그림2. 가장 데이터를 잘 분류해낸 선은 H3이다. 마진(margin)이 가장 크기 때문이다. [4]

 

 

H1의 경우 데이터를 제대로 분류하지 못했고, H2는 분류하기는 했지만 작은 마진으로 분류했다. H3가 가장 큰 마진으로 데이터를 적절히 분류해낸 결정 경계가 된다. 마진이란 단어를 설명도 없이 사용해왔는데, 두 데이터 군과 결정 경계와 떨어져있는 정도를 의미한다. H2는 데이터들과 가까운 반면, H3는 데이터들과 꽤 멀리 떨어져 있다. 결과적으로 이후에 새로운 데이터가 추가 되더라도 H3가 훨씬 더 안정적으로 데이터를 분류해 낼 수 있다(그림3). 이러한 이유로, 위에서도 설명했지만 SVM의 목표는 마진이 가장 큰 결정 경계를 찾는 것이다. 

 

그림3. 4개의 데이터가 새롭게 추가된 상황에서 H3와 달리 H2는 데이터를 제대로 분류해낼 수 없는 것을 알 수 있다.

 

여기까지 읽었다면 왜 알고리즘의 이름이 '왜 서포트 벡터 머신일까? 서포트 벡터라는 것은 도대체 무엇일까?'라는 의문이 들 수 있다. 그림4를 보자.

 

그림4. 마진, 결정 경계, 서포트 벡터.

 

서포트 벡터들은 두 클래스 사이의 경계에 위치한 데이터 포인트들(그림4에서 점선 위에 있는 데이터들)이다. 많은 데이터가 있지만 그중에 서포트 벡터들이 결정 경계를 만드는데 영향을 준다. 이 데이터들의 위치에 따라 결정 경계의 위치도 달라질 것이다. 즉, 이 데이터들이 결정 경계를 지지(support)하고 있다고 말할 수 있기 때문에, 서포트벡터라고 불리는 것이다.

 

그러나 대부분의 데이터는 위에서 본 데이터와 다르게 이상적으로 분리되어 있지 않다. 많은 경우 이상치(outlier)들이 관측된다. 그림5와 같이 분명 이쪽에 있어야하는 놈이 저쪽에 가 있는 경우다. 

 

그림5. 이상치(outlier)가 존재하는 경우.

 

이런 경우에 데이터들을 선형적으로 완벽하게 분리해내는 것은 불가능하다. 이를 해결하기 위해서 약간의 오류를 허용하는 전략이 만들어졌다. 이것과 관련된 파라미터가 바로 cost(C)이다. C는 얼마나 많은 데이터 샘플이 다른 클래스에 놓이는 것을 허용하는지를 결정한다. 작을 수록 많이 허용하고, 클 수록 적게 허용한다. 다른 말로, C값을 낮게 설정하면 이상치들이 있을 가능성을 크게 잡아 일반적인 결정 경계를 찾아내고, 높게 설정하면 반대로 이상치의 존재 가능성을 작게 봐서 좀 더 세심하게 결정 경계를 찾아낸다. "난 데이터 샘플하나도 잘못 분류할 수 없어!"라면 C를 높여야한다. 반대로 "몇 개는 놓쳐도 괜찮아, 이상치들이 꽤 있을 수도 있으니까"라면 C를 낮춰야한다.이것이 무슨 뜻인지 아래 그림6을 통해 이해해보자. 

 

그림6. 매개변수 C의 영향

 

왼쪽 그림에서 볼 수 있듯이 C가 낮을 때는 하나의 데이터를 잘못 분류했지만 좀 더 일반적인 결정 경계를 찾아냈다. 반면 오른쪽 그림과 같이 C가 높을 때는 실수 없이 분류해냈지만, 새로운 데이터가 어느 클래스에 속하는지 예측할 때는 좋은 성능을 낼 수 없을 가능성이 크다. C가 너무 낮으면 과소적합(underfitting)이 될 가능성이 커지고, C가 너무 높으면 과대적합(overfitting)이 될 가능성이 커지니 적합한 C값을 찾아내는 것이 중요하다. 참고로 C의 유무에 따라 하드마진(hard-margin) SVM, 소프트마진(soft-margin) SVM이라고 불린다. 

 

지금까지 선형 SVM에 대해 설명했는데, 선형 SVM으로는 데이터를 제대로 분류할 수 없는 상황들이 상당히 많다(그림7). 그런 경우를 해결하기 위해 여러 방법이 제안되었는데 그 중 가장 널리 활용되고 있는 것은 바로 RBF 커널 SVM이다.  

 

그림7. 선형 SVM으로는 제대로 분류할 수 없는 상황

 

RBF 커널 SVM

SVM은 선형 SVM이든 RBF 커널 SVM이든 항상 선형으로 데이터를 분류하는 것이 기본적인 전략이다. 그러나 그림7과 같은 상황에도 이 전략이 통할 수 있을까? 그래서 나온 것이 커널 기법이다. 커널 기법은 주어진 데이터를 고차원 특징 공간으로 사상해주는 것이다. 고차원 공간에 사상되고 나면 원래의 차원에서는 보이지 않던 선형으로 분류해줄 수 있는 방법이 보인다(그림8-1). 

그림8-1. 커널 기법에 대한 설명. 커널 함수를 적용하고 나니 선형적으로 분류할 수 있는 결정 경계를 찾을 수 있게 되었다.

 

2차원 공간에서는 도저히 선형적으로 분류할 수 없을 것 같았던 데이터 분포가 커널 기법을 사용해서 3차원 공간으로 사상되니 분류가 가능해졌다. 3차원 공간에서 분류된 것을 다시 2차원 공간으로 매핑해서 보면 아래 그림과 같이 결정 경계가 둥그렇게 보일 것이다(그림8-2). 

 

그림8-2. RBF 커널 SVM으로 데이터를 분류해낸 모습.

 

커널에는 Polynomial 커널, Sigmoid 커널, 가우시안 RBF 커널 등 종류가 많은데, 그 중 가장 성능이 좋아 자주 사용되는 것이 가우시안 RBF 커널이다. 각 커널마다 최적화를 도와주는 매개변수들이 따로 있다. RBF 커널의 경우 gamma라는 매개변수를 사용자가 조정해야한다. SVM의 기본 매개변수인 C도 있으므로 총 2개의 매개변수를 설정해줘야한다. 그렇다면 gamma의 역할은 무엇일까? gamma는 하나의 데이터 샘플이 영향력을 행사하는 거리를 결정한다. gamma는 가우시안 함수의 표준편차와 관련되어 있는데, 클수록 작은 표준편차를 갖는다. 즉, gamma가 클수록 한 데이터 포인터들이 영향력을 행사하는 거리가 짧아지는 반면, gamma가 낮을수록 커진다. gamma의 크기에 따른 가우시안 함수의 모양은 그림8에서 확인하자. 

 

그림8. gamma의 크기에 따른 가우시안 함수의 모양 [7]

 

그림 9를 보면서 gamma와 C의 영향에 대해서 마지막으로 생각해보자. 오른쪽으로 갈수록 gamma가 커지고, 아래 쪽으로 내려갈수록 C가 커지는 형국이다. 

그림9. C와 gamma의 영향

 

 

우선 C부터 살펴보면, C가 커질수록 이상치의 존재 가능성을 낮게 본다고 이전에 설명했다. gamma가 10으로 동일한 첫번째 열을 보자. C=1인 상황에서는 두 개의 이상치를 인정하고 무난하게 결정 경계를 찾은 반면, C=100일 때는 하나의 이상치만 인정하면서 조금은 억지스럽게 분류해냈다. 이번에는 gamma의 영향을 살펴보자. C가 1로 동일하게 세팅되어 있는 첫번째 행을 왼쪽에서부터 오른쪽으로 보면 gamma가 점점 커지는데, 결정 경계가 결정 경계 가까이에 있는 데이터 샘플들에 영향을 크게 받기 때문에 점점 더 구불구불해지는 것을 알 수 있다. 즉, gamma 매개변수는 결정 경계의 곡률을 조정한다고 말할 수도 있다. gamma의 값이 높아짐에 따라 파란색의 공간이 점점 작아졌는데, 위에서 언급한 것과 같이 각각의 데이터 포인터가 영향력을 행사하는 거리가 짧아졌기 때문이다. 매개변수 C와 마찬가지로 너무 낮으면 과소적합될 가능성이 크고, 너무 높으면 과대적합의 위험이 있다. 따라서 두 파라미터 모두 적정값을 찾아야하는 것이 우리 사용자들의 숙제이다. 

 

정리

마지막으로 정리하자. SVM 알고리즘 중에서 가장 성능이 괜찮고 일반적으로 널리 사용되는 것은 RBF 커널 SVM이고, 좋은 성능을 얻으려면 매개변수인 C와 gamma를 잘 조정해줘야 한다. C는 데이터 샘플들이 다른 클래스에 놓이는 것을 허용하는 정도를 결정하고, gamma는 결정 경계의 곡률을 결정한다. 두 값 모두 커질수록 알고리즘의 복잡도는 증가하고, 작아질수록 복잡도는 낮아진다. 일반적으로 grid search로 경험적으로 최적의 매개변수 값들을 찾아가는데, 이상 설명한 내용을 어느 정도 숙지하고 있다면 훨씬 더 빠르게 좋은 성능을 내는 매개변수 값들을 찾아낼 수 있을 것이다. 
긴 글 읽으시느라 수고하셨습니다. 부족한 글이지만 조금이나마 도움이 되셨길 기대하며 글을 마칩니다. 이후에 이해가 더 깊어지면 글을 수정하겠습니다. 질문있거나, 잘못된 내용 있다면 댓글 남겨주세요!

 

관련 글

[python] SVM 분류 문제를 통해 배우는 머신러닝 훈련 및 테스트LIBSVM 활용하여 매트랩에서 SVM 사용하기정규화(normalization)와 표준화(standardization), 머신러닝 성능 향상을 위한 필수 단계

 

참고 자료

[1] http://yamalab.tistory.com/40 => SVM에 대한 포스팅(티스토리)

[2] http://blog.naver.com/PostView.nhn?blogId=tjdudwo93&logNo=221051481147 => SVM에 대한 포스팅(네이버블로그)

[3] http://kkn1220.tistory.com/140 => SVM에 대한 포스팅(티스토리), 감마 파라미터에 대한 내용이 좀 더 구체적으로 있음.  

[4] https://www.dtreg.com/solution/view/20 => SVM에 대한 영문 자료

[5] http://www.eric-kim.net/eric-kim-net/posts/1/kernel_trick.html => 커널 기법

[6] https://www.youtube.com/watch?v=m2a2K4lprQw => 감마 파라미터에 대한 유투브, 굿.

[7] http://tomaszkacmajor.pl/index.php/2016/04/24/svm-model-selection/ => 파라미터 설정에 대한 설명

[8] http://www.csie.ntu.edu.tw/~cjlin/libsvm/#GUI => SVM GUI, 이거 좋다.