본문 바로가기
Machine Learning/차원 축소

[차원 축소] t-분포 확률적 임베딩(t-SNE)을 알아보자

by 서원두 2022. 8. 16.

차원 축소의 한 기법으로 쓰이는 t-SNE에 대해서 알아보자.

아래의 내용은 내 졸업 논문의 내용을 일부 차용했으며, 세간에 알려진 t-SNE에 대한 일부 잘못된 정보를 바로 잡는 것도 목표로 삼는다.

 


선형적 차원 축소의 한계와 t-SNE의 목표

일단 아주 단순하게 차원 축소를 진행한다고 생각한다면, 사영(projection)이 떠오를 것이다. 다음으로는 주성분 분석(PCA)도 있을 것이다. 주성분 분석에 대해서는 아래의 글에 잘 설명해뒀으니 시간이 있다면 참고 바란다.

위의 두 방법 모두 선형적인 차원 축소 기법이다. 장점으로는 빠르고 축소된 차원의 설명이 어느 정도 가능함이 있다.

하지만 위의 두 선형 차원 축소 기법의 단점이 있는데, 바로 축소를 위해 일부 정보가 손실되어야 한다는 점이다.

사영의 경우 축 하나의 정보가 통째로 날아가버리며, 주성분 분석도 전체 eigenvalue의 특정 비율만큼의 해당되는 eigenvector의 정보가 사라진다.

아무리 적은 손실이라도 손실은 손실이다. 차원 축소로 인한 정보 손실로 인해 데이터의 일부를 설명할 수 없는 것은 큰 문제임을 알아야 한다.

