검색
← 모듈 로드맵

서포트 벡터 머신과 커널

강의 · 준전문가 · KAITABASE 정리

마진 · 서포트 벡터 · 힌지 손실 · C · 커널 트릭 · RBF γ를 손계산과 실행으로 익히는 SVM

먼저 알아야 할 것

내적과 노름로지스틱 회귀 결정 경계정규화라그랑주 승수(개념)

다루는 내용

마진이 가장 넓은 경계를 찾는 SVM을 점 6개 예로 확인하며 마진 폭 2/‖w‖와 서포트 벡터의 뜻을 설명합니다. scikit-learn 문서의 원 · 쌍대 문제 식, 힌지 손실과 C의 역할, 다항 커널을 직접 내적과 비교한 커널 트릭, RBF 커널과 γ를 다룹니다. 반달 데이터에서 C와 γ를 바꾼 실행 결과로 과적합 · 과소적합을 읽습니다.

해설

서포트 벡터 머신과 커널

서포트 벡터 머신(Support Vector Machine, SVM)은 두 클래스를 가르는 경계선 중 양쪽 점들과의 여유(마진)가 가장 넓은 선을 고르는 분류기입니다. 경계는 경계 가까이에 있는 몇 개의 점(서포트 벡터)만으로 정해지고, 커널 트릭을 쓰면 곡선 경계도 같은 방법으로 학습할 수 있습니다. 이 수업은 점 6개로 최대 마진 경계를 직접 확인하고, 힌지 손실과 C, RBF 커널과 γ가 결과를 어떻게 바꾸는지 실행 결과로 봅니다.

항목내용
참고 자료scikit-learn 사용자 안내서 '1.4 Support Vector Machines' · scikit-learn.org/stable/modules/svm.html, SVC API 문서
트랙 · 수준머신러닝 · 중급
이 수업의 범위마진과 서포트 벡터, 하드 · 소프트 마진, 힌지 손실, C, 원 문제와 쌍대 문제(개념), 커널 트릭, 다항 · RBF 커널, γ, 스케일링, 장단점
먼저 알면 좋은 것내적과 노름, 로지스틱 회귀의 결정 경계, 정규화의 뜻, 라그랑주 승수(개념)

들어가기 전에

한눈에 보기

  • "마진이 가장 넓은 경계"가 왜 좋은지, 서포트 벡터가 무엇인지 압니다.
  • 마진 폭이 2/∥w∥2/\lVert w\rVert인 이유와 하드 · 소프트 마진 문제의 식을 읽습니다.
  • 힌지 손실을 직접 계산하고 C가 정규화의 역수 역할을 한다는 것을 압니다.
  • 커널 트릭이 "고차원으로 보내지 않고 고차원의 내적을 계산하는" 방법임을 숫자로 확인합니다.
  • RBF 커널의 γ와 C를 바꿔 가며 과적합 · 과소적합을 실행 결과로 봅니다.

1. 마진: 가장 넓은 길 내기

직관(해설용 비유): 두 마을 사이에 도로를 낸다고 합시다. 도로가 어느 쪽 집에도 닿지 않게 하면서 가장 넓게 내면, 나중에 새 집이 조금 어긋나게 지어져도 도로 안쪽을 침범할 가능성이 작습니다. SVM의 경계는 이 도로의 가운데 선이고, 도로 가장자리에 닿아 있는 집들이 서포트 벡터(support vector)입니다. 도로에서 먼 집은 옮겨도 도로가 바뀌지 않습니다.

경계와 도로 가장자리는 다음 세 직선입니다(라벨 y∈{−1,+1}y \in \{-1, +1\}).

w⊤x+b=0 (경계),w⊤x+b=±1 (가장자리),마진 폭=2∥w∥w^\top x + b = 0 \ (\text{경계}),\qquad w^\top x + b = \pm 1 \ (\text{가장자리}),\qquad \text{마진 폭} = \frac{2}{\lVert w\rVert}
기호뜻
ww경계에 수직인 방향 벡터(법선)
bb절편
∥w∥\lVert w\rVertww의 길이 — 작을수록 도로가 넓음
±1\pm 1가장자리를 1로 정하는 약속(크기 맞추기)

