[머신러닝 정리] 서포트 벡터 머신(Support Vector Machine) - 07. Soft-margin SVM (2)

Seong-Heon Lee·2022년 6월 7일
2
post-thumbnail

본 포스팅 시리즈는 다양한 머신러닝 테크닉에 대해 수학적 관점과 실용적 관점에서 정리한다.

필자는 수학을 전공했기 때문에 수학적 접근과 용어에 대해 익숙하게 사용한 것이 있지만, 수학을 전공하지 않은 사람들에겐 다소 낯선 접근과 용어가 있을 수 있다.

최대한 그러한 부분을 자세히 설명하려 노력하였지만 필자의 타전공자에 대한 '공감능력부족'으로 효과적으로 전달되지 못한 부분이 있을 것으로 생각된다.

이 글을 읽어주시는 분께 일차적으로 감사드리며, 해당 부분에 대해 질문이나 코멘트를 남겨주시는 분께는 거듭제곱으로 감사드림을 말씀드린다.

Support Vector Machine

서포트 벡터 머신은 딥러닝이 등장하기 이전에 가장 유명하고 성능 좋은 머신러닝 모델이었다고 한다.
현재는 다소 실무에서 사용되는 정도가 줄어들었겠지만, 서포트 벡터 머신에 적용되는 다양한 수학적 테크닉들은 인공지능을 이해하고 연구하는 데에 여전히 훌륭한 인사이트를 준다고 생각한다.
특히 서포트 벡터 머신의 아이디어는 유클리드 기하학과 최적화 이론으로 설명이 된다는 점은 수학자들에게 있어서 굉장히 매력적이다.

본 포스팅의 내용은 다음의 자료들을 참고했다.

  1. Mathematics for Machine Learning (Deisenroth, Marc Peter and Faisal, A. Aldo and Ong, Cheng Soon)
  2. The Elements for Statistical Learning (Trevor Hastie, Robert Tibshirani, Jerome Friedman)
  3. 김민준님(이화여자대학교, 수학과 석사)의 SVM Lecture note
  4. 김원화 교수님(포항공과대학교, 인공지능대학원 교수)의 데이터 마이닝 Lecture note
  5. Hands-On Machine Learning with Scikit-Learn, Keras, and Tensorflow (Aurelien, Geron)

7. Soft-Margin SVM (2)

지난 포스팅에서는 하드 마진 SVM의 한계와 이를 극복하기 위해 잉여(slack)를 도입해 일반화 성능을 향상시킨 소프트 마진 SVM에 대해 알아보았다.

이번 포스팅에선느 필자가 말을 바꾸려고 한다.
결국 잉여는 사회적 손실이다.
'열심히 살지 않아도 괜찮아'라는 말은 극심해진 빈부격차에 대해 계층의 벽을 뛰어넘으려해도 좌절하여 잉여가 되는 사람들의 불만을 누그러뜨리기 위해, 밑바닥에 있는 이들에게 밑바닥에 있는 삶에 만족하도록 만들어서 사회적 혼란을 야기하지 않도록 만들어진 일종의 선전도구다.

이러한 관점에 따르면 잉여로 인한 손실은 불가피한 것이지만, 가능한한 손실을 최소화해야한다.
오늘 소개할 손실함수 관점에서의 소프트 마진 SVM은 이러한 관점과 유사하게 유도된다.

주의!

필자가 소프트 마진 SVM을 설명하는 두 관점을 소개하기 위해 사회적 가치에 대한 여러 메타포들을 들고왔다.
사회과학에서 동일한 하나의 현상을 전혀 다른 시각에서 관찰하는 것이 빈번한데, 동일한 소프트 마진 SVM을 바라보는 두 방식을 사회현상에 빗대어 설명하는 것이 흥미로울 것이라 생각했을 뿐이다.
따라서 포스팅에 포함된 사회적 가치에 대한 메타포는 설명을 위해 도입한 메타포일뿐, 필자가 사회를 비판하기 위해 들고온 개인적 사상이 아님을 밝힌다.

7.1 손실함수

손실함수(Loss function)란 지도학습 모델이 풀고자 하는 문제에 대해 예측을 얼마나 틀렸는지를 측정하는 함수다.
예를들어, 선형회귀 문제에서는 회귀 예측값 ii번째 샘플에 대한 y^i\hat{y}_i과 실제 값 yiy_i와의 평균제곱오차(Mean Square Error)를 손실함수로 사용했다.

MSE=1Ni=1N(yiyi^)2MSE = \frac{1}{N}\sum_{i=1}^N (y_i - \hat{y_i})^2