이를 해결하기 위해서 "데이터 그룹끼리 모이면서 정보는 최대한 손실 없게 하자!"라는 목표를 가진 것이 바로 비선형적 차원 축소의 한 방법인 t-분포 확률적 임베딩(t-SNE, Student's t-distribution Stochastic Neighbor Embedding)이다.

사영과 t-SNE의 차이


t-SNE의 목표는 기존 방법이었던 SNE의 문제점이었던 군집 문제와 데이터 간 차이를 크게 내지 못했던 것을 t-분포를 이용하여 보완하는 것이다.

즉, 다시 말하면 t-SNE는 t-분포를 이용해 확률적인 방법으로 접근하여 고차원에서 가까운 거리인 데이터는 저차원에서도 가깝게, 고차원에서 먼 거리인 데이터는 저차원에서도 멀게 임베딩 하는 것이다.

 

t-SNE의 작동 메커니즘

위의 일을 하기 위해선 4단계를 거쳐야 한다. 이를 위해 고차원 데이터 포인트 집단 $ X = \{...,\,x_i,\,x_j,\,...\} $와 저차원 데이터 포인트 집단 $ Y = \{...,\,y_i,\,y_j,\,...\} $가 있다고 치자. 아랫 첨자가 같다면 차원만 다르고 같은 데이터임을 뜻한다.

1. 고차원에서의 모든 데이터 포인트에 대한 거리를 구한다. 예를 들어 $ x_i $와 $ x_j $의 거리를 구하는 경우, 식 (1)과 같이 정규분포 $ \mathcal{N} \sim (0, \sigma) $에서의 확률 $ p_{ij} $로 구한다.

$ \displaystyle p_{ij} = \displaystyle\frac{exp(-|| x_i-x_j || ^ {2}/2 \sigma ^ {2})}{\displaystyle\sum_{k \neq l} exp(-|| x_k-x_l || ^ {2}/2 \sigma ^ {2})} \;\cdots\; (1) $

여기서 $ x_k $와 $ x_l $은 고차원에서의 모든 데이터 포인트이고, 자기 자신을 제외한 모든 거리를 모든 고차원 데이터 포인트에 대해서 합을 한 것이 분모에 들어간다. 분자에는 두 개의 특정 고차원 데이터 포인터의 거리를 구한다.


2. 또한 축소된 차원에서의 모든 데이터 포인트에 대한 거리를 구한다. 예를 들어 $ y_i $와 $ y_j $의 거리를 구하는 경우, 식 (2)와 같이 자유도가 1인 t-분포에서의 확률 $ q_{ij} $로 구한다.

$ \displaystyle q_{ij} = \displaystyle\frac{(1+|| y_i-y_j || ^ {2})^ {-1}}{\displaystyle\sum_{k \neq l} (1+|| y_k-y_l || ^ {2})^ {-1}} \;\cdots (2)\; $

이 수식은 1. 에서의 식 (1) 아래의 설명에서 고차원을 저차원으로 바꾸면 된다.


3. 앞서 구한 고차원에서의 데이터 포인트 거리 $ p_{ij} $와 저차원에서의 데이터 포인트 거리 $ q_{ij} $가 유사해지도록 식 (3)의 cost function $ C $를 사용한다.

$ \displaystyle C = D_{KL}(P\,|| Q) = \displaystyle \sum_{i} \sum_{j} p_{ij} \: log \frac{p_{ij}}{q_{ij}} \;\cdots\; (3) $

여기서 $ D_{KL} $은 Kullback-Leibler divergence다.


4. 위의 cost function $ C $가 적절한 수렴 조건에 도달할 때까지 저차원 데이터 포인트 $ y_i $를 계속 갱신한다.

 

왜 t-분포를 사용했는가?

앞서 이야기한 부분 중에, t-SNE는 기존 SNE에서 t-분포를 써서 개선을 한 것이라고 말한 부분이 있다.

SNE에서는 정규분포인 $ \mathcal{N} $을 썼다. 정규분포와 t-분포의 차이가 있고, 그 차이점은 정규분포보다 t-분포가 두터운 꼬리 분포(heavy-tailed distribution)를 가졌다는 것이다.

정규분포는 격차가 커질수록 그에 따른 확률 격차가 크게 벌어지지 않지만, t-분포에서는 그 격차를 정규분포보다 더 크게 할 수 있다.

정규분포와 t-분포의 차이

 

의문점 1. 꼭 t-분포를 써야만 했는가?

그렇다면 이런 의문이 든다. 정규분포 $ \mathcal{N} \sim (0, \sigma) $에서 $ \sigma $가 커지면 t-분포처럼 두꺼운 꼬리 분포가 나타나 t-분포와 비슷하게 작동할 수 있다. 그렇다면 수식이 더 간편한 정규분포를 쓰면 되는데, 왜 굳이 자유도가 1인 t-분포를 써야 했을까?

이는 cost function의 차이 때문에 그렇다.

먼저, 선행 연구 모델이었던 SNE에서의 저차원 데이터 포인트의 수식(t-SNE 과정 2.)을 살펴보면 식 (4)와 같다. 고차원 데이터 포인트의 수식은 같다.

$ \displaystyle q_{ij} = \displaystyle\frac{exp(-|| y_i-y_j || ^ {2})}{\displaystyle\sum_{k \neq l} exp(-|| y_k-y_l || ^ {2})} \;\cdots\; (4) $

이를 Kullback-Leibler distribution을 이용한 cost function $ C $에 적용하고 저차원 데이터 포인트 $ y_i $에 대한 gradient를 구하면 식 (5)로 나온다.

$ \displaystyle\frac{\delta C_{SNE}}{\delta y_i} = 4 \displaystyle\sum_{j}(p_{ij}-q_{ij})(y_i-y_j) \;\cdots\; (5) $

반면 자유도가 1인 t-분포가 적용된 t-SNE의 cost function $ C $의 $ y_i $에 대한 gradient는 식 (6)이 된다.

$ \displaystyle\frac{\delta C_{t-SNE}}{\delta y_i} = 4 \displaystyle\sum_{j}(p_{ij}-q_{ij})(y_i-y_j)(1+||y_i-y_j||^2)^{-1} \;\cdots\; (6) $

t-SNE cost function $ C_{t-SNE} $의 gradient에 $ (1+||y_i-y_j||^2)^{-1} $이 더 붙은 것을 알 수 있다. gradient에 이 수식이 없는 SNE cost function $ C_{SNE} $는 가까운 포인트끼리 끌어당기지만 먼 포인트들끼리 밀어내지 못하는 반면 이 수식이 있는 t-SNE cost function $ C_{t-SNE} $는 가까운 저차원 데이터 포인트들은 더욱 가깝게 모아주고 먼 포인트들은 더욱 밀어낸다.

즉, 단순히 두꺼운 꼬리 분포를 쓴 것 이외에도 cost function의 차이로 인해서 사용하는 부분이 있어서 t-분포를 사용한 것이다.

 

의문점 2. t-SNE는 3차원까지만 축소 가능한가?

결론부터 말하면 절대 아니다.

이런 오해는 주로 scikit-learn에 내장된 tsne 함수에서 왔다고 본다. 이 함수는 축소 가능한 차원을 1, 2, 3으로만 제한을 걸어뒀고, 이는 t-SNE가 1~3차원으로만 차원 축소가 가능하다고 오해하게 된 계기가 되지 않았나 싶다.

이는 t-SNE의 한계에 의한 단점으로 인해 scikit-learn 패키지에서 제한한 것을 잘못 이해한 것이다.

이론적으로 t-SNE는 모든 차원으로 차원 축소가 가능하다. 그냥 $ y_i $의 차원을 4로 잡으면 4차원으로 축소시킨 거다. 다만 앞서 말한 scikit-learn의 tsne 함수 기능으로 인해 그런 오해가 생긴 것이다.

 

t-SNE의 장점과 단점

장점은 아래와 같다.

  1. 고차원의 데이터를 확률 거리라는 개념을 이용해 정보 손실 없이 차원을 축소시킨다.
  2. 가까운 포인트끼리는 가깝게 하고 먼 포인트끼리는 밀어내는 cost function $ C $로 인해 데이터 그룹화가 더 쉽게 된다.

단점은 아래와 같다.

  1. 비선형 차원 축소이기 때문에 축소된 차원에서의 축의 의미가 사실상 없다.
  2. iterable한 cost function 수렴 조건과 매개변수(parameter) 설정으로 데이터 그룹화의 정도를 본인이 직접 돌려보고 정해야 한다.
  3. 모든 데이터 포인트 간의 거리를 구해야 하기 때문에 데이터의 수가 클수록 계산 시간이 커진다.

특히 단점 2번 때문에 실시간으로 들어오는 데이터에 대해 적용하기 어려워진다. 그래서 t-SNE는 주로 시각화같이 데이터가 확정된 경우에 대해서 사용한다. 그리고 시각화는 우리의 시각으로 보여야 효과가 극대화되기 때문에 scikit-learn에 있는 tsne 함수에서 적용 가능한 축소 차원이 1, 2, 3밖에 없다고 추측된다.

물론 매개변수와 iterable 정도 등을 전부 고정하고 사용하면 실시간 데이터 처리를 하며 사용은 가능하나, 문제가 있다면 이 모델은 데이터 수에 비례해서 걸리는 시간도 길고, 무엇보다 축의 의미가 사실상 없기 때문에 설명력이 매우 떨어진다. 그래서 굳이 t-SNE를 파이프라인의 한 단계로 쓰는 것은 절대 좋은 방법이 아니다.

 

응용 사례 : 20채널 EEG 신호의 2차원 시각화

이 응용 사례는 실제 내 연구를 바탕으로 한다.

20채널 EEG는 말 그대로 데이터의 차원이 20차원이라서 우리가 볼 수 있는 방법이 없다. 이를 t-SNE로 시각화한 것이다.
이 EEG 데이터에는 일반 노인과 뇌졸중 환자의 것이 같이 있었는데, 앞서 서술한 t-SNE의 특성을 이용하여 차원 축소를 시행하였다.

20차원 EEG 데이터의 2차원 시각화 결과

놀랍게도 일반 노인의 EEG 데이터와 뇌졸중 환자의 EEG 데이터가 끼리끼리 잘 모였으며, 커널 트릭 등으로 분류 가능성이 있다는 것을 검증해냈다.



궁금한 점이나 잘못된 부분이 있다면 언제든지 댓글 달아주시길 바란다.

728x90

댓글