2021년 5월 13일 목요일

[논문 리뷰/추천시스템] Cold-start problem 완화 목적의 새로운 similarity measure 제안 논문

 A new similarity measure for collaborative filtering to alleviate the new user cold-starting problem

Hyung Jun Ahn, A new similarity measure for collaborative filtering to alleviate the new user cold-starting problem, Information Sciences, Volume 178, Issue 1, 2008, Pages 37-51, ISSN 0020-0255, https://doi.org/10.1016/j.ins.2007.07.024. 

일반적으로 추천시스템에서는 Pearson corr 또는 cosine similarity를 사용한다고 알려져있으며, 여러 자료에서도 그렇게 표현되어있고 때에 따라서는 너무나 당연해서 언급조차 되어있지 않은 경우가 많다. 

때문에 본인도 딱히 의문을 품어본 적이 없었는데, 얼마전 연구실 세미나에서 measure에 따라 결과값에 영향이 있겠냐는 박사님 지적에 해당 논문을 찾아보게 되었다.

2008년에 출판된 논문이라 제법 오래된 논문이지만, 여러 measure 별로 성능 비교를 해둔 논문이기도 하고, 새로운 similarity를 제안했기 때문에 여러 논문에서 인용을 한 듯 하여 선택하게 되었다.

아직 논문 리뷰를 잘하는 편이 아니기 때문에, 리뷰 방식은 해오던 습관대로 각 절마다 그 내용을 소개하는 것으로 한다.


Abstract

논문이 써진 당시인 2008년에는 netflix prize에서 우승한 collaborative filtering(CF)이 추천시스템에서 갖게 된 위상이 매우 높았다. 저자는 CF가 갖고있는 위상을 소개하면서 동시에, CF의 주요한 특성인 similarity measure가 Pearson correlation이나 cosine 유사도에 머물러있음을 지적한다. 따라서 본 논문에서는 새롭게 heuristic similarity measure를 제안한 것이 학술적인 contribution이라할 것이고, 새로운 measure를 이용한 실험 결과 CF가 갖고있는 고질적인 문제인 cold-start problem을 가진 데이터셋에서 좀 더 나은 퍼포먼스를 보인다고 한다.


1. Introduction

저자는 e-commerce에서 CF가 갖는 위력에 대해 우선적으로 소개하고 있다. 추후 CF에 대해서만 포스팅을 하나 해야겠다. 

간단히 CF에 대해서 공부했던 바를 정리해보면, CF는 기본적으로 취향이 비슷한 User의 집단이 존재한다고 가정한다. 추천의 대상이 되는 어떤 user가 있으면, 취향이 비슷한 neighbor가 존재할 것이고 이들이 공통적으로 긍정적인 rating을 한 item을 타겟이 되는 user에게 추천하는 방식이 기본적인 아이디어이다. 때문에 CF에서는 neighbor를 찾기위해 유사도 행렬을 이용한다는 점 정도만 짚고 넘어가면 될 것 같다.

다시 돌아와서, 이 논문에서도 CF의 위력은 similarity에 있음을 이야기하고 있고, Pearson 상관계수와 같은 전통적인 벡터 similarity measure가 주로 사용되고 있어 CF의 한계인 cold start problem에서 자유롭지 못함을 지적한다. 

저자는 이러한 문제의식을 드러내며 본 논문의 취지를 밝히고 있으며 그 취지는 heuristic similarity measure의 제안으로 이어진다. 전형적이고 기본적인 골조지만 앞으로 논문 작성 시에 이러한 프레임워크를 적용한다면 좀 더 쉽게 작성할 수 있지 않을까 하는 감상이 든다. 저자는 새로 제안된 방식이 user의 item에 대한 co-ratings에 더욱 세밀하게 집중한 방식이므로, cold-start 문제를 가진 데이터에 대해 더욱 효과적인 measure가 될 수 있다고 주장한다.


2. Literature review