손실함수 관점에서 지도학습 문제는 손실함수 값이 최소가 되도록 예측 모델을 만드는 것이 목적이다.

이진분류 문제에서 사용되는 손실함수는 여러가지가 있지만, 이번 시리즈에서 다루기엔 주제를 벗어나므로 SVM에서 사용되는 손실함수에 대해서만 다루고자 한다.
SVM 모델의 제약조건을 다시 떠올려보면, 모델이 정답을 맞췄을 때의 조건을 yif(xi)1y_if(x_i) \geq 1로 심플하게 표현하고 있다.
그러므로 yif(xi)y_if(x_i)의 값이 1보다 작은 값이 나올수록 정답에서 더욱 멀어진다고 할 수 있다.
따라서 이 값을 기준으로 손실함수를 정의하고 측정한다면 모델이 문제에 대해 예측을 얼마나 틀렸는지 적절히 측정할 수 있을 것이다.

t=yf(x)t = yf(x)라고 두자.
t1(    1t0)t \geq 1 (\iff 1-t \leq 0)인 경우는 정답을 맞춘 경우이므로 오차를 부여할 필요가 없다.
한편, 0<t<1(    0<1t<1)0< t < 1 (\iff 0 < 1-t < 1)인 경우는 정답을 맞추기는 했지만 마진영역 내부로 들어와 앞으로의 데이터에 대해 의심이 되므로 1t1-t 만큼을 오차로 부여한다.
마지막으로 t<0(    1t1)t < 0 (\iff 1-t \geq 1)인 경우는 정답을 틀린 경우이므로 1t1-t 만큼을 오차로 부여한다.

  1.             t1    h(t)=0\;\;\;\;\;\;t \geq 1 \implies h(t) = 0 (정답을 맞춘 경우)
  2. 0<t<1    h(t)=1t0< t < 1 \implies h(t) = 1 - t (정답을 맞추었지만 의심되는 경우)
  3.             t<0    h(t)=1t\;\;\;\;\;\;t < 0 \implies h(t) = 1-t (예측이 틀린 경우)

이를 하나의 함수로 표현하면

h(t)=max{0,1t}h(t) = \max\left\{0, 1-t\right\}

가 된다.
이렇게 정의된 손실함수 h(t)h(t)힌지 손실(hinge loss)라고 부른다.
정확히는 tt가 예측값 y^=f(x)\hat{y} = f(x)와 실제값 yy에 의해 정의되므로, hh는 이들에 대한 이변수함수 h(y,y^)h(y,\hat{y})로 표기하는 것이 더 정확하다.

참고!

