서포트 벡터 머신과 커널
마진 · 서포트 벡터 · 힌지 손실 · 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 커널, γ, 스케일링, 장단점 |
| 먼저 알면 좋은 것 | 내적과 노름, 로지스틱 회귀의 결정 경계, 정규화의 뜻, 라그랑주 승수(개념) |
들어가기 전에
- 로지스틱 회귀와 소프트맥스 — 선형 결정 경계 을 그대로 씁니다.
- 최적화 기초: 경사 하강법 · 볼록성 · 라그랑주 승수 — SVM의 쌍대 문제는 라그랑주 승수에서 나옵니다(이 수업에서는 개념만 씁니다).
- k-최근접 이웃과 나이브 베이즈 — 거리 기반 모델처럼 SVM도 스케일링에 민감합니다.
한눈에 보기
- "마진이 가장 넓은 경계"가 왜 좋은지, 서포트 벡터가 무엇인지 압니다.
- 마진 폭이 인 이유와 하드 · 소프트 마진 문제의 식을 읽습니다.
- 힌지 손실을 직접 계산하고 C가 정규화의 역수 역할을 한다는 것을 압니다.
- 커널 트릭이 "고차원으로 보내지 않고 고차원의 내적을 계산하는" 방법임을 숫자로 확인합니다.
- RBF 커널의 γ와 C를 바꿔 가며 과적합 · 과소적합을 실행 결과로 봅니다.
1. 마진: 가장 넓은 길 내기
직관(해설용 비유): 두 마을 사이에 도로를 낸다고 합시다. 도로가 어느 쪽 집에도 닿지 않게 하면서 가장 넓게 내면, 나중에 새 집이 조금 어긋나게 지어져도 도로 안쪽을 침범할 가능성이 작습니다. SVM의 경계는 이 도로의 가운데 선이고, 도로 가장자리에 닿아 있는 집들이 서포트 벡터(support vector)입니다. 도로에서 먼 집은 옮겨도 도로가 바뀌지 않습니다.
경계와 도로 가장자리는 다음 세 직선입니다(라벨 ).
| 기호 | 뜻 |
|---|---|
| 경계에 수직인 방향 벡터(법선) | |
| 절편 | |
| 의 길이 — 작을수록 도로가 넓음 | |
| 가장자리를 1로 정하는 약속(크기 맞추기) |
왜 인가: 점 에서 직선 까지의 거리는 입니다. 가장자리 위의 점은 이므로 경계까지 , 양쪽을 합치면 입니다. 예를 들어 면 , 마진 폭은 0.4입니다.
2. 하드 마진과 소프트 마진
하드 마진: 모든 점이 도로 밖에 있어야 한다는 조건 아래 도로를 최대로 넓힙니다. 폭 를 최대화하는 것은 을 최소화하는 것과 같습니다.
숫자로 해 보기(해설용): 클래스 −1: , 클래스 +1: . scikit-learn SVC(kernel='linear', C=10⁶)(C를 아주 크게 해 하드 마진에 가깝게)으로 학습하면 다음을 얻습니다.
- , → 경계는
- 서포트 벡터: — 세 점의 가 각각 약
- 마진 폭
확인: 선 (점 (2,1), (1,2)가 놓인 선)과 (점 (3,3)이 놓인 선) 사이 거리는 로 같습니다. 나머지 점 는 도로에서 멀어서 경계를 정하는 데 아무 역할도 하지 않습니다.
소프트 마진: 실제 데이터는 겹치거나 잡음이 있어 완벽히 나뉘지 않습니다. 각 점에 "도로를 침범해도 되는 양" 를 허락하고, 그 합에 벌점 C를 매깁니다. scikit-learn 문서의 SVC 원 문제(primal)는 다음과 같습니다.
| 기호 | 뜻 |
|---|---|
| 슬랙 변수 — 0이면 도로 밖, 0~1이면 도로 안(맞게 분류), 1보다 크면 반대편(오분류) | |
| 침범에 매기는 벌점 세기(기본값 1.0) | |
| 특성 변환(커널을 쓸 때, 5절) |
3. 힌지 손실과 C
소프트 마진 문제는 다음과 같은 "손실 + 정규화" 꼴로 다시 쓸 수 있습니다.
를 힌지 손실(hinge loss)이라고 합니다. 경첩처럼 한 점에서 꺾이는 모양이라 붙은 이름입니다.
숫자로 해 보기(해설용, ):
| 상황 | 힌지 손실 | |
|---|---|---|
| 2 | 도로 밖, 맞음 | 0 |
| 1 | 가장자리 위 | 0 |
| 0.5 | 도로 안, 맞음 | 0.5 |
| 0 | 경계 위 | 1 |
| −1 | 반대편(오분류) | 2 |
로지스틱 회귀의 로그 손실은 아무리 잘 맞혀도 0이 되지 않지만, 힌지 손실은 "충분히 맞힌(도로 밖)" 점에 대해 정확히 0입니다. 그래서 그 점들은 경계에 영향을 주지 않고, 서포트 벡터만 남습니다.
C 읽기: 식에서 C는 손실 쪽에 곱해져 있으므로 정규화 세기의 역수입니다. scikit-learn 문서도 낮은 C는 결정 경계를 매끄럽게, 높은 C는 학습 예제를 모두 맞히려 한다고 설명하고, 잡음이 많으면 C를 줄이라고(=정규화를 늘리라고) 권합니다. 로지스틱 회귀의 C와 같은 방향입니다.
4. 쌍대 문제: 점들의 가중합으로 보기
라그랑주 승수를 써서 원 문제를 바꾸면, 가중치 대신 예제마다 하나씩 계수 를 찾는 쌍대 문제(dual)가 됩니다. scikit-learn 문서의 식은 다음과 같습니다.
| 기호 | 뜻 |
|---|---|
| 예제 의 중요도. 서포트 벡터만 0보다 큼 | |
| 커널 — 두 점의 (변환된 공간에서의) 내적 | |
| 모두 1인 벡터 | |
| 서포트 벡터의 모음 |
왜 쌍대가 중요한가: 예측식 에 데이터가 내적 로만 나옵니다. 그래서 내적만 계산할 수 있다면 를 실제로 만들지 않아도 됩니다. 이것이 다음 절의 커널 트릭입니다. 2절의 예에서도 쌍대 계수는 서포트 벡터 세 점에만 0이 아닌 값(약 0.222, 0.222, 0.444)이 붙었습니다.
5. 커널 트릭: 고차원으로 가지 않고 고차원 내적 구하기
직관(해설용 비유): 책상 위에 섞여 있는 빨간 구슬과 파란 구슬을 직선 하나로 가를 수 없을 때, 책상을 툭 쳐서 빨간 구슬만 높이 튀어 오르게 하면 평평한 판 하나로 위아래를 가를 수 있습니다. 더 높은 차원으로 옮기면 선형 경계로 나뉜다는 뜻입니다. 커널은 이 "옮긴 뒤의 내적"을 옮기지 않고 바로 계산해 줍니다.
숫자로 해 보기(해설용): 2차 다항 커널 을 봅시다. , 이면 , 입니다. 같은 값을 3차원 변환 으로 계산하면 , , 내적 로 같습니다. 커널은 2차원에서 곱 한 번과 제곱 한 번으로 3차원 내적을 얻었습니다. 차수가 높고 차원이 클수록 이 절약은 엄청나게 커집니다.
RBF(가우시안) 커널: scikit-learn 기본 커널입니다.
| 2 | ||
| 4 |
RBF 커널은 "두 점이 얼마나 가까운가"를 0~1로 잰 유사도입니다. γ가 크면 아주 가까운 점끼리만 유사하다고 봅니다. 문서의 설명대로 γ는 학습 예제 하나의 영향이 미치는 범위를 정하며, 클수록 영향 범위가 좁습니다. SVC의 기본값 gamma='scale'은 을 씁니다(0.22 버전부터 기본값).
6. 실행해 보기: C와 γ의 효과
반달 모양 두 클래스가 겹친 데이터(make_moons, 300개, 잡음 0.25)를 표준화한 뒤 학습했습니다(학습 70% · 테스트 30%, 시드 0).
| 커널 | C | γ | 학습 정확도 | 테스트 정확도 | 서포트 벡터 수 |
|---|---|---|---|---|---|
| linear | 1 | — | 0.829 | 0.856 | 76 |
| rbf | 1 | scale | 0.952 | 0.956 | 66 |
| rbf | 1 | 0.1 | 0.848 | 0.844 | 86 |
| rbf | 1 | 100 | 0.990 | 0.944 | 202 |
| rbf | 100 | scale | 0.962 | 0.978 | 34 |
| rbf | 0.01 | scale | 0.538 | 0.411 | 194 |
(Python 3.14 · scikit-learn 1.9.0에서 실행한 결과입니다. 데이터 시드가 바뀌면 숫자는 달라집니다.)
읽는 법
- 선형 커널은 반달 모양을 직선으로 가르느라 0.83~0.86에 머뭅니다(과소적합).
- γ = 100은 학습 0.99로 거의 외웠지만 테스트는 더 낮고, 서포트 벡터가 210개 학습 점 중 202개입니다 — 점마다 작은 섬을 만든 과적합 신호입니다.
- C = 0.01은 정규화가 너무 세서 경계를 거의 만들지 못했습니다(과소적합).
- 이 데이터에서는 C = 100이 가장 좋았지만, 이는 이 데이터 한 번의 결과일 뿐입니다. 실제로는 C와 γ를 격자 탐색 + 교차 검증(
GridSearchCV)으로 함께 고릅니다.
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으로 묶어 테스트에도 같은 변환을 적용하라고 예시합니다.
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. 장단점과 쓰임
| 장점 | 단점 |
|---|---|
| 고차원(특성이 예제보다 많은 경우)에서도 잘 동작 | 예제 수가 많으면 학습이 느림(쌍대 문제가 행렬을 다룸) |
| 서포트 벡터만 저장하므로 예측이 가벼움 | 확률을 바로 내지 않음(보정이 따로 필요) |
| 커널로 다양한 경계 모양 | C · γ · 커널 선택에 민감 |
| 볼록 최적화라 전역 최적해 | 스케일링 필수 |
역사 메모: 소프트 마진과 커널을 결합한 서포트 벡터 네트워크는 Cortes · Vapnik(1995, Machine Learning 20권)이 발표했습니다. 2010년대 딥러닝 이전에는 이미지 · 텍스트 분류의 대표 모델이었고, 지금도 중소 규모 표 데이터와 텍스트 분류의 강한 기준 모델입니다. 데이터가 매우 크면 선형 SVM(LinearSVC)이나 경사 하강 기반 SGDClassifier(loss='hinge')를 씁니다.
연습 문제
1. , 인 경계에서 점 의 함수값과 경계까지 거리는?
풀이: 이므로 가장자리 위입니다. 거리 , 마진 폭은 입니다.
2. 인 점에서 이면 힌지 손실은?
풀이: . 경계를 넘어 반대편(양성 쪽)에 있으므로 1보다 큽니다.
3. RBF 커널에서 γ = 1, 두 점 사이 거리가 1이면 커널 값은? 거리가 3이면?
풀이: , . 멀리 있는 점은 사실상 영향을 주지 않습니다.
4. 6절 표에서 γ = 100의 서포트 벡터 수가 많은 이유는?
풀이: 영향 범위가 아주 좁아 점 하나하나가 따로 경계를 만들어야 하기 때문입니다. 거의 모든 점이 서포트 벡터가 되면 데이터를 외운(과적합) 것으로 봅니다.
스스로 점검
- 서포트 벡터가 아닌 점을 지우고 다시 학습하면 경계는 어떻게 되나요?
- 답: 변하지 않습니다. 경계는 쌍대 계수가 0보다 큰 서포트 벡터만으로 정해지기 때문입니다.
- C를 키우면 마진과 학습 오류는 어떻게 변하나요?
- 답: 침범 벌점이 커져 학습 점을 더 많이 맞히려 하므로 학습 오류는 줄고 마진은 좁아지며, 과적합 위험이 커집니다.
- 커널 트릭이 가능한 이유를 한 문장으로 말해 보세요.
- 답: 쌍대 문제와 예측식에 데이터가 두 점의 내적으로만 나타나므로, 내적을 직접 계산하는 커널 함수로 바꿀 수 있기 때문입니다.
용어 정리
| 용어 | 쉬운 뜻 |
|---|---|
| 서포트 벡터 머신(SVM) | 마진이 가장 넓은 경계를 찾는 분류기 |
| 마진(margin) | 경계와 가장 가까운 점들 사이의 여유 폭 |
| 서포트 벡터(support vector) | 경계를 결정하는 가장자리의 점들 |
| 하드 · 소프트 마진(hard · soft margin) | 침범을 전혀 허용하지 않음 · 벌점을 내고 허용 |
| 슬랙 변수(slack variable) | 점이 마진을 침범한 정도 |
| 힌지 손실(hinge loss) | , 충분히 맞히면 0 |
| 쌍대 문제(dual problem) | 예제별 계수 로 다시 쓴 최적화 문제 |
| 커널(kernel) | 변환된 공간에서의 내적을 바로 계산하는 함수 |
| 커널 트릭(kernel trick) | 변환 없이 커널만으로 비선형 경계를 학습하는 방법 |
| RBF 커널 | 거리에 따라 지수적으로 줄어드는 유사도 커널 |
| γ (gamma) | RBF 커널에서 한 점의 영향 범위를 정하는 값 |
더 깊이 보려면
scikit-learn '1.4 Support Vector Machines'에는 다중 분류 방식(일대일 · 일대다), 회귀용 SVR, 이상 탐지용 One-Class SVM, 커널 함수 목록, 계산 복잡도와 실무 팁이 정리되어 있습니다. 쌍대 문제의 유도(KKT 조건)는 스탠퍼드 CS229 강의 노트의 SVM 장에서 볼 수 있습니다.
다음에 볼 것
- 결정 트리: 지니 불순도 · 정보 이득 · 가지치기 — 거리나 내적이 아니라 "질문 쪼개기"로 경계를 만드는 모델입니다.
- 이상 탐지 — 한 클래스만으로 경계를 학습하는 One-Class 방식과 다른 이상 탐지 방법을 봅니다.
라이선스
이 글은 원문 번역이 아니라 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번째입니다.
출처·원문
원문 보기요약만