2절에서는 추천시스템 전반에 대한 overview와 CF에 대한 리뷰를 제공한다. 논문이 출판된지 제법 오래되었기 때문에 overview는 큰 의미 없으리라 생각하고, CF에서 사용되고 있는(또는 사용되었던) similarity measure를 정리하는 표(Table 1) 정도만 확인하고 넘어가면 될 것 같다.


Table 1의 measure들은 이후 4절의 experiment에서 비교 실험을 위해 사용된다. 본 논문은 기본적으로 cold start가 있는 신규 user의 진입 상황을 가정하므로, user-item matrix에 대해서 Table 1의 measure들은 다음의 식에 사용된다. : 

\[\overline{r_{u_a}}+\frac{\sum_{h=1}^{m'}\mathrm{sim}(u_a, u_h)(r_{u_h,i_a}-\overline{r_{u_h}})}{\sum_{h=1}^{m'}|\mathrm{sim}(u_a,u_h)|}\]


저자에 따르면 당시에 존재하던 hybrid 방식의 추천시스템들은 기본적으로 cold start problem을 우회하기 위해 content information과 ratings data를 결합하여 사용했다. 즉, 새로 진입한 user나 item에 대해서는 rating-based의 measure는 계산할 수 없기 때문에 당시의 hybrid 추천시스템들은 그러한 방식을 채택했다는 것이다. 

그런데 이러한 당시의 연구 목적과 달리 본 논문에서는 rating record가 '적은' 상황을 가정한 것이며, hybrid RS에서처럼 추가적인 information을 요구하지 않는다. 따라서 기존의 CF에 대해 measure만 변경하여 모델링하면 되기 때문에 저자는 이러한 효율적인 연구목표를 설정한 듯 하다.


3. A new similarity measure

3.1 Diagnosis of the limitations of existing similarity measure