왜 2/∥w∥2/\lVert w\rVert인가: 점 xx에서 직선 w⊤x+b=0w^\top x + b = 0까지의 거리는 ∣w⊤x+b∣/∥w∥|w^\top x + b| / \lVert w\rVert입니다. 가장자리 위의 점은 ∣w⊤x+b∣=1|w^\top x + b| = 1이므로 경계까지 1/∥w∥1/\lVert w\rVert, 양쪽을 합치면 2/∥w∥2/\lVert w\rVert입니다. 예를 들어 w=(3,4)w = (3, 4)면 ∥w∥=5\lVert w\rVert = 5, 마진 폭은 0.4입니다.

2. 하드 마진과 소프트 마진

하드 마진: 모든 점이 도로 밖에 있어야 한다는 조건 아래 도로를 최대로 넓힙니다. 폭 2/∥w∥2/\lVert w\rVert를 최대화하는 것은 12∥w∥2\frac12\lVert w\rVert^2을 최소화하는 것과 같습니다.

min⁡w,b 12w⊤w조건: yi(w⊤xi+b)≥1  (모든 i)\min_{w,b}\ \frac12 w^\top w \quad \text{조건: } y_i(w^\top x_i + b) \ge 1\ \ (\text{모든 } i)

숫자로 해 보기(해설용): 클래스 −1: (1,1),(2,1),(1,2)(1,1), (2,1), (1,2), 클래스 +1: (3,3),(4,3),(3,4)(3,3), (4,3), (3,4). scikit-learn SVC(kernel='linear', C=10⁶)(C를 아주 크게 해 하드 마진에 가깝게)으로 학습하면 다음을 얻습니다.

  • w≈(0.667,0.667)w \approx (0.667, 0.667), b≈−3.0b \approx -3.0 → 경계는 x1+x2=4.5x_1 + x_2 = 4.5
  • 서포트 벡터: (2,1),(1,2),(3,3)(2,1), (1,2), (3,3) — 세 점의 w⊤x+bw^\top x + b가 각각 약 −1,−1,+1-1, -1, +1
  • 마진 폭 2/∥w∥=2/0.943≈2.122/\lVert w\rVert = 2/0.943 \approx 2.12

확인: 선 x1+x2=3x_1 + x_2 = 3(점 (2,1), (1,2)가 놓인 선)과 x1+x2=6x_1 + x_2 = 6(점 (3,3)이 놓인 선) 사이 거리는 3/2≈2.123/\sqrt2 \approx 2.12로 같습니다. 나머지 점 (1,1),(4,3),(3,4)(1,1), (4,3), (3,4)는 도로에서 멀어서 경계를 정하는 데 아무 역할도 하지 않습니다.

소프트 마진: 실제 데이터는 겹치거나 잡음이 있어 완벽히 나뉘지 않습니다. 각 점에 "도로를 침범해도 되는 양" ζi\zeta_i를 허락하고, 그 합에 벌점 C를 매깁니다. scikit-learn 문서의 SVC 원 문제(primal)는 다음과 같습니다.

min⁡w,b,ζ 12w⊤w+C∑i=1nζi조건: yi(w⊤ϕ(xi)+b)≥1−ζi,  ζi≥0\min_{w,b,\zeta}\ \frac12 w^\top w + C\sum_{i=1}^{n}\zeta_i \quad \text{조건: } y_i(w^\top\phi(x_i) + b) \ge 1 - \zeta_i,\ \ \zeta_i \ge 0
기호뜻
ζi\zeta_i슬랙 변수 — 0이면 도로 밖, 0~1이면 도로 안(맞게 분류), 1보다 크면 반대편(오분류)
CC침범에 매기는 벌점 세기(기본값 1.0)
ϕ(x)\phi(x)특성 변환(커널을 쓸 때, 5절)

3. 힌지 손실과 C

소프트 마진 문제는 다음과 같은 "손실 + 정규화" 꼴로 다시 쓸 수 있습니다.

min⁡w,b 12∥w∥2+C∑imax⁡(0, 1−yif(xi)),f(x)=w⊤x+b\min_{w,b}\ \frac12\lVert w\rVert^2 + C\sum_i \max\big(0,\ 1 - y_i f(x_i)\big),\qquad f(x) = w^\top x + b

max⁡(0,1−yf)\max(0, 1 - yf)를 힌지 손실(hinge loss)이라고 합니다. 경첩처럼 한 점에서 꺾이는 모양이라 붙은 이름입니다.

숫자로 해 보기(해설용, y=+1y = +1):

f(x)f(x)상황힌지 손실
2도로 밖, 맞음0
1가장자리 위0
0.5도로 안, 맞음0.5
0경계 위1
−1반대편(오분류)2

