SVM 개요
SVM은 전통적인 분류 알고리즘 중 가장 성능이 좋은 알고리즘으로, 딥러닝이 자주 쓰이는 요즘도 종종 사용된다고 한다.
SVM의 기본적인 아이디어는 데이터를 분류하는 기준선을 찾는 것이다.
예를 들어 고양이 사진과 개 사진을 분류하는 경우를 생각해보자.
고양이 사진을 나타내는 점들과 개 사진을 나타내는 점들이 위 그림과 같이 분포되어 있을 때, 이 두 그룹을 나누는 선을 찾아야 한다.
그리고 새로운 데이터가 주어졌을 때는 그 데이터의 위치가 구분선 기준으로 어느쪽에 있는지 확인해서 분류하게 된다.
그런데 데이터를 구분하는 선은 위 그림과 같이 다양하게 존재한다.
이 중에서 '가장 좋은 선'은 어떤 선일까?
가장 좋은 선을 정하는 기준을 생각할 때 떠올리기 좋은 아이디어는 선형회귀와 비슷하게 로스를 기준으로 찾는 것이다.
그래서 이렇게 구분선을 찾는 모델을 Linear Classifier Function 이라고도 부른다.
선형회귀와 같이 하다보면 a 클래스에 너무 가까워지면 b클래스에 대해서는 로스가 증가하고, b클래스에 대해서 가까워지면 a 클래스에 대해서 로스가 증가하니 그 중간 균형점을 찾을 것으로 생각할 수 있다.
loss가 작은 쪽으로 찾으려고 하다보면 위 그림에서 빨간색 네모친 선을 찾게 되는 경우가 있을 수 있다.
녹색과 하얀색 모두 가깝기 때문이다.
그런데 이미지를 분류할 때는 두 그룹을 나누는 선과 각 그룹 데이터 사이의 거리가 넓어야 더 좋지 않을까?
그림으로 보면 위와 같이 점과 직선사이의 거리가 최대한 멀어서, 직선과 가장 가까운 데이터들 사이의 거리가 제일 먼 직선,
그림으로는 margin이 제일 크게 나오는 직선을 찾는 것이 더 좋을 것 같다.
왜냐하면 두 데이터를 분류하는 선과 기존 데이터 사이의 여유거리가 클수록,
각 그룹에서 경계선에 가깝게 존재하는 outliner 데이터에 더 강한 모습을 보이기 때문이다.
그리고 SVM은 이 아이디어를 사용하여 데이터를 분류하는 모델을 만든다.
(참고) SVM은 분류할 클래스가 2개일 때만 사용할 수 있는 방법이다.
Support Vector
SVM은 support vector machine 의 줄임말이다.
그러면 support vector 란 무엇일까?
위에서 정의한 제일 마진이 넓게 나오는 기준선에 대해서, 해당 선을 y = 0 으로 정의한다.
그리고 그 선과 평행한 선을 위 아래로 이동했을 때,
클래스 a에 속한 점과 처음으로 만나는 직선을 y = -1
클래스 b에 속한 점과 처음으로 만나는 직선을 y = 1 이라고 해보자.
이때 위 아래에서 처음으로 만난 점들을 가리켜 support vector 라고 부른다.
즉, support vector 들은 y = 0 기준선에서 제일 가까운 각 클래스의 점들이다.
그리고 support vector들은 y = 0 인 기준선을 결정하는데 사용되며, 나머지 점들은 모두 무시된다.
따라서 outliner 에 강한 모습을 보여준다. (outliner가 support vector 에 포함되지 않으면 무시되기 때문)
(처음에 생각했던 linear classifier function 의 경우 outliner가 loss에 크게 영향을 줄 수 있었다.)
거기에 더해 기준선을 찾는데 고려해야 할 점들이 줄어드므로 학습 속도도 매우 빨라진다.
SVM 알고리즘을 정리하기에 앞서, 먼저 각 클래스의 점들을 '음의 샘플' 과 '양의 샘플' 로 구분해보자
y = -1 기준선 쪽에 있는 샘플이 음의 샘플이고, y = 1 기준선 쪽에 있는 샘플들이 양의 샘플이 된다.
그리고 SVM도 선형 분류 모델을 학습시키는 방법 중 하나로서, 해당 함수식을 위와 같이 정의하면
이 문제도 선형회귀와 똑같이 W, b 를 찾는 문제로 바뀌게 된다.
그리고 이 문제의 목표는 음의 샘플들을 이 직선에 넣었을 때는 Wᵀx + b < 0 이 되고,
양의 샘플들을 넣었을 때는 Wᵀx + b > 0 가 되는 Wᵀx + b = 0 을 찾는 것으로 생각할 수 있다.
그리고 support vector 에 대해서는 음의 샘플이면 -1, 양의 샘플이면 1이 되도록 한다고 해보자.
그런데 SVM 에서 생각하는 '가장 좋은 직선'은 서포트 벡터에 대해 기준선을 잡았을 때 그 마진값이 최대가 되는 선이다.
이때의 마진값은 앞서 세운 직선식으로부터 위 그림과 같이 2 / ||W||₂ (w의 L2놈 분의 1)으로 정의할 수 있다.
그러면 우리의 최종 목표는 이 마진값을 최대화하는 W, b 조합을 찾는 것이 된다.
그 마진값이 왜 그렇게 나오는지는 위와 같이 유도할 수 있다.
w 벡터는 우리가 찾으려는 직선의 법선벡터이고, w / || w || 는 그 벡터의 단위벡터를 말한다.
이 단위벡터에 우리가 구하는 마진값을 곱해주고, 그 간격만큼 x- 직선을 평행이동한 직선이 x+ 직선임을 이용하여 식을 세울 수 있다.
이 식을 d 에 대해 정리하면 마진값을 w로 표현할 수 있다.
그런데 여기에서 L2 norm 이라는 개념이 등장한다.
(위 식에서는 ||w||₂ 가 w의 L2 norm 이다.)
norm 의 개념은 아래의 접은 글에 정리하였다.
norm 에 대해서 간단하게 정리하면

