에듀테크 프로젝트 대시보드
서포트 벡터 머신 (SVM)
두 그룹을 나누는 직선은 무수히 많습니다. 서포트 벡터 머신은 그중에서 양쪽 점들로부터 가장 멀리 떨어진 직선 하나를 고릅니다. 경계선을 중심으로 가장 넓은 도로(마진)를 놓고, 그 도로의 가장자리에 닿는 소수의 점들만이 경계를 결정합니다. 이 점들을 서포트 벡터라고 부릅니다. 1990년대 Vapnik 등이 정립했고, 딥러닝 이전까지 가장 강력한 분류기였습니다.
아래 세 직선은 모두 파랑과 빨강을 완벽히 나눕니다. 하지만 (a)와 (c)는 한쪽 그룹에 아슬아슬하게 붙어 있어, 새 데이터가 조금만 흔들려도 틀리기 쉽습니다. (b)처럼 양쪽에서 똑같이 여유를 둔 직선이 가장 안전합니다. SVM은 "여유"를 수학적으로 정의된 마진(margin)으로 보고, 그 마진을 최대화합니다.
경계선을 w·x + b = 0 이라 하면, 도로의 양쪽 가장자리는
w·x + b = +1 과 w·x + b = −1 입니다.
이 두 선 사이의 거리, 즉 마진 폭은 정확히
이므로 마진을 넓히는 것은 ‖w‖ 를 작게 만드는 것과 같습니다.
동시에 모든 점이 도로 밖(또는 가장자리)에 있어야 하므로
yᵢ (w·xᵢ + b) ≥ 1 조건을 지켜야 합니다 (y = ±1).
# 하드 마진 SVM — 제약이 있는 최적화 문제 minimize (1/2) · ‖w‖² subject to y_i · (w·x_i + b) ≥ 1 for all i
yᵢ(w·xᵢ + b) = 1 을 만족하는, 즉
도로 가장자리에 정확히 닿는 점들입니다. 나머지 점은 아무리 옮겨도(도로 밖인 한)
경계가 바뀌지 않습니다. 그래서 SVM 모델은 서포트 벡터 몇 개로 완전히 요약됩니다.
현실 데이터는 노이즈 때문에 직선 하나로 완벽히 나눌 수 없는 경우가 많습니다.
이때 각 점에 "규칙을 어긴 정도" ξᵢ ≥ 0(슬랙 변수)을 허용하고,
그 벌점의 합을 목적함수에 더합니다. 힌지 손실로 쓰면 이렇게 됩니다.
# 소프트 마진 SVM (힌지 손실 형태) minimize (λ/2)·‖w‖² + (1/n)·Σ max(0, 1 − y_i·(w·x_i + b)) # └ 마진 넓히기 ┘ └──── 규칙 위반 벌점(힌지) ────┘
| C 값 (= 위반에 대한 벌점 크기) | 마진 | 성격 |
|---|---|---|
| C 작음 (규제 강함) | 넓음 | 이상치 무시, 부드러운 경계 — 과소적합 위험 |
| C 큼 (벌점 강함) | 좁음 | 모든 점을 맞추려 함 — 과적합 위험 |
C 는 "마진을 넓게 vs 실수를 적게" 사이의 손잡이입니다. 교차 검증으로 고릅니다.
캔버스를 클릭하면 파랑(+1) 점, Shift+클릭(또는 오른쪽 클릭)은 빨강(−1) 점을 추가합니다. 이미 있는 점은 드래그로 옮길 수 있습니다. 학습을 누르면 경사하강법(Pegasos)이 경계선(흰 선)과 도로 가장자리(점선)를 움직입니다. 노란 테두리가 붙은 점이 서포트 벡터입니다.
for t in range(STEPS): (x, y) = 무작위 샘플 margin = y * (w·x + b) if margin < 1: # 도로 안이거나 반대편 → 벌점 발생 w = w - η * (λ*w - y*x) b = b + η * y else: # 도로 밖 → ‖w‖만 살짝 줄임 w = w - η * (λ*w) # λ ≈ 1 / C, η 는 스텝이 갈수록 작아짐
아래 1차원 데이터는 가운데는 파랑, 바깥은 빨강이라 직선(임계값) 하나로 나눌 수 없습니다.
그런데 각 점 x 를 φ(x) = (x, x²) 로 한 차원 끌어올리면,
파랑은 아래쪽, 빨강은 위쪽에 모여 직선 하나로 깔끔히 갈립니다.
커널은 이 "끌어올리기"를 실제 좌표 계산 없이
K(a, b) = φ(a)·φ(b) 라는 내적 공식만으로 처리하는 기법입니다.
현재: 1차원 — 파랑(안쪽)과 빨강(바깥쪽)을 가르는 임계값이 존재하지 않습니다.
자주 쓰는 커널: 선형 a·b, 다항식 (a·b + 1)ᵈ,
RBF(가우시안) exp(−γ‖a−b‖²). RBF는 사실상 무한 차원으로 올리는 것과 같아
아주 복잡한 경계도 만들 수 있습니다 (대신 γ 가 크면 과적합).
2/‖w‖