[AI] Support Vector Machine (SVM) - Linear
이번 파트는 수식이 좀 많다보니 직접 타이핑 한 것 보다 필기자료를 들고 오는게 나을 것 같아서 글보다 비교적 사진이 많을 예정이다.
Support Vector Machine
SVM은 기계 학습 분야 중 하나로 패턴인식, 자료 분석을 위한 지도학습 모델이다. Classification, Regression에 사용할 수 있다.
일단, Classification에 초점을 두고 SVM을 알아보자. 데이터를 두 부류로 분리할 때 여백을 최대로 가지는 초평면(hyperplane)을 찾는 것이 이 모델의 최종 목표이다.
![](https://blog.kakaocdn.net/dn/ecgQK8/btsy3d5ydqO/WLPdtUubTKWUzJ453agFU1/img.png)
위 그림에서 검정원과 흰 원은 d(x) = wx+b 에 의해 두 부류로 나뉘어졌다. 이때, 그 선에서 가장 가까운 점을 support vector라고 한다.
![](https://blog.kakaocdn.net/dn/CSvDa/btsy39aN7O8/XXVF01lNoGvwVb0tzLkVF1/img.png)
왜 여백을 최대화 해야하는가? 그 이유는 최대한 일반화 능력을 기르기 위함이다. 일반적인 모델은 1번에서 시작해서 점점 학습을 해나가다가 2번 선을 찾으면 학습을 종료할 것이다. 왜냐하면, train 데이터에 대해 100% 분류하는 선을 찾았기 때문이다. 하지만, SVM은 단순히 분류하는 것이 목표가 아닌 두 데이터 사이의 여백(간격)이 제일 큰 선을 찾는 것이 목적이기에 3번까지 도달해서야 학습이 끝난다.
Linear SVM (선형 서포트 백터 머신)
1. Hard Margin
d(x) = w1x1 + w2x2 + ... + wdxd + b = WTx + b 식에서 우리는 여백을 가장 크게 하는 W와 b의 값을 구하는 것이 목표이다.
![](https://blog.kakaocdn.net/dn/rb0Xe/btsy4lvlcBq/rKPJSRTwu5Up2fYcoxHetk/img.png)
![](https://blog.kakaocdn.net/dn/cyOY3s/btsy4aAPs1o/oHxMbKxfNdDwJkhlLsxeO0/img.png)
위의 진한 선이 d(x) = 0 선이다. 이 보다 위쪽에 있는 점들을 x+ 아래쪽에 있는 점들을 x-라고 하자. x+ 쪽의 support vector는 d(x) = 1 위에 있다. 그리고 x- 방향의 support vector는 d(x) = -1 위에 있다.
즉, d(x+) = 1, d(x-) = -1이다. ( 이때, x+ = λw + x- 의 관계에 있다고 하자. )
아래 과정을 통해 λ를 구할 수 있다.
![](https://blog.kakaocdn.net/dn/IPsgR/btsyU6UvOOH/jJOe43DV4SMlpV1KOINMc1/img.png)
λ = 2 / W^T W 가 나온다. 이를 이용해 여백을 수식적으로 표현해보자.
margin = 2s = x+에서 x- 까지의 거리이다.
![](https://blog.kakaocdn.net/dn/nCD22/btsyTzimpPC/z0CUbY1hzf85c596LGceik/img.png)
J(w) = 2 / ||w||_2 가 된다. 여기서 주의할 점은 ||n||_k 는 절댓값이 아니라, norm을 나타낸다.
Norm은 vector의 사이즈이다.
![](https://blog.kakaocdn.net/dn/xHDuk/btsy4rvxbvy/McQgN99mobKiK8VExzWhBK/img.png)
L2 norm이라는 것은 유클리드 distance랑 같은 의미라고 생각하면 된다. (norm에 대해서는 여러 규제 기법에 대해 정리할 때 한번 더 다루겠다. 원래 순서상 규제를 먼저 올려야했는데 )
SVM의 최종 목표는 Margin을 최대화하는 것이다.
![](https://blog.kakaocdn.net/dn/KBPmj/btsyV1SsPNn/4A8I40vl5TtZousetErKtK/img.png)
하지만, W가 분모에 있으니 문제가 복잡해져서 최대화 문제를 역수를 취하고 W에 제곱을 취해 최소화 문제로 고쳐보겠다. ( 제곱을 하는 이유는 l2 norm에 root 가 있어서 복잡해지기 때문 )
![](https://blog.kakaocdn.net/dn/bqDLd3/btsyTZulXCP/ocbx4BCZSvt6MjVKvcohaK/img.png)
여기서 부터 조금 복잡해진다. J(W) = (||W||_2)^2을 어떻게 최소화 할까? 우리는 여기에 라그랑주 승수법을 적용할 것이다.
![](https://blog.kakaocdn.net/dn/MIxZg/btsy4kiVixE/5UnCO7GLHcRnGgaT5xs9GK/img.png)
https://terms.naver.com/entry.naver?docId=5938017&cid=60217&categoryId=60217
라그랑주 함수
최적화(optimization) 기법 중 하나인 라그랑주 승수법(Lagrange multiplier)에 사용되는 함수를 뜻한다. 여기서 라그랑주 승수법이란 제한 조건(constraint)이 있을 때의 최적화 기법으로, 제한 조건이 있는
terms.naver.com
이 지식백과에서 라그랑주 최적화 방법을 매우 쉽게 설명하고 있다. 참고하면 좋을 것이다.
라그랑주 최적화에서의 목적함수는 J(w) 가 되고, yi(xiW^T+b) -1 가 제약 조건이 될 것이다. ( 단, 1<= i <= n )
목적함수와 제약조건을 하나의 식으로 만든 L(w, b, α) 는 아래와 같다.
![](https://blog.kakaocdn.net/dn/c1zQV6/btsyT0044y2/oNfhvgjzi4OOkBzGXKRcU1/img.png)
여기서 α는 라그랑주 상수이다. 그리고 우리가 최종적으로 구하고 싶은 것은 W와 b 값임도 잊지 말자. 각각의 변수에 대해 편미분을 한 값이 = 0 임을 이용해 w, b의 값을 찾아보자.
![](https://blog.kakaocdn.net/dn/bc0ACT/btsy0g2XtuO/8Vvlvcm6E5AeY2KEknWmdk/img.png)
정리한 식이 위(1, 2번 빨간 네모 식) 처럼 나왔다. 우리는 b, w를 구하기 위해서 최종적으로 라그랑주 상수에 해당하는 값인 α를 찾아야한다는 것을 알 수 있다.
이렇게 구해진 1, 2번 식을 이용해 처음 L(w, b, α) 식을 간단히 해보자.
![](https://blog.kakaocdn.net/dn/bf3YKO/btsyVkdVY1A/TH1OvrZJqvR9SYeaKpLoV0/img.png)
전개하면서, W와 b가 사라지고 α에 관한 식으로 변했다. 결국 Lagrangial Dual 문제로 변환이 된 것이다.
![](https://blog.kakaocdn.net/dn/vNKrd/btsyYprZnjs/BkyV0P67suWwJvkKXYVe20/img.png)
우리는 위 α에 관한 위 식을 최대화하는 α를 찾아야한다. 이때, 목적함수는 α에 대한 2차식이고 조건이 1차이기 때문에 KKT condition을 이용해 α 값을 구한다.
https://en.wikipedia.org/wiki/Karush%E2%80%93Kuhn%E2%80%93Tucker_conditions
Karush–Kuhn–Tucker conditions - Wikipedia
From Wikipedia, the free encyclopedia Concept in mathematical optimization In mathematical optimization, the Karush–Kuhn–Tucker (KKT) conditions, also known as the Kuhn–Tucker conditions, are first derivative tests (sometimes called first-order neces
en.wikipedia.org
KKT 에 대한 내용이다. 사실 나는 이해하지 않았다. 그냥 그렇구나 하고 넘어가는 게으른 학부생이다.
KKT condition 은 Stationarity, Primal Feasibility, Dual Feasibility, Complementary slackness가 있다.
Stationarity 가 우리가 아까 사용한 편미분 값이 0이라는 내용이다.
![](https://blog.kakaocdn.net/dn/nF3K6/btsy4mA1o7K/SaWSoi38K8XRapktzRAoN1/img.png)
여기서 우리는 complementary slackness에 집중해보자. 우리 식 L도 이 조건을 만족해야한다.
![](https://blog.kakaocdn.net/dn/cxm8tW/btsy0h1R6Ha/2X3mBOtauw21oKkpeqLHak/img.png)
위 식을 만족해야한다. 이때, 두 가지 상황에 대해 살펴볼 수 있다. 첫 번째는 ai가 0인 경우이다. 이때는 yi(wTxi+b)-1 이 0이 아닐 수도 있다. ai 가 0보다 큰 경우는 yi(wTxi+b)-1 가 0이어야한다.
![](https://blog.kakaocdn.net/dn/SyG3z/btsy06TeuPO/YyW0saOu8zmebMFdXQkkW1/img.png)
즉, ai > 0 이면 support vector라는 의미이다.
![](https://blog.kakaocdn.net/dn/EZzPJ/btsyU5nPDZF/gES1mVLz2qdXLpZ8xJTeak/img.png)
이렇게 W를 찾으면, b도 찾을 수 있다.
2. Soft Margin
위에서 찾은 식은 한 가지 한계가 있다. 바로, 점이 분리가능할 때만 사용할 수 있다는 것이다. 위와 같은 방식을 Hard Margin이라고 한다.
![](https://blog.kakaocdn.net/dn/brBzXn/btsyXX3CL99/v9GIbBDDbVjTDkkdBLVfm1/img.png)
데이터에 outlier가 들어가있는 경우 등을 허용한다던지 등 약간의 규제를 풀어서 유연하게 SVM을 만들고자 한다. 그 방식을 Soft Margin이라고 한다.
![](https://blog.kakaocdn.net/dn/ckEx4W/btsyWiAhpkj/MeKwcPtLVKAr2WHot6BgyK/img.png)
우리는 ξ 를 새로 정의 할 것이다. ξ는 정확하게 분류되지 않은 vector들이 초평면으로 부터 떨어진 거리이다. 그리고 이 것들의 합에 C를 곱한 값을 기존의 식에 더해 minimize 할 것이다. 이때, C는 사용자에게 받는 Hyperparameter이다. ( 코드 짤 때 넣는 그 변수 C 맞다. )
C를 크게 하면 상대적으로 정교해지기 때문에 overfitting 이 일어날 확률이 있고, C를 낮게 하면 margin의 범위가 넓어져 underfitting이 일어날 가능성이 있다. 이 값은 실험적으로 찾아야한다.
![](https://blog.kakaocdn.net/dn/NrdiA/btsy3eXMzww/GkfoMH7MfCWGESo1LPpGY1/img.png)
라그랑주 식은 ξ 를 포함해 다음과 같이 변환된다.
사실 이제 부터 앞에서 했던 과정과 동일하게 풀어나가면 되기에 설명은 생략하고 풀이과정만 보이겠다.
![](https://blog.kakaocdn.net/dn/bQPxJq/btsyVZUEhgw/VnVdzKiTpYTlF04sekHcfK/img.png)
![](https://blog.kakaocdn.net/dn/nGWGR/btsyT2EFiz9/fHokqd9fupeoemkFkrTE00/img.png)
![](https://blog.kakaocdn.net/dn/bgsYJ6/btsy3Ox7kIO/l3Tp7Xk6mPv2cXcd96ERlK/img.png)
정말 놀랍게도 최종 식은 ai의 범위만 변한 결과가 나온다.
![](https://blog.kakaocdn.net/dn/AqzBH/btsyXY2y5h1/4uzgj1aWBu7WXXbcDT8eCK/img.png)
![](https://blog.kakaocdn.net/dn/bol4Z0/btsyXY9lQF9/zzydJ5UkwQu6r4EBtGSK50/img.png)
![](https://blog.kakaocdn.net/dn/dHV7iv/btsyTWqTeJg/9lGWzKXuyIsj4ZKKn43u01/img.png)
이렇게 C 값을 이용해 margin의 범위를 조정할 수 있다.
Nonlinear SVM Classification
이때까지는 linear하게 데이터를 분리하고자 했다. 하지만, linearly seperable 하지 못하는 값이 약간의 공간 변형을 통해 linearly seperable한 상황이 온다면 공간 변형을 해서 나누면 될 것이다.
![](https://blog.kakaocdn.net/dn/48rTd/btsyWhVFhTx/mH4pTxllHRwcw7CNwlz5lk/img.png)
x2 = x1 ^ 2 이라고 하자. 위 사진에서 x1은 linearly seperable하지 않지만, 오른쪽의 경우는 쉽게 나눌 수 있다.
여기서부터는 글이 길어져서 다음 글에서 이어지겠다.