어떤 벡터 x 의 Lp-Norm 은 위와 같이 정의한다.
만약 p = 2 이면 L2-Norm, p = 1 이면 L1-Norm이 되는 식이다.

L2-Norm 은 위와 같이 계산한다.
벡터의 각 성분을 모두 제곱해서 더한 뒤 그 값에 루트를 씌우면 되며, L2 distance 와 비슷하다.
벡터의 관점에서는 '벡터의 크기' 를 구하는 일반화된 방법이라고 볼 수 있다.
L1-Norm 은 각 좌표의 절댓값을 모두 더한값이 되므로 L1 distance 와 비슷한 개념이 된다.
이때 p 에는 다양한 값이 들어갈 수 있으며, 심지어 0이나 무한대를 넣을 수도 있다.
무한대를 넣게 되면 각 성분을 무한대 제곱해서 다 더한 뒤, 1/무한대 제곱을 씌우므로, 사실상 벡터에서 제일 큰 성분만 남게된다.

L2-norm 을 시각화하면 위와 같이 원의 형태를 그리고

L1-norm 을 시각화하면 이렇게 마름모 형태가 나온다.
그래서 Loss 도 어떻게 보면 y 라는 타겟 벡터와 f(x) 라는 예측 벡터의 차이로 만들어진 벡터를 에러벡터라고 했을 때

이 에러 벡터의 크기를 loss 로 볼 수 있다.
(물론 로스를 다룰 때는 계산 편의를 위해 루트를 씌우지 않는다.)
결국 우리의 최종 목표는 2 / w의 L2-norm 을 최대화하는 것이고,
어떤 값을 최대화한다는 것은, 그 값의 역수를 최소화하는 것과 같으므로 ||w||₂ / 2 값을 최소화하는 것과 같다.
그런데 이렇게만 하면 w = 0 이 되는 순간 최소가 되므로 원하는 값을 찾는데 부족하다.
이제 여기에 서포트 벡터를 기준으로 양의 서포트 벡터에 대해서는 1, 음의 서포트 벡터에 대해서는 -1이 되도록 한다는 조건을 더해서 (W, b) 조합 중 ||w||1₂ / 2 가 최소인 값을 찾으면 된다.
그리고 그런 (W, b) 를 찾는 방법 (solver) 은 GD와 같이 여러가지 방법들이 존재한다.
(GD는 사실 식이 하나가 주어졌을 때 사용하고, SVM과 같이 조건이 붙은 경우에는 대학원에서 배우는 solver를 사용한다고 한다.)
이런 solver를 직접 구현하는 것은 불편하기 때문에, 코드로는 보통 sklearn 에서 제공하는 SVM 을 가져와서 사용한다.
svm 을 사용할 때는 svm.SVC() 메서드에 kernel 값을 linear 로 설정하면 우리가 배운대로 기본적인 선형 모델 방식으로 학습하게 된다.
이때 커널에 다른 값을 넣어서 non-linear 모델을 만들 수도 있다.
예를 들면 이렇게 데이터를 원형으로 기준점을 나눠서 분류하고자 할 때 사용할 수 있다.
이렇게 비선형적으로 분포된 데이터는 리니어 메서드로는 풀 수 없고, 커널 메서드로 풀어야 한다.
이때 '커널 메서드'는 비선형적으로 분포하는 데이터를 높은 차원으로 끌어올린다음 선형으로 자르는 개념이다.
SVM은 이미지 분류를 할 때도 과거에 많이 사용됐다.
그래서 예전 논문을 보면 이미지의 특징 벡터를 뽑아내는 피처 엔지니어링을 거치고, 그렇게 뽑아낸 특징 벡터를 기반으로 SVM을 통해 분류기를 만드는 방식이었다고 한다.
하지만 피처 엔지니이링 기법이 일반화 되어있지 않다보니 특정 데이터 셋에만 적합한 경우가 많았고, 그렇게 학습시킨 SVM 모델에 다른 이미지 데이터셋을 넣으면 잘 안되는 문제가 있어서 한계에 도달했다.
하지만 이후 딥러닝이 혜성같이 등장하면서 상당부분 해결되었다고 한다.
SVM은 기본적으로 2-class 분류기에 속하지만, 이제는 멀티 클래스도 된다고 한다.
멀티 클래스를 처리하는 아이디어는 4개 클래스라고 한다면 1번째 클래스와 나머지 클래스를 먼저 분류하고
나머지 클래스에 대해서 2번째 클래스와 나머지 클래스를 분류하고,
다시 나머지 클래스에 대해서 3번째 클래스와 4번째 클래스를 분류하는 식으로 멀티 클래스를 분류한다고 한다.
'CS > 기계학습심화' 카테고리의 다른 글
[기계학습심화] 9. PCA (Principal Component Analysis) (3) | 2025.04.19 |
---|---|
[기계학습심화] 8. K-Means (0) | 2025.04.18 |
[기계학습심화] 6. KNN 구현 (4) | 2025.04.17 |
[기계학습심화] 5. KNN & Hyperparameter (0) | 2025.04.15 |
[기계학습심화] 4. 경사하강법의 확장 & SGD (1) | 2025.04.13 |