로지스틱 회귀의 로그 손실은 아무리 잘 맞혀도 0이 되지 않지만, 힌지 손실은 "충분히 맞힌(도로 밖)" 점에 대해 정확히 0입니다. 그래서 그 점들은 경계에 영향을 주지 않고, 서포트 벡터만 남습니다.

C 읽기: 식에서 C는 손실 쪽에 곱해져 있으므로 정규화 세기의 역수입니다. scikit-learn 문서도 낮은 C는 결정 경계를 매끄럽게, 높은 C는 학습 예제를 모두 맞히려 한다고 설명하고, 잡음이 많으면 C를 줄이라고(=정규화를 늘리라고) 권합니다. 로지스틱 회귀의 C와 같은 방향입니다.

4. 쌍대 문제: 점들의 가중합으로 보기

라그랑주 승수를 써서 원 문제를 바꾸면, 가중치 ww 대신 예제마다 하나씩 계수 αi\alpha_i를 찾는 쌍대 문제(dual)가 됩니다. scikit-learn 문서의 식은 다음과 같습니다.

min⁡α 12α⊤Qα−e⊤α조건: y⊤α=0,  0≤αi≤C,Qij=yiyjK(xi,xj)\min_{\alpha}\ \frac12\alpha^\top Q\alpha - e^\top\alpha \quad \text{조건: } y^\top\alpha = 0,\ \ 0 \le \alpha_i \le C,\qquad Q_{ij} = y_i y_j K(x_i, x_j)
f(x)=∑i∈SVyiαiK(xi,x)+bf(x) = \sum_{i \in SV} y_i\alpha_i K(x_i, x) + b
기호뜻
αi\alpha_i예제 ii의 중요도. 서포트 벡터만 0보다 큼
K(xi,xj)K(x_i, x_j)커널 — 두 점의 (변환된 공간에서의) 내적
ee모두 1인 벡터
SVSV서포트 벡터의 모음

왜 쌍대가 중요한가: 예측식 f(x)f(x)에 데이터가 내적 K(xi,x)K(x_i, x)로만 나옵니다. 그래서 내적만 계산할 수 있다면 ϕ(x)\phi(x)를 실제로 만들지 않아도 됩니다. 이것이 다음 절의 커널 트릭입니다. 2절의 예에서도 쌍대 계수는 서포트 벡터 세 점에만 0이 아닌 값(약 0.222, 0.222, 0.444)이 붙었습니다.

5. 커널 트릭: 고차원으로 가지 않고 고차원 내적 구하기

직관(해설용 비유): 책상 위에 섞여 있는 빨간 구슬과 파란 구슬을 직선 하나로 가를 수 없을 때, 책상을 툭 쳐서 빨간 구슬만 높이 튀어 오르게 하면 평평한 판 하나로 위아래를 가를 수 있습니다. 더 높은 차원으로 옮기면 선형 경계로 나뉜다는 뜻입니다. 커널은 이 "옮긴 뒤의 내적"을 옮기지 않고 바로 계산해 줍니다.

숫자로 해 보기(해설용): 2차 다항 커널 K(x,z)=(x⊤z)2K(x, z) = (x^\top z)^2을 봅시다. x=(1,2)x = (1, 2), z=(3,1)z = (3, 1)이면 x⊤z=5x^\top z = 5, K=25K = 25입니다. 같은 값을 3차원 변환 ϕ(v)=(v12,2v1v2,v22)\phi(v) = (v_1^2, \sqrt2 v_1 v_2, v_2^2)으로 계산하면 ϕ(x)=(1,22,4)\phi(x) = (1, 2\sqrt2, 4), ϕ(z)=(9,32,1)\phi(z) = (9, 3\sqrt2, 1), 내적 =9+12+4=25= 9 + 12 + 4 = 25로 같습니다. 커널은 2차원에서 곱 한 번과 제곱 한 번으로 3차원 내적을 얻었습니다. 차수가 높고 차원이 클수록 이 절약은 엄청나게 커집니다.

RBF(가우시안) 커널: scikit-learn 기본 커널입니다.

K(x,x′)=exp⁡(−γ∥x−x′∥2)K(x, x') = \exp\big(-\gamma\lVert x - x'\rVert^2\big)
∥x−x′∥2\lVert x - x'\rVert^2γ=0.5\gamma = 0.5γ=2\gamma = 2
2e−1≈0.368e^{-1} \approx 0.368e−4≈0.018e^{-4} \approx 0.018
4e−2≈0.135e^{-2} \approx 0.135e−8≈0.0003e^{-8} \approx 0.0003