새로운 제안에 앞서, 우선 저자는 기존 measure들이 갖고 있는 문제점을 지적한다. 우선 COR(Pearson's)과 COS(Cosine similarity)는 근본적으로 cold-start에 취약할 수 밖에 없음을 지적한다. 

예컨대 데이터셋의 sparsity level이 0.90이라면, 그러니까 현존하는 <user-item> rating matrix R에 10% 수준의 rating만이 존재한다고 했을때 + 타겟 user가 고작 5개의 item만을 구매했다고하면(이 부분이 정확한지는 모르겠다. 단순히 a user라고 지칭하고 있는데, 아마도 추천을 타겟팅할 user를 이야기하는 것 같다.), COR이나 COS를 계산하는 것이 거의 불가능한 상황이 된다.

이러한 상황을 간략히 정리해보면 다음과 같다. : 

(1) Sparse matrix에서는 co-ratings을 계산하는 것이 매우 제한적이다.

(2) user-user간에 co-rating한 item이 단지 1개에 불과하다면, 기본적으로 COR은 계산될수조차 없고, COS는 co-rating이 어떤 값을 취하든 1의 값을 갖는다.

(3) user에 의해 주어진 rating이 item 별로 모두 같은 경우(논문에서는 flat이라고 표현했음) COR은 계산될 수 없고, 그 외의 correlation formula들은 0으로 계산된다.

(4) 각 user-item rating vector가 평행한 경우(e.g. <2,2> and <3,3>) COS는 1의 값을 갖는다.

(5) 결론적으로 COR과 COS 모두 서로 성향이 완전히 다른 user를 neighbor로 잘못 계산할 수 있다.

또한 (1)~(5)의 문제점들은 dataset이 sparse할수록 더 심각한 문제를 야기한다. 개인적으로 이러한 COR과 COS에 대한 문제점을 단순한 plot(Fig. 1.)으로 표현하여 직관성을 높인 부분이 배울 점이라고 생각한다.

이후의 내용은 실험에 사용될 dataset들이 이러한 문제에 취약하다는 점을 지적하는 내용이므로, 리뷰에서는 생략한다.


3.2 A new similarity measure for CF systems : PIP measure

3.1절에서 COS, COR의 문제점을 짚었으므로, 본 논문이 제안하는 PIP measure는 다음의 목적을 만족할 수 있도록 설계되었다. : 

(A) 제안된 measure는 cold-start recommendation 상황에서 data가 갖는 domain specific meanings를 단순히 전통적인 measure를 사용하는 것에 비해 더욱 잘 이용할 수 있어야 한다.

(B) 실용성을 위해, 제안된 measure는 쉽게 현존하는 CF system에 plug-in할 수 있어야 한다. 

(C) 제안된 measure는 cold-start condition에 있는 new user에서만 향상된 결과를 보일 뿐 아니라, non-cold-start condition에 대해서도 기존의 measure에 대비하여 쓸만한 성능을 보여야 한다.

위와 같은 목적으로 제안된 PIP measure는 Proximity, Impact, Popularity 의 세가지 요소로 이루어지게 되었다.

PIP measure는 user \(i\)와 user \(j\)에 대한 similarity를 다음과 같이 계산한다. : 

\[\mathrm{sim}(u_i,u_j) = \sum_{k\in C_{i,j}} \mathrm{PIP}(r_{ik}, r_{jk})\]

수식에서 \(r_{ik}\)는 user \(i\)의 item \(k\)에 대한 rating이고, \(C_{i,j}\)는 user 간의 co-rated item set이다.
이때, \(\mathrm{PIP}(r_1, r_2)=proximity(r_1, r_2) \times Impact(r_1, r_2) \times Polularity(r_1, r_2)\) 으로 계산된다.

각각의 요소를 Fig. 3.과 Table2에서 description 하고 있다. 결과적으로는 user가 item에 부여한 각각의 rating을 경우에 따라 penalization 하거나 advantage를 부여함으로써 similarity를 입체적으로 계산한다는 감상을 받게 되었다. 이런 점에서 제안된 PIP measure가 heuristic measure라고 저자는 주장하는 듯하다. 



2021년 5월 9일 일요일

[미완성][추천시스템/기초] MovieLens 데이터셋에 대해.

Analysis of MovieLens dataset(begginers')

여러 추천시스템 관련 연구를 살펴보면, dataset으로 GroupLens에서 배포하는
MovieLens 데이터셋을 이용하는 경우가 대부분이다.

본 게시글에서는 추천시스템 연구에 앞서 MovieLens 데이터셋 중 가장 작은 데이터셋인
'ml-latest-small'에 대한 기초적인 수준의 EDA를 진행하고자 한다(데이터셋 다운로드 경로).

나중에 포트폴리오를 블로그에 천천히 작성할 예정이지만, 필자는 분석 경험이 매우 짧은 편이며 속해있는 연구실 또한 추천시스템을 전문적으로 다루는 연구실이 아니라 데이터마이닝 연구실이다.

혹시라도 전문적인 수준의 글을 접하고 싶어 찾아오셨다면 뒤로가기 해주셔도 좋고,
이녀석 어떤 실수를 했나 구경이나 해볼까 싶으셔서 읽게 되셨다면,
여러 지적해주시면 좋겠다.


Data EDA

분석 환경은 구글 Colab이다.

# 데이터 경로 설정
path = '/content/drive/MyDrive/ml-latest-small/'

# ml-latest-small의 구성
os.listdir(path)
['ratings.csv', 'tags.csv', 'movies.csv', 'links.csv', 'README.txt']

ml-latest-small dataset은 총 4개의 csv 파일로 구성되어있다. 
각 파일에 대한 shape와 head를 찍어보면 아래와 같다.
각 데이터에 대한 설명은 데이터셋의 zip파일에서 readme를 반드시 읽어보길 권한다.

print(ratings_df.shape)
print(ratings_df.head())
(100836, 4)
   userId  movieId  rating  timestamp
0       1        1     4.0  964982703
1       1        3     4.0  964981247
2       1        6     4.0  964982224
3       1       47     5.0  964983815
4       1       50     5.0  964982931

print(tags_df.shape)
print(tags_df.head())
(3683, 4)
   userId  movieId              tag   timestamp
0       2    60756            funny  1445714994
1       2    60756  Highly quotable  1445714996
2       2    60756     will ferrell  1445714992
3       2    89774     Boxing story  1445715207
4       2    89774              MMA  1445715200

print(movies_df.shape)
print(movies_df.head())

(9742, 2)
                                      title                                       genres
movieId                                                                                 
1                          Toy Story (1995)  Adventure|Animation|Children|Comedy|Fantasy
2                            Jumanji (1995)                   Adventure|Children|Fantasy
3                   Grumpier Old Men (1995)                               Comedy|Romance
4                  Waiting to Exhale (1995)                         Comedy|Drama|Romance
5        Father of the Bride Part II (1995)                                       Comedy

print(links_df.shape)
print(links_df.head())

(9742, 3)
   movieId  imdbId   tmdbId
0        1  114709    862.0
1        2  113497   8844.0
2        3  113228  15602.0
3        4  114885  31357.0
4        5  113041  11862.0

구체적인 EDA에 앞서 데이터셋의 구성 중 PK(Primary Key)가 될법한 변수명들이 눈에 띄어 다른이가 그려둔 ERD가 없을까 찾아보게 되었다. 

사실, ERD를 그려보는 것이 데이터셋 각각에 대한 EDA를 진행하는 것에 도움이 될까 싶긴
하지만 내 기초지식의 일부가 산업시스템공학에 존재하므로 그냥 또 '츄라이' 해본다.

그 중 Github에 vivek-bombatkar란 유저가 ERD를 작성한 것을 보았다. (링크)

genom_tags와 genome_scores를 제외하고 바라보면, 현재 우리가 아무 모델링도 가하지
않은 상태의 데이터셋과 일치하는 ERD가 된다. EDA에 앞서 ERD를 수행하는 모습은 일전에 dacon 대회에 참여했을 때 어떤 유저가 사용하는 것을 보고 지금 여기서도 해보게 되었는데, 확실히 데이터셋에 대해서는 직관성을 더 해주는 것 같다. 앞으로도 애용해야 할 듯 하다.

ratings_df의 info를 살펴보면 아래와 같다. 결측값의 존재 여부도 확인한다.

ratings_df.info() 
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 100836 entries, 0 to 100835
Data columns (total 4 columns):
 #   Column     Non-Null Count   Dtype  
---  ------     --------------   -----  
 0   userId     100836 non-null  int64  
 1   movieId    100836 non-null  int64  
 2   rating     100836 non-null  float64
 3   timestamp  100836 non-null  int64  
dtypes: float64(1), int64(3)
memory usage: 3.1 MB

# 결측값의 수 확인
ratings_df.isnull().sum()

userId       0
movieId      0
rating       0
timestamp    0
dtype: int64

다음으로 user의 movie에 대한 평가횟수 / rating의 평균 / rating의 편차를 확인한다.

movieid_user_df = pd.DataFrame({
    'no_user_wat': ratings_df.groupby('movieId')['userId'].count(),
    'ratings_mean': ratings_df.groupby('movieId')['rating'].mean(),
    'ratings_std': ratings_df.groupby('movieId')['rating'].std()
})
movieid_user_df = movieid_user_df.reset_index()
print(movieid_user_df.shape)
print(movieid_user_df.head(10))


(9724, 4)
   movieId      no_user_wat  ratings_mean  ratings_std
0        1              215     3.920930     0.834859
1        2              110     3.431818     0.881713
2        3               52     3.259615     1.054823
3        4                7     2.357143     0.852168
4        5               49     3.071429     0.907148
5        6              102     3.946078     0.817224
6        7               54     3.185185     0.977561
7        8                8     2.875000     1.125992
8        9               16     3.125000     0.974679
9       10              132     3.496212     0.859381

rating이 부여된 횟수(no_user_wat)를 x축으로 하여 분포를 확인하면 아래와 같다.
추천시스템 관련 연구에서는 sparse dataset의 형태를 거르고 넘어갈 수 없다.

movieid_user_df['no_user_wat'].hist()




(내용 추가 예정)

-------------------------------------



우선 여기까지 하고 게시글을 잠시 멈춘다.
분석 목표에 따라 EDA는 다르게 진행되어야 한다.

장르별 분석이 목표라면 링크의 kaggle 자료를 참고해도 좋을 듯 하다(링크).

2021년 5월 7일 금요일

[미완성][논문 리뷰] PSO(Particle Swarm Optimization)를 이용한 SVM parameter 튜닝 관련 논문

Support vector machine parameter tuning based on particle swarm optimization metaheuristic. 

(Korovkinas K., Danėnas P. and Garšva G. (2020) “Support vector machine parameter tuning based on particle swarm optimization metaheuristic”, Nonlinear Analysis: Modelling and Control, 25(2), pp. 266–281. doi: 10.15388/namc.2020.25.16517.)

이 논문을 리뷰하게 된 까닭은, 현재 수강중인 비선형최적화 강의의 과제를 위해서이기도 하지만 좀 더 확장하여 modified SVM based RS를 구현하는 것에 그 목적이 있다. 논문 선정 기준은 우선 비선형최적화에 대한 주제를 담으면서도, RS에 적용가능한 모델에 적용가능하고, Q1, SCI급 논문인 것으로 선택했다. 

기준은 교내 포탈에서 제공하는 JCR 랭킹,
검색엔진은 http://www.webofscience.com 를 이용했다. 

(Abstract) 

본 논문은 Particle swarm optimization metaheuristic을 이용한 linear SVM의 parameter tuning을 소개함. 해당 방법은 SVM을 이용한 텍스트 데이터의 분류 정확도 향상을 위해 최적 코스트의 parameter를 찾아줌. 추가적으로, majority voting based ensembling 방법이 제안된 방법의 효율성을 증가시키기위하여 적용되었음.

1 Introduction

SVM은 감성 분류 문제에 가장 자주 쓰이는 ML 알고리즘이며, 여러 고난도의 도메인에서 그 성능을 증명해왔음. 

그러나, 현재 시류에서 사람이 그 수준을 결정하는 manual hyper-parameter selection을 위한 그 어떤 휴리스틱 규칙이나 SVM을 위한 rules of thumb도 제공되지 못했음.

대부분 이러한 hyper-parameter 튜닝에 있어서는, 대부분이 몇가지 휴리스틱 알고리즘을 이용하는데, 유전 알고리즘 또는 이 리뷰의 주제가 되는 PSO(Particle Swarm Optimization), colony optimization 등이 그러한 알고리즘임.

이 중 PSO는 다른 진화 알고리즘과 결합되었을 때 더 좋은 성능을 내는데, [47]의 경우가 좋은 예시임.

앙상블 분류 모형은 자주 쓰이지만, 단일 모형에 비해 오히려 성능이 떨어지는 경우가 많음. 저자는 [4]의 ensemble voting 알고리즘이 감성 분류 문제에서 좋은 성능을 보였다는 것에 동기를 부여받아 텍스트 데이터 분류 문제에서의 LSVM(Linear SVM) 성능을 단순한 방법을 이용해 개선코자 함.

2 Relevant algorithms

2.1 Support vector machines

SVM에 대해서는 다른 게시물에서 다루는 중이며 지속 업데이트 될 예정이다. 본 게시글에서는 간단히만 다루도록 한다.

본 논문의 linear SVM은 학습데이터가 매우 커다랄 때를 목적으로 최적화된다. 

훈련 벡터집합 \(x_i\in\mathbb{R}^n\), \(i=1, ... , l\)이 2클래스 집합이고, 분류문제 \(y\in\mathbb{R}^l\)이 \(y_i=\{1,-1\}\)라고 했을 때, 결정 함수(결정 경계의 함수)는 다음과 같다: 

\[sgn(w^Tx)\]

이후 논문에서는  L2 정규화된 L1 loss SVC(support vector classifier)가 해결하는 primal problem과 L2 정규화된 L2 loss SVC가 해결하는 primal problem의 dual representation 된 형태가 주어져 있다. 결과적으로는 L1-정규화가 sparse solution \(w\)를 generate한다. SVM은 기본적으로 결정경계를 찾는 것이 목표이므로, 본 논문에서의 linear SVM 또한 동일한 목적을 갖는다.

2.2 PSO(Particle Swarm Optimization) 알고리즘

PSO 자체는, 따로 게시글을 만들어 다뤄보아야 할 것 같다. 직관적인 이해는 어느정도 했으나, 역시나 수식이 문제다. 우선은 논문에서 다룬 수준에서 겉핥기라도 해보는 것이 좋겠다.

우선 PSO는 논문 reference의 [11]에서 소개된 이론이다. 주로 Genetic algorithm과 비교되는 편인데, 그 이유는 조금 더 찾아보아야겠다. 아마도, optimizer로 사용되는 메타휴리스틱 알고리즘 계열이지 않을까 싶다. NP-hard 문제들에도 제법 많이 사용되는 것으로 보았을 때 objective가 같기 때문일것도 같다. 

PSO는 간단히 말해 개별 입자가 서로 다른 속도(방향의 개념이 포함)로 움직이면서, 개별 입자의 best fit을 찾아나가는 알고리즘이다. 

\(t\)를 discrete time step이라고 할 때, \(a_i(t)\)는 i번째 입자의 위치이고, 이 때 i의 속도는 \(v_i(t)\)이다. 수식으로 나타내면 다음과 같다. : 

\[a_i(t+1)=a_i(t)+v_i(t+1)\]

이때, \(a_i(0)\sim\mathrm{U}(a_{min}, a_{max})\)인데, 어떤 논문 중에서는 이 초기값의 위치를 K-means 등을 이용해 설정하기도 하는 듯하다. 그렇다면 아마도 GMM을 이용한 방법론을 소개한 논문도 있을 것이라 생각된다.

아무튼 이때 속도 \(v_i(t)\)는 개별 입자에 대한 경험적 지식과 그 입자 주변의 이웃 입자의 정보 변화에 모두 영향을 받는다는 가정을 한다. 때문에 Global Best PSO에서 입자 i의 속도는 다음과 같이 계산되고, 앞선 가정은 \(c_1\), \(c_2\)를 통해 수식에서 구현된다. :

\[v_{ij}(t+1)=v_{ij}(t)+c_1r_{1j}(t)[b_{ij}(t)-a_{ij}(t)]+c_2r_{2j}(t)[\widehat{b}_{j}(t)-a_{ij}(t)]\]

수식에서 확인할 수 있듯이, 이때의 i번째 입자가 j번째 차원(\(j=1, ... , n_a\))에서 t-step에서 갖는 속도는 \(v_{ij}(t)\)로 나타낼 수 있다. 

언급했듯이, \(c_1\), \(c_2\)는 속도에 영향을 주는 경험적 + 근접이웃에 의해 결정되는 상수이다. 이 부분도 사실 자세한 조사가 필요하다. 결국은 처음 PSO를 제안한 논문을 확인해야 할 것 같다. 당장에 드는 의문은 이러한 상수 또한 일종의 parameter로 보인다는 것이다. 

\(r_{1j}(t), r_{2j}(t)\sim\mathrm{U}(0,1)\)는 stochastic element를 해당 수식에 부여하는 역할이다.

그리고, \(b_i\)는 personal best position이라 명명된 것으로, 최초의 t-step으로부터 마지막 t-step까지 i번째 입자가 방문했던 모든 position 중 가장 best 인 position을 일컫는다. \(t+1\) 단계에서의 personal best position은 다음과 같이 계산된다. : 

\[\begin{cases}b_i(t) & \text{if  } f(a_i(t+1)) \geq f(b_i(t)) \\ a_i(t+1) &\text{if  } f(a_i(t+1)) < f(b_i(t))\end{cases}\]

이때의 함수 \(f : \mathbb{R}^n_{a} \to \mathbb{R}\)는 fitness function으로, 진화 알고리즘과 같이 사용되는 경우에는 이 함수가 현재의 해가 최적해에 얼마나 근접했는지를 나타낸다. 그러니까, 이 함수가 particle의 퍼포먼스 또는 품질을 measure한다. 관련 reference가 논문의 [12]이다.

결과적으로 global best position인 \(\widehat{b}(t)\)는 t-step에서 다음과 같이 정의된다 : 

\[\widehat{b}(t)\in\{b_0(t), ... , b_{n_s}(t)\}, f(\widehat{b}(t))=\min\{f(b_0(t)), ... , f(b_{n_x}(t))\}\]

이때, \(n_s\)는 swarm에 속한 particle의 총 갯수이다. 

이상으로, 간단한 수준에서 PSO를 살펴보았다. 이론의 사상은 마치 새 떼나 정어리 떼에 비유할 수 있지 않을까 싶고, 수식화 되었다는 것이 흥미롭다. 특히 관심갖게 되는 속성으로는 개별 입자의 속도가 아닐까 싶은데, 매 시점마다 그 속도가 달라진다는 점에서 일반적으로의 속도에 빗대기는 어려워보인다. 허무맹랑한 상상일지 모르겠으나, 속도 외에 다른 물리적인 속성을 부여하면 또 완전히 다른 알고리즘이 탄생할 수 있지 않을까 싶기도 하다.

3 Proposed Method

(내용 추가 예정)

















2021년 5월 6일 목요일

[미완성][ML/이론] Support Vector Machine 에 대한 공부

Support Vector Machine

오늘 다뤄볼 주제는 SVM이다. 여러 분야에서 가장 기초적인 수준의 분류기로 쓰이고,
또 복잡한 문제에서도 적용가능하므로 그 성능이 탁월하다.
다른분들이 정리해둔 글들 중 Yoo Jaejun님의 블로그 글이 요약이 잘 되어있다.
* 주소 : http://jaejunyoo.blogspot.com/2018/01/support-vector-machine-1.html

이 분은 MIT OCW를 보고 내용을 정리하셨다고 한다. 
(https://www.youtube.com/watch?v=_PwhiWxHK8o&t=6s)

내가 주로 참고한 자료는 크리스토퍼 비숍의 '패턴 인식과 머신 러닝'이고,
그 중 챕터 7. 희박한 커널 머신이다.

'희박한' 커널 머신의 서론

우선, SVM은 희박한(sparse) 해를 갖는 커널 기반 알고리즘이며, 새 입력값에 대한 예측은 훈련 데이터 포인트의 부분집합에 대해 계산한 커널 함숫값에만 종속적이게 된다. 

'희박한' 해를 갖는다는 것의 의미가 뭘까? 때에 따라 희박한 모델이라는 표현은 어떤 계수가 0이 되는 형태의 모델을 일컫기도 한다. SVM이 희박한 해를 갖는 것은 SVM이 훈련집합의 subset, 그러니까 서포트 벡터들에 의존적인 성질을 갖는 것으로부터 기인한다.

이러한 희박성(sparsity)은 ML 알고리즘에서 유리한 성질이 되는데, 문제 크기가 증가하더라도 선형 알고리즘에 비해 coefficient가 0이 되는 변수의 수가 더 천천히 증가하기 때문에 계산이 빠르다는 장점이 있다. 응용에 있어서는, 어쨌건 SVM은 고차원에서도 효율적인 연산이 가능하다는 것을 떠올리면 좋을 것 같다. 이런 점에서 앞서 언급한 sparse와는 다소 의미가 다르지만, 추천시스템에서의 경우 high dimensional sparse dataset을 훈련집합으로 사용하게 되므로, FM 계열의 알고리즘과 마찬가지로 효율적이라고 한다. 이 건은 추후 프로그래밍을 통해 비교해보는 것은 어떨까 싶다.

SVM의 중요한 성질 중 하나는 볼록 최적화(convex optimization) 문제를 푸는 것을 바탕으로 모델 매개변수를 결정할 수 있다는 점이라고 한다. 풀어서 설명하면, local optima가 global optima가 될 수 있다는 것으로 설명된다. 사실, 이 부분을 완전히 이해하지는 못했으므로 읽어봄직한 자료를 미리 첨부해둔다. (https://wikidocs.net/book/1896)
현재 수강중인 '비선형최적화' 과목을 위해서도 해당 내용은 따로 정리할 필요가 있다.

SVM은 라그랑주 승수법(Lagrange multiplier)을 광범위하게 사용하는 머신이다. 라그랑주 승수법은 하나 또는 그 이상의 제약 조건하에서 여러 변수에 대한 함수의 임계점을 찾는 데 사용된다. 라그랑주 승수법 또한 한번 쯤 다루고 넘어가야 할 주제이다. 특히 부등식 조건에서 Karush-Kuhn-Tucker 조건을 다루게 되는데, 여러 논문에서 종종 등장하므로 관련해서 정리해보아야겠다.

SVM은 결정론적 알고리즘이다. 때문에 사후 확률을 내놓지는 않으므로, 사후 확률에 대한 출력값이 필요하다면 동일한 희박한 커널 테크닉에서는 베이지안 기반의 RVM(relevance vector machine)을 사용하거나 확률적 알고리즘을 사용해야한다.

최대 마진 분류기

아래 형태의 2클래스 분류 문제를 예시로 들도록 한다.

\[y(x)=w^T\phi(x)+b\]

\(\phi(x)\)는 고정된 특징 공간 변환을 지칭(쉽게 말해 특징벡터라고 생각하자)하며, \b는 편향 매개변수이다. 이 문제를 듀얼 표현법을 이용해 표현하면, 결과적으로는 모델 전체를 커널에 의한 표현으로 바꿔줄 수 있다는 점을 기억해두자.

일단 훈련 데이터 집합은 특징 공간상에서 선형적으로 분류가 가능하다는 가정이 필요하다. SVM은 이 가정하에 클래스 분류 문제의 해를 margin의 콘셉트를 바탕으로 접근한다. margin이란 결정 경계(decision boundary)와 표본 사이의 최소 거리를 지칭한다. SVM은 이 margin이 최대가 되는 결정 경계를 선택한다. 결과적으로 이렇게 결정된 결정 경계의 위치는 데이터 포인트들의 부분집합을 바탕으로 결정되는 것인데, 이 부분 집합을 서포트 벡터라고 한다.

\(y(x)=0\)에 해당하는 초평면으로부터 포인트 \(x\)까지의 수직 거리는 \(|y(x)/||w||\)로 주어지게 된다. 우리는 2클래스 분류 문제에서 '모든' 데이터 포인트들이 올바르게 분류될 수 있는 해에만 관심이 있다. 결과적으로 포인트 \(x_n\)으로부터 결정 표면까지의 거리는 다음과 같다. :

\[\frac{t_ny(x_n)}{||w||} = \frac{t_n(w^T\phi(x_n)+b)}{||w||}\]

margin은 데이터 집합의 포인트들 중 결정 표면에 가장 가까운 \(x_n\)으로부터 결정 표면까지의 수직 거리로 주어지며, 이 거리를 최대화하는 방식으로 매개변수 \(w\)와 \(b\)를 최적화한다. 


(추후 내용 추가)









[Git] Trailing comma의 용도

 현재 저는 사내에서 개발자 교육을 받고 있습니다. 오늘의 포스팅은 해당 교육 중 과제를 통해 알게 된 Trailing comma에 대한 내용입니다.  2022-04-03, SSG TECH101 과정 중 Git 수업 Title : About Trail...