지금 논의중인 SVM은 소프트 마진 SVM이다.
다시말해, 방금 정의한 힌지 손실함수는 소프트 마진 SVM에 대한 손실함수이다.
하드 마진 SVM는 모델이 틀리는 것을 용납하지 못하기 때문에 정답이 아닌 것에 대해 무한한 오차를 부여한다.
따라서 하드 마진 SVM에 대한 손실함수는 다음과 같이 정의된다.
hhard(t)={0(t1)(t<1)h_{hard}(t) = \begin{cases} 0 & (t\geq 1) \\ \infty & (t<1) \end{cases}

7.2 소프트 마진 SVM의 정의 : 손실함수 관점

손실함수 관점에서의 소프트 마진 SVM은 꽤나 냉철한 경영적 마인드가 반영된다.
경영의 마인드에서 회사의 이윤을 창출하는 가장 쉬운 방법은 혁신적인 신제품을 출시하는 것보다, 현재 회사에 불필요하게 지출되고 있는 인건비나 원자재 비용을 절감하는 것이다.
이 관점에 따르면 어떤 문제를 해결하기 위해 각 데이터마다 이 데이터가 얼마나 손실을 야기하는지 측정하고, 이를 최소화 하는 방향을 찾는다.
또한 문제를 해결하는데 필요한 모델에 투입되는 자원도 가능한 최소화 한다.

SVM 모델에 투입되는 자원의 크기를 파라미터의 크기 12β2\frac{1}{2}\lVert \beta \rVert^2으로 해석하고 데이터가 야기하는 손실의 크기를 힌지 손실함수 값 h(yi,y^i)h(y_i,\hat{y}_i)로 해석하면, 소프트 마진 SVM 문제는 다음의 최적화 문제로 표현될 수 있다.

minβ,β012β2+Ci=1Nh(yi,y^i)\min_{\beta, \beta_0} \frac{1}{2} \lVert \beta \rVert^2 + C\sum_{i=1}^N h(y_i,\hat{y}_i)

이때 첫번째 항 12β2\frac{1}{2}\lVert \beta \rVert^2은 모델 파라미터의 크기를 l2l_2 norm을 사용하여 규제하도록 만들기 때문에 l2l_2 규제항이라 불린다.
그리고 두번째 항Ci=1Nh(yi,y^i)C\sum_{i=1}^N h(y_i,\hat{y}_i)은 손실함수에 의해 측정된 모델의 오차이기 때문에 오차항이라고 불린다.
만약 릿지 규제(Ridge regularization)에 대해 들어본 독자가 있다면, 정확히 그 개념이 현재의 최적화 문제에 해당한다.

이전에 12β2\frac{1}{2}\lVert \beta \rVert^2를 최소화하는 문제는 마진을 최대화하는 문제와 동치임을 보였었음을 상기해보자.
여기서는 마진 최대화 문제가 모델의 파라미터에 규제를 주는 것으로 해석되고 있다.

7.3 하나의 문제를 바라보는 두 관점

지난 포스팅에서는 소프트 마진 SVM을 잉여의 관점에서 살펴보았고, 이번 포스팅에서는 손실의 관점에서 살펴보았다.
서로 다른 두 관점에서 바라본 문제는 사실 같은 문제인걸까?

잉여관점에서의 소프트 마진 SVM 문제는 제약조건이 주어진 최적화문제였다.

minβ,β0,ξ12β2+Ci=1Nξnsubject to yi(xiTβ+β0)1ξi,ξi0,i=1,,N\min_{\beta, \beta_0, \xi} \frac{1}{2} \lVert \beta \rVert^2 + C\sum_{i=1}^N \xi_n \\ \text{subject to } y_i(x_i^T\beta + \beta_0) \geq 1 - \xi_i, \xi_i \geq 0, \forall i=1,\ldots,N

여기서 제약조건을 유심히 살펴보자.
제약조건에 있는 yi(xiTβ+β0)1ξi,ξi0y_i(x_i^T\beta + \beta_0) \geq 1 - \xi_i, \xi_i \geq 0라는 조건은

ξi1yi(xiTβ+β0)=1yif(xi)=1yiy^i\xi_i \geq 1 -y_i(x_i^T\beta + \beta_0)=1-y_if(x_i) = 1 - y_i\hat{y}_i

ξi0\xi_i \geq 0

로 분리할 수 있다.
이 두 제약조건을 동시에 만족시키는 ξi\xi_i

ξi=max{0,1yiy^i}\xi_i = \max\left\{0, 1-y_i\hat{y}_i\right\}

이다.

이로부터 소프트 마진 SVM에서 제약조건을 만족시키는 잉여변수 ξi\xi_i의 값은 사실 손실함수 값 h(yi,y^i)h(y_i, \hat{y}_i)와 같음이 보여진다.
이를 이용해 소프트 마진 SVM 문제에서 제약조건을 모두 소거하면 다음 제약없는 최적화 문제를 얻는다.

minβ,β012β2+Ci=1Nh(yi,y^i)\min_{\beta, \beta_0} \frac{1}{2} \lVert \beta \rVert^2 + C\sum_{i=1}^N h(y_i,\hat{y}_i)

따라서 잉여관점에서 유도한 소프트 마진 SVM과 손실함수 관점에서 유도한 소프트 마진 SVM은 동치다.


지금까지 소프트 마진 SVM에 대해 알아보았다.

그러나 여전히 다 맺지 못한 이야기들이 많다.

수학적으로 소프트 마진 SVM 문제의 최적해를 어떻게 구하는지에 대한 논의와 실용적으로 페널티 파라미터 CC가 모델에 어떤 영향을 끼치는지에 대해서는 추후에 다루기로 하자.

다음 포스팅에서는 SVM 이론의 치트키라고 할 수 있는 커널 트릭(Kernel trick)에 대해서 다뤄보겠다.


Python 실습)

# Implement Hinge loss function from scratch
import numpy as np
import matplotlib.pyplot as plt
colors = [plt.cm.Dark2(i) for i in range(20)]
t = np.linspace(0,2,100)
def h(t):
    error = 1-t
    zeros = np.zeros_like(t)
    return np.max([zeros, error], axis = 0)
# plotting
plt.figure(figsize = (8,8))
plt.plot(t, h(t), color = colors[0], label = '$h(x) = \max(0,1-t)$')
plt.title('Hinge Loss', fontsize =20)
plt.xlabel('$t = yf(x)$', fontsize = 14)
plt.ylabel('$h(t)$', fontsize = 14)
plt.legend(fontsize = 14)
plt.grid()
plt.savefig('hinge_loss.png')
profile
TDA와 DL을 연구하는 대학원생입니다.

0개의 댓글