RBF 커널은 "두 점이 얼마나 가까운가"를 0~1로 잰 유사도입니다. γ가 크면 아주 가까운 점끼리만 유사하다고 봅니다. 문서의 설명대로 γ는 학습 예제 하나의 영향이 미치는 범위를 정하며, 클수록 영향 범위가 좁습니다. SVC의 기본값 gamma='scale'은 1/(특성 수×X의 분산)1/(\text{특성 수} \times X\text{의 분산})을 씁니다(0.22 버전부터 기본값).

6. 실행해 보기: C와 γ의 효과

반달 모양 두 클래스가 겹친 데이터(make_moons, 300개, 잡음 0.25)를 표준화한 뒤 학습했습니다(학습 70% · 테스트 30%, 시드 0).

커널Cγ학습 정확도테스트 정확도서포트 벡터 수
linear1—0.8290.85676
rbf1scale0.9520.95666
rbf10.10.8480.84486
rbf11000.9900.944202
rbf100scale0.9620.97834
rbf0.01scale0.5380.411194

(Python 3.14 · scikit-learn 1.9.0에서 실행한 결과입니다. 데이터 시드가 바뀌면 숫자는 달라집니다.)

읽는 법

  • 선형 커널은 반달 모양을 직선으로 가르느라 0.83~0.86에 머뭅니다(과소적합).
  • γ = 100은 학습 0.99로 거의 외웠지만 테스트는 더 낮고, 서포트 벡터가 210개 학습 점 중 202개입니다 — 점마다 작은 섬을 만든 과적합 신호입니다.
  • C = 0.01은 정규화가 너무 세서 경계를 거의 만들지 못했습니다(과소적합).
  • 이 데이터에서는 C = 100이 가장 좋았지만, 이는 이 데이터 한 번의 결과일 뿐입니다. 실제로는 C와 γ를 격자 탐색 + 교차 검증(GridSearchCV)으로 함께 고릅니다.
python
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC

X, y = make_moons(n_samples=300, noise=0.25, random_state=0)
X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, random_state=0)
model = make_pipeline(StandardScaler(), SVC(kernel="rbf", C=1.0, gamma="scale"))
model.fit(X_tr, y_tr)
print(model.score(X_te, y_te), model[-1].n_support_.sum())   # 약 0.956, 66

스케일링은 필수: scikit-learn 문서는 SVM이 크기에 불변이 아니므로 데이터를 스케일링하라고 강하게 권하고, 위처럼 Pipeline으로 묶어 테스트에도 같은 변환을 적용하라고 예시합니다.

mermaid
flowchart LR
  A[데이터] --> B[표준화]
  B --> C{선형으로 나뉘나?}
  C -- 대체로 예 --> D[선형 SVM · C 조정]
  C -- 아니오 --> E[RBF 커널 · C와 γ 격자 탐색]
  D --> F[교차 검증]
  E --> F
  F --> G[서포트 벡터로 경계 결정]
  G --> H[예측 f x = Σ y_i α_i K x_i, x + b]

7. 장단점과 쓰임

장점단점
고차원(특성이 예제보다 많은 경우)에서도 잘 동작예제 수가 많으면 학습이 느림(쌍대 문제가 n×nn \times n 행렬을 다룸)
서포트 벡터만 저장하므로 예측이 가벼움확률을 바로 내지 않음(보정이 따로 필요)
커널로 다양한 경계 모양C · γ · 커널 선택에 민감
볼록 최적화라 전역 최적해스케일링 필수

역사 메모: 소프트 마진과 커널을 결합한 서포트 벡터 네트워크는 Cortes · Vapnik(1995, Machine Learning 20권)이 발표했습니다. 2010년대 딥러닝 이전에는 이미지 · 텍스트 분류의 대표 모델이었고, 지금도 중소 규모 표 데이터와 텍스트 분류의 강한 기준 모델입니다. 데이터가 매우 크면 선형 SVM(LinearSVC)이나 경사 하강 기반 SGDClassifier(loss='hinge')를 씁니다.

연습 문제

1. w=(1,1)w = (1, 1), b=−3b = -3인 경계에서 점 (1,1)(1, 1)의 함수값과 경계까지 거리는?

풀이: f=1+1−3=−1f = 1 + 1 - 3 = -1이므로 가장자리 위입니다. 거리 =∣−1∣/2≈0.707= |{-1}|/\sqrt2 \approx 0.707, 마진 폭은 2/2≈1.4142/\sqrt2 \approx 1.414입니다.

