서포트 벡터 머신
고친 사람 github-actions[bot]
서포트 벡터 머신은 데이터를 두 무리로 가르는 경계를 배웁니다. 지난 메일을 스팸과 정상으로 나눠 주면 둘 사이를 가르는 선을 찾고, 새 메일이 그 선의 어느 쪽에 떨어지는지로 판정하는 식입니다. 가를 수 있는 경계가 여럿이면 양쪽 무리에서 가장 멀리 떨어진 것을 고릅니다. 간격을 넓게 두는 만큼 처음 보는 데이터에서 덜 틀리는 편입니다.
쉽고 빠른 이해
두 무리 사이에 가장 넓은 길을 냅니다. 링크 수와 느낌표 수로 스팸과 정상 메일을 가를 때, 두 무리 사이에 길을 내고 그 한가운데 선을 경계로 삼는 식입니다.
길이 좁으면 경계 바로 옆에 붙은 메일이 생깁니다. 그런 메일과 닮은 새 메일은 조금만 달라도 반대쪽으로 넘어갑니다. 길을 넓게 내면 새 메일이 조금 달라도 판정이 덜 바뀝니다.
- 지난 메일을 하나씩 평면에 점으로 찍습니다. 가로축은 링크 수, 세로축은 느낌표 수입니다.
- 두 무리 사이에 낼 수 있는 가장 넓은 길을 찾습니다. 길 가장자리에 닿은 몇 개의 점이 길을 정합니다.
- 새 메일은 길 한가운데 선의 어느 쪽에 떨어지는지로 판정합니다.
곧은 길이 안 나는 데이터도 있습니다. 그럴 때는 점마다 숫자 하나를 더 계산해 높이로 삼습니다. 두 무리가 서로 다른 높이에 놓이면 그 사이에 평평한 판을 끼워 가를 수 있습니다.
특성은 많은데 데이터 수는 그리 많지 않은 문제에 잘 맞습니다. 단어마다 특성 하나를 두는 문서 분류가 그런 예입니다.
대가는 시간과 해석입니다. 데이터가 많아지면 훈련이 급격히 느려집니다. 곧지 않은 경계는 왜 그렇게 판정했는지 사람이 읽기 어렵습니다.
상세
SVM(Support Vector Machine, 서포트 벡터 머신)은 머신러닝에서 분류를 푸는 방법입니다. 분류는 입력 하나를 정해진 무리 가운데 하나로 보내는 일입니다. 메일을 스팸과 정상으로 가르는 일이 분류입니다.
무리가 둘뿐인 분류를 이진 분류라고 부릅니다. SVM 의 기본형은 이진 분류를 풉니다. 무리가 셋 이상인 경우는 뒤의 소절에서 따로 봅니다.
SVM 에 넣는 것은 과거 기록을 모은 표입니다. 이 표를 훈련 데이터라고 부릅니다. 표의 한 줄은 예를 들어 메일 한 통입니다.
표의 칸은 두 종류입니다. 메일을 묘사하는 숫자를 특성이라고 부릅니다. 메일에 든 링크 수나 느낌표 수가 특성입니다.
맞혀야 할 답은 레이블이라고 부릅니다. 그 메일이 스팸인지 정상인지가 레이블입니다. SVM 은 이 표에서 두 무리를 가르는 경계를 배웁니다. 새 메일이 오면 경계의 어느 쪽에 떨어지는지로 답을 냅니다.
이 절은 메일 여섯 통짜리 훈련 데이터 하나를 끝까지 들고 갑니다. 이 표로 경계를 고르는 기준, 경계를 정하는 점, 훈련이 푸는 문제를 차례로 봅니다. 그다음 데이터가 겹칠 때와 곧은 선으로 안 갈릴 때를 봅니다.
메일 여섯 통의 훈련 데이터
특성은 링크 수와 느낌표 수 둘입니다. 레이블은 스팸인지 정상인지입니다.
| 메일 | 링크 수 | 느낌표 수 | 레이블 |
|---|---|---|---|
| A | 1 | 1 | 정상 |
| B | 2 | 1 | 정상 |
| C | 1 | 2 | 정상 |
| D | 3 | 3 | 스팸 |
| E | 4 | 3 | 스팸 |
| F | 3 | 4 | 스팸 |
특성이 둘이라 메일 한 통을 평면 위 점 하나로 찍을 수 있습니다. 가로축에 링크 수, 세로축에 느낌표 수를 둡니다. 정상 메일 셋은 왼쪽 아래에 모입니다. 스팸 셋은 오른쪽 위에 모입니다.
quadrantChart
x-axis "링크 수 0" --> "링크 수 5"
y-axis "느낌표 수 0" --> "느낌표 수 5"
"A 정상": [0.2, 0.2]
"B 정상": [0.4, 0.2]
"C 정상": [0.2, 0.4]
"D 스팸": [0.6, 0.6]
"E 스팸": [0.8, 0.6]
"F 스팸": [0.6, 0.8]
그림의 가로세로는 0 에서 5 까지입니다. 가운데 십자선은 차트가 칸을 나누려고 긋는 선일 뿐 경계가 아닙니다.
이처럼 숫자 여러 개를 한 줄로 묶은 것을 벡터라고 부릅니다. 메일 A 는 벡터 (1, 1) 입니다. 이름에 든 「벡터」가 이 뜻입니다. SVM 은 훈련 데이터의 줄 하나하나를 벡터, 곧 공간 속의 점으로 다룹니다.
두 무리를 가르는 후보 선
여섯 점을 가르는 곧은 선은 셀 수 없이 많습니다. 정상 셋을 한쪽에, 스팸 셋을 다른 쪽에 두기만 하면 됩니다. 아래 표는 그중 셋을 골라 각 선에서 가장 가까운 메일까지 거리를 잰 것입니다.
| 후보 | 선 | 가장 가까운 메일 | 거리 |
|---|---|---|---|
| 가 | 링크 수 = 2.5 | B · D · F | 0.5 |
| 나 | 링크 수 + 느낌표 수 = 3.5 | B · C | 약 0.35 |
| 다 | 링크 수 + 느낌표 수 = 4.5 | B · C · D | 약 1.06 |
거리는 점에서 선까지 수직으로 잰 길이입니다. 세 선 모두 훈련 데이터 여섯 통을 다 맞힙니다.
그런데 「나」는 정상 메일 B · C 에 바짝 붙어 있습니다. 링크 하나에 느낌표 셋인 정상 메일 (1, 3) 이 새로 오면 「나」는 스팸으로 판정합니다. 「다」는 같은 메일을 정상으로 판정합니다. 경계가 데이터에서 멀수록 이런 작은 차이에 덜 흔들립니다.
마진과 서포트 벡터
평면에서 판정이 바뀌는 선을 결정 경계라고 부릅니다. 결정 경계에서 가장 가까운 점까지의 거리를 마진이라고 부릅니다. 앞 표의 「거리」 칸이 후보마다의 마진입니다.
SVM 은 마진이 가장 큰 결정 경계를 고릅니다. 여섯 통에서는 「다」가 그 선입니다. 이 성질 때문에 SVM 을 최대 마진 분류기라고도 부릅니다.
결정 경계와 나란하게 양쪽으로 마진만큼 떨어진 선을 하나씩 더 그으면 길 하나가 생깁니다. 길 가장자리에 닿는 점은 B · C · D 입니다. 이 점들을 서포트 벡터라고 부릅니다. 경계를 떠받치는(support) 벡터라는 뜻입니다.
flowchart TD
S["스팸 쪽 · E · F"] --- U["스팸 쪽 길 가장자리 · 링크 수 + 느낌표 수 = 6 · D"]
U --- M["결정 경계 · 링크 수 + 느낌표 수 = 4.5"]
M --- L["정상 쪽 길 가장자리 · 링크 수 + 느낌표 수 = 3 · B · C"]
L --- N["정상 쪽 · A"]
그림은 길을 위에서 아래로 가로지른 모습입니다. 정상 쪽 가장자리는 링크 수 + 느낌표 수 = 3 인 선이고, 스팸 쪽 가장자리는 링크 수 + 느낌표 수 = 6 인 선입니다. 서포트 벡터 B · C 와 D 가 각각 그 위에 있습니다. 나머지 A · E · F 는 길 밖으로 더 물러나 있습니다.
결정 경계를 정하는 것은 서포트 벡터뿐입니다. A · E · F 를 지워도 가장 넓은 길은 바뀌지 않습니다. 반대로 B 를 조금만 옮겨도 길의 폭과 방향이 바뀝니다.
경계를 적는 식
곧은 선은 식 하나로 적을 수 있습니다. SVM 은 결정 경계를 점수 식으로 적습니다. 특성마다 붙는 무게 w 와 선을 옮기는 값 b 가 식을 이룹니다.
점수(x) = w₁ × x₁ + w₂ × x₂ + b
x₁ 은 링크 수, x₂ 는 느낌표 수입니다. 점수가 0 보다 크면 스팸, 작으면 정상입니다. 점수가 0 인 점들이 결정 경계입니다.
같은 선은 식 전체에 같은 수를 곱해도 그대로입니다. 링크 수 + 느낌표 수 − 4.5 = 0 에 2/3 를 곱하면 2/3 × 링크 수 + 2/3 × 느낌표 수 − 3 = 0 이 됩니다. 두 식은 같은 선 「다」를 가리킵니다.
SVM 은 이 여러 배수 가운데 서포트 벡터에서 점수가 꼭 +1 이나 −1 이 되는 것을 고릅니다. 「다」에서는 w 가 (2/3, 2/3), b 가 −3 일 때 그렇습니다. 메일 넷의 점수를 구하면 아래와 같습니다.
w = (2/3, 2/3)
b = -3
def score(x):
return w[0]*x[0] + w[1]*x[1] + b
score((3, 3)) # 1.0 스팸 쪽 가장자리
score((2, 1)) # -1.0 정상 쪽 가장자리
score((4, 3)) # 약 1.67 스팸
score((1, 1)) # 약 -1.67 정상
서포트 벡터 D 와 B 는 점수가 꼭 1 과 −1 입니다. 크기를 그렇게 맞췄으니 앞 그림에 점수를 붙이면 스팸 쪽 가장자리가 +1, 결정 경계가 0, 정상 쪽 가장자리가 −1 입니다. E 와 A 는 가장자리보다 더 바깥이라 점수의 크기가 1 을 넘습니다.
w₁ × x₁ + w₂ × x₂ 처럼 두 벡터의 같은 칸끼리 곱해 더한 값을 내적이라고 부릅니다. w · x 로 줄여 적습니다. 특성이 천 개면 칸 천 개를 곱해 더합니다.
특성이 셋이면 결정 경계는 선이 아니라 평평한 판이 됩니다. 특성이 더 많으면 그림으로 못 그리지만 식의 꼴은 같습니다. 이런 경계를 통틀어 초평면이라고 부릅니다.
훈련이 푸는 최적화 문제
크기를 이렇게 맞추면 마진을 w 로 바로 적을 수 있습니다. w 의 길이를 ‖w‖ 로 적습니다. 칸마다 제곱해 더한 뒤 제곱근을 씌운 값입니다. 「다」에서는 √((2/3)² + (2/3)²) 라 약 0.94 입니다.
점수는 경계에서 1 만큼 멀어질 때마다 ‖w‖ 만큼 커집니다. 가장자리는 점수가 1 인 곳이니, 경계에서 가장자리까지의 거리는 1 ÷ ‖w‖ 입니다. 「다」에서는 1 ÷ 0.94 로 약 1.06 이고, 앞 표의 마진과 같습니다.
그래서 마진을 가장 크게 하는 일은 ‖w‖ 를 가장 작게 하는 일과 같습니다. ‖w‖ 는 0 이상이라 그 제곱 ‖w‖² 를 가장 작게 해도 같은 답이 나옵니다. 제곱근이 없는 쪽이 다루기 쉬워 훈련은 제곱을 씁니다.
이때 레이블을 숫자로 바꿔 스팸은 +1, 정상은 −1 로 적습니다. 훈련은 아래 문제를 풉니다.
목표 ‖w‖² 를 가장 작게
조건 훈련 데이터의 모든 점에서 레이블 × 점수 ≥ 1
조건은 모든 점이 자기 쪽 길 가장자리 바깥에 있으라는 뜻입니다. 스팸은 점수가 1 이상, 정상은 −1 이하여야 합니다.
이 문제는 볼록 최적화 문제입니다. 볼록 문제는 바닥이 하나뿐인 그릇 모양입니다. 찾은 바닥이 곧 전체에서 가장 낮은 지점입니다. 그래서 같은 데이터로 몇 번을 훈련해도 같은 경계가 나옵니다.
목표는 이차식입니다. ‖w‖² 는 w 의 칸을 제곱해 더한 값이기 때문입니다. 조건은 일차식입니다. 이런 문제는 이차 계획법으로 풉니다.
신경망의 훈련은 바닥이 여럿인 문제라 시작점에 따라 다른 답에 닿습니다. SVM 은 그런 일이 없습니다.
겹친 데이터를 다루는 소프트 마진
현실의 데이터는 이렇게 깔끔하게 갈리지 않습니다. 여섯 통에 링크 하나, 느낌표 하나인 스팸 메일 G 가 더해졌다고 해 봅시다. G 는 정상 메일 A 와 같은 점에 놓입니다.
이제 정상과 스팸을 완전히 가르는 곧은 선은 없습니다. 앞의 조건을 지킬 수 없으니 훈련 문제에 답이 없습니다. 모든 점을 길 밖에 두라는 앞의 방식을 하드 마진이라고 부릅니다.
그래서 조건을 어기는 것을 허용합니다. 대신 어긴 만큼 벌점을 매깁니다. 이 방식을 소프트 마진이라고 부릅니다. 목표는 ‖w‖² 와 벌점의 합을 가장 작게 하는 것이 됩니다.
틀린 정도를 숫자로 매기는 함수를 손실 함수라고 합니다. SVM 의 벌점은 점이 자기 쪽 가장자리를 넘어 들어온 만큼입니다. 이 손실 함수를 힌지 손실이라고 부릅니다.
def hinge(label, s):
return max(0, 1 - label * s)
hinge(+1, 1.67) # 0 가장자리 바깥
hinge(+1, 0.5) # 0.5 길 안쪽
hinge(+1, -1.0) # 2.0 반대쪽
label 은 레이블, s 는 점수입니다. 스팸이 자기 쪽 가장자리 바깥에 있으면 벌점이 0 입니다. 길 안으로 들어오거나 반대쪽으로 넘어가면 깊이 들어온 만큼 벌점이 커집니다.
xychart-beta
title "레이블 × 점수에 따른 벌점"
x-axis "레이블 × 점수" ["-2", "-1.5", "-1", "-0.5", "0", "0.5", "1", "1.5", "2"]
y-axis "벌점" 0 --> 3
line [3, 2.5, 2, 1.5, 1, 0.5, 0, 0, 0]
선이 꺾이는 1 이 자기 쪽 가장자리입니다. 그 오른쪽은 가장자리 바깥이라 벌점이 없습니다. 왼쪽으로 갈수록 벌점이 곧게 늘어납니다.
소프트 마진에서는 길 안이나 반대쪽에 들어온 점도 서포트 벡터가 됩니다. 이 점들도 경계를 끌어당기기 때문입니다. 길 밖의 점은 여전히 경계에 아무 영향이 없습니다.
마진과 벌점의 저울 C
마진을 넓히는 일과 벌점을 줄이는 일은 서로 부딪칩니다. 길을 넓히면 길 안에 들어오는 점이 늘어납니다. 둘 중 어느 쪽을 무겁게 볼지를 정하는 값이 C 입니다. C 는 벌점의 합에 곱하는 값이라, 목표는 ‖w‖² + C × 벌점의 합이 됩니다.
| C | 길의 폭 | 훈련 데이터를 대하는 태도 |
|---|---|---|
| 크다 | 좁다 | 벌점이 비싸서 거의 다 맞히려 든다 |
| 작다 | 넓다 | 몇 개 틀리는 것을 받아들이고 길을 넓힌다 |
C 가 너무 크면 튀는 점 하나를 맞히려고 경계의 기울기와 위치가 크게 흔들립니다. 훈련 데이터의 우연한 흔들림까지 외워 새 데이터에서 틀리는 현상을 과적합이라고 부릅니다. C 가 너무 작으면 반대로 맞힐 수 있는 점까지 놓칩니다.
C 는 데이터에서 배우는 값이 아니라 사람이 훈련 전에 정합니다. 이런 설정값을 하이퍼파라미터라고 부릅니다.
C 는 보통 후보 몇 개로 훈련해 보고 고릅니다. 훈련 데이터를 몇 조각으로 나눠 한 조각씩 돌아가며 시험용으로 떼어 두고 점수를 견줍니다. 이 방법을 교차 검증이라고 합니다.
곧은 선으로 안 갈리는 데이터
이번에는 메일을 떠나 좌표만 있는 점 여덟 개로 봅니다. x₁ 은 가로 좌표, x₂ 는 세로 좌표입니다. 한 무리는 가운데 모입니다. 다른 무리는 그 둘레를 고리 모양으로 감쌉니다.
| 무리 | 점 | x₁² + x₂² |
|---|---|---|
| 안쪽 | (1, 0) · (0, 1) · (−1, 0) · (0, −1) | 1 |
| 고리 | (2, 0) · (0, 2) · (−2, 0) · (0, −2) | 4 |
이 여덟 점은 어떤 곧은 선으로도 못 가릅니다. 어디에 선을 그어도 고리의 점이 양쪽에 걸립니다.
여기에 셋째 특성으로 x₁² + x₂² 를 더해 봅니다. 표의 오른쪽 칸입니다. 이 값을 높이로 삼아 점을 3차원으로 올립니다. 안쪽 점은 높이 1, 고리 점은 높이 4 에 놓입니다.
xychart-beta
title "x₂ = 0 줄의 네 점을 옆에서 본 높이"
x-axis "x₁" ["-2", "-1", "1", "2"]
y-axis "높이 x₁² + x₂²" 0 --> 5
bar [4, 1, 1, 4]
line [2.5, 2.5, 2.5, 2.5]
그림은 가로줄 x₂ = 0 에 놓인 네 점을 옆에서 본 모습입니다. 막대가 점의 높이, 가로선이 높이 2.5 입니다. 고리 점 (−2, 0) · (2, 0) 은 가로선 위에, 안쪽 점 (−1, 0) · (1, 0) 은 아래에 놓입니다.
3차원에서는 높이 2.5 의 평평한 판이 두 무리를 가릅니다. 이 판을 평면으로 되돌리면 x₁² + x₂² = 2.5 인 원이 됩니다. 평면에서 보면 곡선 경계가 생긴 것입니다.
특성을 이렇게 늘려 옮긴 공간을 특성 공간이라고 부릅니다. 특성 공간에서 곧은 경계를 그으면 원래 공간에서는 곡선 경계가 됩니다.
커널 트릭
특성을 늘리면 계산이 무거워집니다. 특성끼리 곱하거나 제곱해 만든 값을 이차 조합이라고 부릅니다. 특성이 둘이면 x₁², x₂², x₁x₂ 셋입니다. 앞 소절의 셋째 특성 x₁² + x₂² 도 이 가운데 둘을 더한 것입니다.
어느 조합이 쓸모 있을지 모르면 다 넣어 봐야 합니다. 특성이 백 개면 이차 조합이 오천 개를 넘습니다.
다행히 SVM 은 점의 좌표 없이 두 점 사이의 내적만으로 예측할 수 있습니다. 훈련이 구하는 w 를 훈련 데이터의 무게 합으로 적을 수 있기 때문입니다.
w = Σ αᵢ × 레이블ᵢ × 점ᵢ
Σ 는 훈련 데이터의 점마다 구한 값을 모두 더하라는 기호입니다. αᵢ 는 훈련이 점마다 정하는 무게입니다. 서포트 벡터가 아닌 점은 α 가 0 이라 합에서 빠집니다. 이 w 를 점수 식 w · x + b 에 넣으면 점수는 서포트 벡터와 x 의 내적에 무게를 곱해 더한 값이 됩니다.
훈련 문제도 w 대신 α 를 구하는 꼴로 바꿔 쓸 수 있습니다. 바꾼 문제에서 데이터는 두 점 사이의 내적으로만 나옵니다. 이렇게 바꾼 문제를 쌍대 문제라고 부릅니다. 그래서 옮긴 공간의 좌표를 만들지 않고 내적만 구할 수 있으면 됩니다.
아래 코드는 점 둘을 옮긴 뒤 내적을 구한 값과, 옮기지 않고 구한 값을 견줍니다. phi 는 점을 이차 조합 셋으로 옮기는 함수입니다. 가운데 칸의 √2(코드의 2**0.5)는 옮긴 뒤의 내적이 원래 내적의 제곱과 꼭 맞도록 붙인 값입니다.
def phi(x):
return (x[0]**2, 2**0.5*x[0]*x[1], x[1]**2)
def dot(a, b):
return sum(p*q for p, q in zip(a, b))
x, z = (1, 2), (3, 1)
dot(phi(x), phi(z)) # 약 25 옮긴 뒤 내적
dot(x, z) ** 2 # 25 옮기지 않고
두 값이 같습니다. 원래 공간의 내적을 제곱하기만 해도 옮긴 공간의 내적이 나옵니다. 특성이 백 개여도 곱셈 백 번과 제곱 한 번이면 끝납니다.
이처럼 옮긴 공간의 내적을 옮기지 않고 구하는 함수를 커널 함수라고 부릅니다. SVM 의 식에서 내적을 커널 함수로 바꿔 끼우는 방법이 커널 트릭입니다. 운영체제의 커널과는 상관없는 이름입니다.
자주 쓰는 커널 함수는 셋입니다. 셋째의 RBF(Radial Basis Function, 방사 기저 함수) 커널은 가우시안 커널이라고도 부릅니다.
아래 식의 x 와 z 는 견주는 두 점입니다. c · d · γ 는 사람이 정하는 값입니다. ‖x − z‖ 는 두 점 사이의 거리입니다. exp 는 e 를 그만큼 거듭제곱하라는 뜻입니다.
| 커널 | 식 | 그리는 경계 |
|---|---|---|
| 선형 커널 | x · z | 곧은 선 · 평평한 판 |
| 다항식 커널 | (x · z + c)ᵈ | 곡선. 차수 d 가 클수록 더 구불구불하다 |
| RBF 커널 | exp(−γ × ‖x − z‖²) | 점 둘레를 감싸는 둥근 모양 |
RBF 커널의 γ 는 점 하나가 얼마나 멀리까지 영향을 주는지 정합니다. γ 가 크면 점마다 영향이 좁아져 경계가 점 하나하나를 감싸듯 구불거립니다. 그래서 γ 도 C 와 함께 교차 검증으로 고르는 하이퍼파라미터입니다.
새 점을 판정하는 식
커널을 쓰면 무게 w 를 직접 적을 수 없습니다. w 가 옮긴 공간에 있기 때문입니다. 대신 앞에서 본 무게 합의 꼴로 점수를 적고, 내적 자리에 커널 함수를 넣습니다.
점수(x) = Σ αᵢ × 레이블ᵢ × K(서포트 벡터ᵢ, x) + b
K 는 커널 함수입니다. K 가 선형 커널 x · z 이면 이 식은 처음의 점수(x) = w · x + b 와 같은 값을 냅니다. 곧은 경계의 식을 커널로 넓힌 것이 이 식입니다.
새 점 하나를 판정하려면 서포트 벡터마다 커널 값을 한 번씩 구합니다. 그래서 예측에 드는 시간은 서포트 벡터 수에 비례합니다. 서포트 벡터가 적을수록 판정이 빠릅니다.
훈련과 예측에 드는 시간
빅오 표기법은 입력이 늘 때 비용이 어떤 모양으로 따라 느는지 적는 약속입니다. 아래 표의 n 은 훈련 데이터의 줄 수입니다.
표의 커널 SVM 은 커널 함수를 넣어 쌍대 문제를 푸는 SVM 입니다. 선형 SVM 은 커널 없이 원래 특성 그대로 w 를 직접 구하는 SVM 입니다. 선형 커널을 넣은 커널 SVM 과 같은 곧은 경계를 찾지만, 점의 짝마다 커널 값을 구하지 않습니다.
| 단계 | 시간 | 메모리 |
|---|---|---|
| 커널 SVM 훈련 | 대개 O(n²) 와 O(n³) 사이 | 커널 값 표 O(n²) |
| 선형 SVM 훈련 | n × 특성 수에 비례하는 쪽에 가깝다 | 훈련 데이터만큼 |
| 예측 한 건 | O(서포트 벡터 수 × 특성 수) | 서포트 벡터만큼 |
커널 SVM 은 훈련 데이터의 점 두 개마다 커널 값을 씁니다. 점이 n 개면 짝이 n² 개쯤입니다. 점이 열 배로 늘면 커널 값 표는 백 배로 커집니다.
선형 SVM 은 짝마다 값을 구할 필요가 없어 데이터가 커져도 훨씬 덜 느려집니다. 그래서 데이터가 아주 많으면 선형 SVM 이나 다른 모델을 고릅니다.
특성 단위 맞추기
SVM 은 거리와 내적으로 경계를 정합니다. 그래서 특성의 단위가 결과를 흔듭니다.
링크 수는 0 에서 10 사이를 오간다고 해 봅시다. 메일 크기는 바이트로 수만을 오갑니다. 두 특성을 손대지 않고 넣으면 거리 대부분을 메일 크기가 차지합니다. 링크 수는 있으나 마나 한 특성이 됩니다.
훈련 전에 특성마다 평균과 흩어진 정도를 맞춥니다. 흩어진 정도는 표준편차로 잽니다. 흔히 평균 0 · 표준편차 1 로 맞춥니다. 이런 손질을 특성 스케일링이라고 부릅니다.
결정 트리는 이 손질이 필요 없습니다. 특성 하나를 기준값과 견주기만 하기 때문입니다. SVM 은 특성 여럿을 한 식에 섞으므로 단위를 맞춰야 합니다.
무리가 셋 이상일 때
SVM 은 무리 둘을 가릅니다. 무리가 셋 이상인 문제를 다중 분류라고 부릅니다. SVM 은 이진 분류기 여럿을 묶어 이 문제를 풉니다. 묶는 방법은 둘입니다.
| 방식 | 무리 k 개일 때 분류기 수 | 판정 |
|---|---|---|
| 일대다 | k | 「이 무리인가 나머지인가」를 가르는 분류기마다 점수를 내고 가장 높은 무리를 고른다 |
| 일대일 | k(k − 1) / 2 | 무리를 둘씩 짝지어 가르고 다수결로 고른다 |
무리가 열이면 일대다는 분류기 열 개, 일대일은 마흔다섯 개입니다. 일대일은 분류기가 많은 대신 하나하나가 두 무리의 데이터만 봐서 가볍습니다.
서포트 벡터 머신이 잘 맞는 데이터와 약한 데이터
지금까지 본 성질을 고르는 기준으로 모으면 아래와 같습니다.
| 성질 | 까닭 |
|---|---|
| 특성이 많아도 잘 버티는 편이다 | 경계가 서포트 벡터 몇 개로 정해지고, 마진을 넓히는 목표가 과적합을 누른다 |
| 훈련 결과가 하나로 정해진다 | 볼록 문제라 같은 데이터면 같은 경계가 나온다 |
| 데이터가 많으면 훈련이 가파르게 느려진다 | 커널 값 표가 n² 로 커진다 |
| 확률을 바로 내지 않는다 | 점수는 경계에서 떨어진 정도일 뿐 확률이 아니다. 확률이 필요하면 점수를 따로 바꿔야 한다 |
| 설정값에 결과가 크게 갈린다 | 커널 종류와 C · γ 를 사람이 골라야 한다 |
| 커널을 쓰면 읽기 어렵다 | 경계가 서포트 벡터 여럿의 합이라 사람이 읽는 규칙으로 못 옮긴다 |
「특성이 많아도 잘 버틴다」와 「데이터가 많으면 훈련이 가파르게 느려진다」를 합치면 쓸 곳이 보입니다. 특성은 많고 데이터는 그리 많지 않은 문제에 SVM 이 잘 맞습니다. 단어마다 특성 하나를 두는 텍스트 분류가 그런 예입니다. 단어가 수만 개라 특성도 수만 개입니다.
곧은 경계를 긋는다는 점에서 SVM 은 로지스틱 회귀와 닮았습니다. 로지스틱 회귀는 모든 점을 조금씩 반영합니다. 답으로 확률을 냅니다. SVM 은 경계 가까운 점만 보고 마진을 넓힙니다.
곧은 경계를 배우는 더 단순한 방법으로 퍼셉트론이 있습니다. 퍼셉트론은 훈련 데이터를 다 맞히는 선을 찾으면 멈춥니다. 그래서 앞의 「나」 같은 선에서 멈출 수도 있습니다. SVM 은 다 맞히는 선 가운데 마진이 가장 큰 선을 고릅니다.
관련 항목
서포트 벡터 머신이 속하는 상위 분류
머신러닝 · 지도학습 · 분류 · 이진 분류 · 모델 · 알고리즘
서포트 벡터 머신을 이루는 구성 요소
벡터 · 특성 · 레이블 · 결정 경계 · 초평면 · 마진 · 가중치 · 내적
서포트 벡터 머신을 훈련하는 최적화 방법
볼록 최적화 · 이차 계획법 · 라그랑주 승수 · 쌍대 문제 · SMO · 경사 하강법
서포트 벡터 머신의 과적합을 다스리는 방법
소프트 마진 · 힌지 손실 · 손실 함수 · 하이퍼파라미터 · 과적합 · 교차 검증 · 그리드 탐색 · 편향과 분산
서포트 벡터 머신이 곡선 경계를 그리는 커널
커널 트릭 · 커널 함수 · 선형 커널 · 다항식 커널 · RBF 커널 · 특성 공간
서포트 벡터 머신을 회귀와 다중 분류로 넓힌 변형
서포트 벡터 회귀 · 단일 클래스 SVM · 다중 분류 · 일대다 분류 · 일대일 분류
서포트 벡터 머신과 겨루는 다른 모델
로지스틱 회귀 · 퍼셉트론 · 결정 트리 · 랜덤 포레스트 · 최근접 이웃 · 나이브 베이즈 · 신경망
서포트 벡터 머신에 넣기 전의 데이터 손질
특성 스케일링 · 표준 점수 · 특성 공학 · 원-핫 인코딩 · 훈련 데이터
서포트 벡터 머신이 쓰이는 분류 작업
텍스트 분류 · 스팸 필터 · 이미지 분류 · 이상 탐지
서포트 벡터 머신을 구현한 라이브러리
scikit-learn · LIBSVM · LIBLINEAR
서포트 벡터 머신의 비용을 재는 잣대
다른 이름: support vector machine · SVM · 서포트 벡터 기계 · 지지 벡터 기계