Professional Documents
Culture Documents
SVM Support Vector Machine D4R6
SVM Support Vector Machine D4R6
SVM계산을 어떻게 하는 것인가, SVM 은 기본적으로 최적화 제약이 있는 constraint optimization problem 이다. SVM 을
풀기 위해서는 제약이 있는 최적화를 풀어야 하는데, 이 때 사용 가능한 방법론 중에 가장 일반적인 방법이 라그랑지 방법이 있다.
라그랑지 방법을 SVM 에 적용을 해서 실제로 SVM 을 풀어보는 것으로 구성.
SVM 이란?
이항 분류기 Binary Classifier)
독립변수 xi 개체가 주어졌을 때, yj 가 −1, 1 혹은 A, B 두 개의 어떤 가능한 집단이 있고 어디에 속하는지 예측하는
그러한 머신으로 예측.
Binary Classification 의 대표적인 것이 Logistic Reg 은 Bernoulli Dist 에 근거 해서 그 기대 값인 1이 될 확률이 되
는 logit 변환을 xˉ 에 대한 선형 함수로 가정해서 푸는 방법.
SVM 은 통계하고는 상관이 없는 Computer Scientist 가 일종의 최적화 ( geometric ) 알고리즘으로서 먼저 제안을
했고, 좋은 성능을 판명되어서 많은 분야에 쓰게 되고, 통계 연구로 SVM 은 Logistic Regression 과 그리 멀리 떨어져
있지 않다. Ridge, LASSO 와도 연관이 있다.
굉장히 대표적으로 중요한 방법론 중의 하나.
SVM
확률, 통계적 근간에서 나온 것이 아니라 xˉ 라는 독립변수를 다차원 공간상에 뿌렸을 때, 반응 변수의 값에 따라서 두 개
의 집단으로 분류가 된다. 공간상에 xˉ 들을 뿌려놓으면,
2차원의 x1 , x2 이면
빨간색은 y 가 −1 인 , 파란색은 y 가 1 인 그러한 값으로 보면, xˉ 들 상에서 두 개를 집단을 잘 분리하는 어떤 직선 하나
를 긋는 문제로 받아드릴 수 있다. 그럼 이 분류 경계가
SVM 이론
분류 경계 ( Line / Hyperplane )
2 차원 : Straight Line, 3 차원 : plane, 4차원 이상 : Hyperplane - 어떤 공간의 subspace.
p 차원 공간이 있으면, p 차원에 대한 선형 식으로
ˉ) = β0 + β1 x1 + β2 x2 + ⋯ + βp xp = β0 + βˉT x
f(x ˉ=0
어떤 xˉ 가 있을 때
f(xa ) > 0 → ya = 1
f(xb ) < 0 → yb = −1
이라는 것은 분류에 입각해서 본다면, 두 집단이 최대한 멀리 떨어져 있으면 좋다. 두 집단이 멀리 떨어져 있
Optimal
원리 의 기하학적 해석.
Step 1 - SVM
파란색 직선에 원점에서 그은 수선, βˉ 라는 것을 확인 하는 것. vector 은 0 에서부터 direction 을 의미한다. 그래서 여
기있는 βˉ 는 직선이 가지고 있는 coefficient vector 이다. 이 βˉ 가 결국 이 직선과 수직이다는 것을 먼저 확인할 수 있
다.
기하적으로 βˉ 가 수직이라는 것은 두 vector 간의 inner product (내적) 가 0 이라는 것을 의미하고, 그것을 보이기 위
해서는 임의의 xa, xb 점이 있는데, 이 두 점은 파란색 선 위에 있다. blue line 사이 (xa − xb ) 의 vector 를 의미한다.
이 vector 와 βˉ 는 언제나 수직이다. 따라서 이 vector 와 βˉ 의 내적은
⟨βˉ, xa − xb ⟩ = βˉT (xa − xb ) = βˉT xa − βˉT xb = −β0 + β0 = 0
∵ β0 + βˉT xa = 0, β0 + βˉT xb = 0
xa , xb 모두 직선 상에 있으므로.
기하학, β 가 직선에 대한 Normal 이고, Normal → 이 직선의 intercept 를 제외한 coefficient 값. 그래서 Normal
과 직선은 언제나 수직.
M ⟨x ˉ βˉ⟩
ˉ∗ − x
cos(θ) = ∣∣xˉ∗ − xˉ∣∣
= ∣∣xˉ∗ − xˉ∣∣∣∣βˉ∣∣
M ⟨x ˉ βˉ⟩
ˉ∗ − x ⟨x ˉ, βˉ⟩
ˉ∗ − x βˉT xˉ∗ − βˉT xˉ βˉT xˉ∗ +β0
∣∣xˉ∗ − xˉ∣∣
= ∣∣xˉ∗ − xˉ∣∣∣∣βˉ∣∣
⇒M = ∣∣βˉ∣∣
= ∣∣βˉ∣∣
= ∣∣βˉ∣∣
같은 직선 인 것 처럼, vector 의 길이만 다르다. 따라서 길이를 딱 specify 하지 않으면 vector 가 unique 하지 않다.
그래서 vector 를 하나로 표현하기 위해서 "βˉ" 의 길이를 편의상 1 로 가정하자. 그러면 결국, M 이라는 것은
βˉT x
ˉ ∗ + β0
∣∣βˉ∣∣ = 1, M= = βˉT x
ˉ ∗ + β0
∣∣βˉ∣∣
ˉ∗
x 가 직선 ( blue line ) 의 왼쪽에 있다면
M 은 길이 이기 때문에 0 보다 작으면 안된다.
β0 + βˉT x
ˉ∗ < 0 → M = −(β0 + βˉT x
ˉ∗ ), y∗ = −1
만약 오른편 (β0 + βˉT xˉ > 0) 에 빨간 점 (yi = −1) 이 있다면, 이 선은 Linearly Separable 하지 않다. yi (β0 +
ˉi ) < 0 이므로. 따라서 Linearly Separable 하다는 것은 위와 같이 Margin 은 항상 0 보다 크다.
βˉT x
즉, f(x) = 0 이라는 직선의 구조에 + 집단은 우측 상단에 있고, - 집단은 좌측 하단에 있다면, 두 집단이 직선으로부
터 완벽히 separable 하다고 하고, M Geometric Margin) 은
β0 + βˉT x
ˉi , if yi = 1
Mi = { } = yi (β0 + βˉT x
ˉi )
−(β0 + βˉT x
ˉi ), if yi = −1
을 찾자.
Step 4 - Optimal MGeometric Margin)
최적의 직선이라는 것은 집단과 직선 사이의 거리(가장 가까운 데이터와의 거리) 를 최대화 시키는 것. 이 M 을 모
든 데이터로부터의 Geometric Margin 중에 제일 작은 녀석
이것이 SVM 을 푸는 원리. 그런데 M 이라는 것이 복잡해 보이니 간편하게 표현해 보자.
는 vector 이므로 길이 와는 상관 없이 방향성 이므로, ∣∣ ⋯ ∣∣ Norm 은 어떻게 제약을 잡아줘도 상관이 없으므로,
βˉ
수식상 편하게 썼던 ∣∣βˉ∣∣ = 1 → ∣∣βˉ∣∣ = M1 이라고 바꿔 써보자. 여기서 M 은 바뀌는 숫자.
1 1
∣∣βˉ∣∣ = → ˉ =M
M ∣∣β ∣∣
이 직선과 가장 가까운 데이터(점) 들과의 거리를 M 으로 정의. M 은 직선에 따라서 계속 바뀌는 숫자. 위와 같은 제약
이 있으면 βˉ 가 unique 하게 define 된다. 어떤 하나의 값으로 제약을 주면, 하나의 값으로 고정이 된다.
1 βˉT x
ˉ ∗ + β0
M= ˉ = ˉ → 1 = βˉT x
ˉ ∗ + β0
∣∣β∣∣ ∣∣β∣∣
유도식
에서
1
max M ⇔ min∣∣βˉ∣∣ ⇔ min∣∣βˉ∣∣2 = βˉT βˉ, minβ0 ,βˉ βˉT βˉ,
2
ˉ 1 ˉ T ˉ
subject to ∣∣β ∣∣ = , yi (β0 + β X i ) ≥ 1, i = 1, ⋯ , n
M
이와 같이 변하게 된다.
min∣∣βˉ∣∣ 를 하거나 min∣∣βˉ∣∣2 을 하는 것은 똑같다.
상수 12 를 곱해 주는 부분도 minimization 에도 아무 문제가 없다.
이 과정은 최적의 직선을 구하는 문제를 어떻게 수리적으로 βˉ 에 대한 함수로 표현하느냐에 대한 이야기. 최종적으로 구하고자
하는 β0 와 βˉ 그 직선, Hyperplane 은 이 문제를 풀게 됨 으로써 구해질 수 있다. 이러한 문제를 Maximal Margin Classifier
라고 한다.
우리가 하고자 했던 것은 직선과 데이터 클라우드로부터의 Margin 을 최대화 시키는 그러한 분류 경계를 찾는 것 이기 때문에 그
분류 경계는 결국 Margin 을 Maximize 하는 분류 경계. 따라서 이것을 Maximal Magin Classifier 으로 부르게 된다.
이 문제를 이렇게 정식화 하자!!!
이 문제는 결국, 여기 나와 있는 것 처럼 우리가 가정한 것은 두 데이터 클라우드가 Linearly Separable 한 경우 이렇게 풀면 된
다.
그런데, 이렇게 제약을 완화 시킬 때, 한가지 중요한 점은 가능하면 ξi 는 제약을 위반하는 것이기 때문에 가능하면 위반을 안
하게 하는것이 좋으므로, 위반 하는 양에 비례해서 벌점을 부과하게 된다. control 하는 것이 C 이고 C 가 만약에 0 이면, 이
것이 위반을 하던지 말던지 가져가면 되고, 무한대면 위반을 하면 안되는 것이므로 굉장히 strict 한 solution 을 주게 된다.
이전의 Maximal Margin Classifier 에서 non-separable 한 경우에 Maximal Margin Classifier 를 바로 적용할 수 없
기 때문에 이것을 완화 시켜준 이러한 형태의 Object 이 문제를 Soft Margin Classifier 라고 한다. 그리고 이것이 흔히 말
하는 Linear SVM (선형 SVM 이다.
C>0은 제약을 위반할 때 부여하는 비용으로 해석할 수 있으며, LASSO 문제의 λ 와 비슷한 역할을 하는 조율 모수
의 역할을 하며 사용자가 설정하게 된다. Cross-Validation 과 같은 방법을 통해서 C 값을 설정 하는 것.
이 문제를 계산으로 풀 것, Linear SVM 을 직접 계산해서 풀 것인데 거기까지 가는 과정 설명.
목적 함수f 에다가 α 를 곱하고 hi (β ) 선형식의 제약식을 더해준 함수 를 라그랑지 함수 라고 한다. 제약이 있는 최적화 식
에서 라그랑지 함수는 이 함수를 의미한다. 이 때 도입한 αi = (α1 , ⋯ , αm ) ≥ 0 이 변수를 "dual variables" 또는
"Lagrange multiplier" 라고 이야기 한다. 이 때 제약이 있을 때는 "Lagrange multiplier" 는 항상 0 보다 크거나 갔다는
조건이 있다. 이 정의를 라그랑지 함수라고 한다.
n
g(α) = minβ L(β , α) = minβ {f(β ) + ∑ αi hi (β )}
i=1
β 는 primal 문제에 있는 원래의 변수, α 는 dual variable 의 함수. β 에 대해서 minimize. 그러면 원래 β 와 α 로 이루어
진 라그랑지 함수를 β 를 minimization 하게 되면, β 의 role 이 없어진다.
n
minβ {f(β ) + ∑ αi hi (β )} → function of α
i=1
이것을 α 에 대한 함수로 볼 수 있고, 이것을 dual function g(α) 이라고 한다. 그러면 이 때 우리가 무엇을 보일 수 있냐
면,
dual function [g(α )] 는 언제나 primal function f(β ∗ ) 보다 항상 작거나 같다.
g(α) ≤ f(β ∗ )
dual function g(α) 함수를 α 에 대해서 최대화를 시키면, 그것이 원래 목적 함수의 Best lower bound ( 가장 최적의 하
한 ) 인 것이다.
α∗ = argmaxα g(α)
Solution 정리
일반적으로 우리가 f 목적 함수가 convex 인 경우에는 이 두 개가 같아 진다.
그래서 이것을 Dual Problem 이라고 한다.
1 번 방법
2번 방법
라그랑지 방법을 이용해서 dual function 을 정의 한 후에 아래와 같이 정의 하고 푼다.
컨디션을 유도, 이것을 바탕으로 primal problem 을 풀거나, dual problem 을 다시 유도해서 푸는 두 가지를 왓
KKT
다갔다 하면서 풀게 된다. 이 아이디어를 SVM 에 적용해서 보자.
이와 같이 정의가 된다.
이 때, 앞에서 말해 왔던 βˉ 와, Primal variable 는 무엇이냐면,
β → [βˉ, β0 , ξ1 , ⋯ , ξn ] → primal variable
② constraint 부분에 대입
n
∑ αi hi (β ) = 1 − ξi − yi (β0 + βˉT x
ˉi )
i=1
1 − ξi − yi (β0 + βˉT x
ˉi ) ≤ 0, −ξi ≤ 0
n
∑ αi {1 − yi (β0 − βˉT x
ˉi ) − ξi }, where h1i = {1 − yi (β0 − βˉT x
ˉi ) − ξi }
i=1
따라서 ①, ②, ③ 을 취합 하면,
Primal variable 는
βˉ, β0 , ξ1 , ⋯ , ξn
이므로 이 변수들로
n n n
1 ˉT ˉ
L(β , α) = β β + C ∑ ξi + ∑ αi {1 − yi (β0 − βˉT x
ˉi ) − ξi } − γi ∑ ξi
2
i=1 i=1 i=1
미분을 해서 0 을 놓는다.
βˉ (vector) 미분
n n
∂
L(β , α) = βˉ − ∑ αi yi x
ˉi = 0 ⟶ ∑ αi yi x
ˉi = βˉ
∂βˉ i=1 i=1
β0 (constant) 미분
n
∂
L(β , α) = ∑ αi yi = 0
∂β0
i=1
ξi , (i = 1, ⋯ , n)
∂
L(β , α) = C − αi − γi = 0 ⟶ C − γi = αi
∂ξi
의 계산.
Linear SVM
따라서 이 조건을 만족하는 α, βˉ, β0 , ξi 가 결국에는 solution 이라는 것. 이 두 가지 조건, " Stationary &
Complementary lackness " 을 가지고 dual problem 을 정의해보자.
dual problem
Largrange 함수를 "primal variable" βˉ (vector) , β0 (constant) , ξi (constant) 에 대해서 minimize 한 것이다.
최적화 시킨 그 값을 집어넣은 값. 결국에는 원래의 식 에다가 Stationary condition 이 조건을 대입을 하면 "primal
variable" 은 β
ˉ (vector) , β0 (constant) , ξi (constant) 가 다 사라진다. (아마 당연할 듯) 즉, α 만 남는다. 그것이
dual 함수. 이 "Stationary" 를 만족하는 것이 optimal 한 솔루션. 이것의 constraint 를 라그랑지 함수에 집어넣으면,
그것이 dual 함수 g(α) 가 된다.
n n n
1
L(β , α) = βˉT βˉ + C ∑ ξi + ∑ αi {1 − yi (β0 − βˉT x
ˉi ) − ξi } − γi ∑ ξi
2
i=1 i=1 i=1
C − γi = αi
→ C ∑ni=1 ξi − ∑ni=1 αi ξi − ∑ni=1 γi ξi = 0
∑ni=1 αi yi = 0
→ ∑ni=1 αi yi β0 = β0 ∑ni=1 αi yi = 0
이 제약은 살아 있어서 이 두개의 constraint 를 만족 하면서 dual function 의 maximize 하면 이 문제를 풀 수 있게 된다.
그런데 이 문제를 이렇게 만들면, 이 문제는 사실은 Optimization Problem 에서 가장 일반적인 형태중의 하나인
Quadratic Programming 이라는 그런 형태의 문제.
Quadratic Programming
차 함수. α 에 대한 2차 함수. 제약(constraint) 은 선형. 굉장히 standard 한 것이어서 이것을 푸
Objective function : 2
는 알고리즘은 모든 언어에 다 있다. Solver 가 다 있다.
1 T ˉ∗ ˉ ∗ = yi yj x
→ maxαˉ (1ˉT α
ˉ− αˉ K αˉ ), K ij ˉTi x
ˉj
2
1 T ˉ∗
(⇔ minαˉ (−1ˉT α
ˉ+ α ˉ K α ˉ ))
2
Constraint 부분도 Vector 로 표현, αˉ 가 component-wise (element-wise)
Constraint 1 : 0ˉ ≤ αi ≤ C 1ˉ, (i = 1, ⋯ , n),
n
Constraint 2 : ∑ αi yi = 0, yˉT α
ˉ = 0, (⇔ 0 ≤ yˉT α ≤ 0)
i=1
library(kernlab)
# Toy Example
set.seed(2)
n <- 20
x1 <- rnorm(n)
x2 <- rnorm(n)
x <- cbind(x1, x2)
beta <- c(1,1)
를 주려면
# separable case. - Standard deviation : 0
e <- rnorm(n, 0, 0)
# x 와 beta의 곱을 계산을 해서 그것의 sign 으로 를 결정한다.
y
y <- sign(c(x %*% beta + e))
# plot
plot(x1, x2, type = "n", main = "SVM")
plot(x1, x2, type = "n", main = "SVM")
points(x[y == 1, 1], x[y == 1, 2], col = 2)
points(x[y ==-1, 1], x[y ==-1, 2], col = 4)
# true hyperplane
abline(a = 0, b = -1, lty = 2, col = 1, lwd = 2)
Linear SVM
ˉ ∗ = yi yj x
K ˉTi x
ˉj
ij
1 T ˉ∗
minαˉ (−1ˉT α
ˉ+ α ˉ K αˉ)
2
subject to 0ˉ ≤ α
ˉ ≤ C 1ˉ, 0ˉ ≤ yˉT α
ˉ ≤ 0ˉ
사실 kernlab 이라는 패키지는 SVM 을 비롯한 여러가지 Kernel 머신에 대해서 풀어주는 패키지.
SVM 을 풀 수 있는 Quadratic Programming Solver 를 가지고 있다.
## SVM
# cost parameter
C <- 1
# QP
K <- x %*% t(x)
K.star <- K * (y %*% t(y))
# solution
alpha <- obj@primal
round(alpha, 3)
1 0.000 0.000 0.000 0.000 1.000 0.000 0.000 1.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 0.000
0.385 0.615 1.000 1.000
α 는 C 를 1 로 잡아 주었으므로 0 ~ 1 사이에서 왔다 갔다 한다.
n
∑ αi yi x
ˉi = βˉ
i=1
# beta
beta <- apply(y * alpha * x, 2, sum)
beta
값은 1, 1 인데?
? TRUE
이 값이 다른 것이 중요한 것이 아니라,
β0 + β1 x1 + β2 x2 = 0
이 식으로 보면
1 ⋅ x1 + 1 ⋅ x2 = 0 or 1.265 ⋅ x1 + 1.295 ⋅ x2 = 0
는 이것을 만족한다. 이것이 왜 Support vector 이냐면, Margin 의 점이 각 집단을 받치고 있기 때문이
Support vector
다. Margin 이 항상 1 이다.
yi (β0 + βˉT X
ˉ i ) ≥ 1 − ξi , ξi > 0, i = 1, ⋯ , n
대부분은 '0' 또는 'C' boundary 에 붙어 있는데, 몇 개는 이 사이에 들어온다. 그것이 Support Vector이다. Support
Vector가 그런 것을 만족하는 이유는 Complementary Slackness 때문이다.
n
αi {1 − yi (β0 − βˉT X
ˉ i ) − ξi } = 0, γi ∑ ξi = 0
i=1
이것이 의미하는 것은
1 0.000 0.000 0.000 0.000 1.000 0.000 0.000 1.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 0.000
0.385 0.615 1.000 1.000
여기서 대부분 0 과 1 인데, 단 2 개만 0 < αk < 1 을 갖는다. 0.385 0.615 이 두점이 Support Vector 라는 것이다. 여
기서는 x17 , x18 점이 support vector 가 된다. 이 두 개의 값에 대해서는 아래와 같은 식이 만족하므로,
ˉk
Support Vectors : x → yk (β0 + βˉT x
ˉk ) = 1
# intercept: beta0
temp <- y[sv.index] - x[sv.index,] %*% beta
temp
# 다 같은 값이 나와야 하는데 고쳐보자
? .
[,1]
[1,] 0.1028307
[2,] 0.1240077
[3,] 0.1240077
TRUE : 검은색 직선
Support Vector : 녹색 점선.
Margin : 녹색 점선 과 실선 사이의 거리.
검은 점 : 13, 17, 18
Separable 하지 않은 것을 그려보면 e : error term 을 0, 2 로 만들어서 noise 때문에 아래와 같이 넘어가게 된다.
library(kernlab)
# Toy Example
# plot
plot(x1, x2, type = "n", main = "SVM")
plot(x1, x2, type = "n", main = "SVM")
points(x[y == 1, 1], x[y == 1, 2], col = 2)
points(x[y ==-1, 1], x[y ==-1, 2], col = 4)
# true hyperplane
abline(a = 0, b = -1, lty = 2, col = 1, lwd = 2)
## SVM
# cost parameter
C <- 1
# QP
K <- x %*% t(x)
K.star <- K * (y %*% t(y))
# solution
alpha <- obj@primal
round(alpha, 10)
# beta
beta <- apply(y * alpha * x, 2, sum)
beta
x1 x2
0.6844195 1.0523673
# support vectors
eps <- 1.0e-7
sv.index <- which(eps < alpha & alpha < (C-eps))
sv.index
1 2 7 12 13
# intercept: beta0
temp <- y[sv.index] - x[sv.index,] %*% beta
temp
[1,] 0.136248274
[2,] 0.013233075
[3,] -0.007594213
[4,] 0.136248210
[1] 0.06953384
TRUE : 검은색 직선
Support Vector : 녹색 점선.
Margin : 녹색 점선 과 실선 사이의 거리.
검은 점 : 2 7 12 13
https://stats.stackexchange.com/questions/90736/the-difference-of-kernels-in-svm
linear: K(X, Y ) = X T Y
polynomial : K(X, Y ) = (γ ⋅ X T Y + r)degree , γ > 0, r : coef 0
radial basis: K(X, Y ) = exp(∣∣X − Y ∣∣2 /2σ 2 ) ∼ exp(−γ ⋅ ∣∣X − Y ∣∣2 ), γ > 0
sigmoid: K(X, Y ) = tanh(γ ⋅ X T Y + r), r : coef 0