2. y=−1y = -1인 점에서 f(x)=0.3f(x) = 0.3이면 힌지 손실은?

풀이: max⁡(0,1−(−1)(0.3))=1.3\max(0, 1 - (-1)(0.3)) = 1.3. 경계를 넘어 반대편(양성 쪽)에 있으므로 1보다 큽니다.

3. RBF 커널에서 γ = 1, 두 점 사이 거리가 1이면 커널 값은? 거리가 3이면?

풀이: e−1≈0.368e^{-1} \approx 0.368, e−9≈0.000123e^{-9} \approx 0.000123. 멀리 있는 점은 사실상 영향을 주지 않습니다.

4. 6절 표에서 γ = 100의 서포트 벡터 수가 많은 이유는?

풀이: 영향 범위가 아주 좁아 점 하나하나가 따로 경계를 만들어야 하기 때문입니다. 거의 모든 점이 서포트 벡터가 되면 데이터를 외운(과적합) 것으로 봅니다.

스스로 점검

  1. 서포트 벡터가 아닌 점을 지우고 다시 학습하면 경계는 어떻게 되나요?
    • 답: 변하지 않습니다. 경계는 쌍대 계수가 0보다 큰 서포트 벡터만으로 정해지기 때문입니다.
  2. C를 키우면 마진과 학습 오류는 어떻게 변하나요?
    • 답: 침범 벌점이 커져 학습 점을 더 많이 맞히려 하므로 학습 오류는 줄고 마진은 좁아지며, 과적합 위험이 커집니다.
  3. 커널 트릭이 가능한 이유를 한 문장으로 말해 보세요.
    • 답: 쌍대 문제와 예측식에 데이터가 두 점의 내적으로만 나타나므로, 내적을 직접 계산하는 커널 함수로 바꿀 수 있기 때문입니다.

용어 정리

용어쉬운 뜻
서포트 벡터 머신(SVM)마진이 가장 넓은 경계를 찾는 분류기
마진(margin)경계와 가장 가까운 점들 사이의 여유 폭
서포트 벡터(support vector)경계를 결정하는 가장자리의 점들
하드 · 소프트 마진(hard · soft margin)침범을 전혀 허용하지 않음 · 벌점을 내고 허용
슬랙 변수(slack variable)점이 마진을 침범한 정도
힌지 손실(hinge loss)max⁡(0,1−yf)\max(0, 1 - yf), 충분히 맞히면 0
쌍대 문제(dual problem)예제별 계수 αi\alpha_i로 다시 쓴 최적화 문제
커널(kernel)변환된 공간에서의 내적을 바로 계산하는 함수
커널 트릭(kernel trick)변환 없이 커널만으로 비선형 경계를 학습하는 방법
RBF 커널거리에 따라 지수적으로 줄어드는 유사도 커널
γ (gamma)RBF 커널에서 한 점의 영향 범위를 정하는 값

더 깊이 보려면

scikit-learn '1.4 Support Vector Machines'에는 다중 분류 방식(일대일 · 일대다), 회귀용 SVR, 이상 탐지용 One-Class SVM, 커널 함수 목록, 계산 복잡도와 실무 팁이 정리되어 있습니다. 쌍대 문제의 유도(KKT 조건)는 스탠퍼드 CS229 강의 노트의 SVM 장에서 볼 수 있습니다.

다음에 볼 것

라이선스

이 글은 원문 번역이 아니라 KAITABASE가 직접 쓴 해설이며, 숫자 예와 실행 결과는 설명용입니다(python · scikit-learn으로 직접 계산 · 실행). 참고 자료 scikit-learn 문서는 BSD-3-Clause 라이선스입니다.

출처

  • 참고: https://scikit-learn.org/stable/modules/svm.html (원 · 쌍대 문제 식, RBF 커널, C · γ 설명, 스케일링 권고)
  • 참고: https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html (기본 커널 rbf, gamma='scale' 정의와 0.22 변경)
  • Cortes, C., Vapnik, V. (1995). Support-vector networks. Machine Learning 20, 273–297.

AI 원리부터 이해하기 · 머신러닝 모듈

머신러닝 모듈 학습

이 글은 머신러닝 모듈의 학습 자료입니다. 전체 17개 자료 중 6번째입니다.

AI 기초 과정은 현재 진도 저장을 지원하지 않습니다.

출처·원문

원문 보기

요약만

본문 자체 작성 · 참고 자료 scikit-learn 사용자 안내서(BSD-3)