차원 축소의 한 기법으로 쓰이는 t-SNE에 대해서 알아보자.
아래의 내용은 내 졸업 논문의 내용을 일부 차용했으며, 세간에 알려진 t-SNE에 대한 일부 잘못된 정보를 바로 잡는 것도 목표로 삼는다.
선형적 차원 축소의 한계와 t-SNE의 목표
일단 아주 단순하게 차원 축소를 진행한다고 생각한다면, 사영(projection)이 떠오를 것이다. 다음으로는 주성분 분석(PCA)도 있을 것이다. 주성분 분석에 대해서는 아래의 글에 잘 설명해뒀으니 시간이 있다면 참고 바란다.
위의 두 방법 모두 선형적인 차원 축소 기법이다. 장점으로는 빠르고 축소된 차원의 설명이 어느 정도 가능함이 있다.
하지만 위의 두 선형 차원 축소 기법의 단점이 있는데, 바로 축소를 위해 일부 정보가 손실되어야 한다는 점이다.
사영의 경우 축 하나의 정보가 통째로 날아가버리며, 주성분 분석도 전체 eigenvalue의 특정 비율만큼의 해당되는 eigenvector의 정보가 사라진다.
아무리 적은 손실이라도 손실은 손실이다. 차원 축소로 인한 정보 손실로 인해 데이터의 일부를 설명할 수 없는 것은 큰 문제임을 알아야 한다.
이를 해결하기 위해서 "데이터 그룹끼리 모이면서 정보는 최대한 손실 없게 하자!"라는 목표를 가진 것이 바로 비선형적 차원 축소의 한 방법인 t-분포 확률적 임베딩(t-SNE, Student's t-distribution Stochastic Neighbor Embedding)이다.
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-분포에서는 그 격차를 정규분포보다 더 크게 할 수 있다.
의문점 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의 장점과 단점
장점은 아래와 같다.
- 고차원의 데이터를 확률 거리라는 개념을 이용해 정보 손실 없이 차원을 축소시킨다.
- 가까운 포인트끼리는 가깝게 하고 먼 포인트끼리는 밀어내는 cost function $ C $로 인해 데이터 그룹화가 더 쉽게 된다.
단점은 아래와 같다.
- 비선형 차원 축소이기 때문에 축소된 차원에서의 축의 의미가 사실상 없다.
- iterable한 cost function 수렴 조건과 매개변수(parameter) 설정으로 데이터 그룹화의 정도를 본인이 직접 돌려보고 정해야 한다.
- 모든 데이터 포인트 간의 거리를 구해야 하기 때문에 데이터의 수가 클수록 계산 시간이 커진다.
특히 단점 2번 때문에 실시간으로 들어오는 데이터에 대해 적용하기 어려워진다. 그래서 t-SNE는 주로 시각화같이 데이터가 확정된 경우에 대해서 사용한다. 그리고 시각화는 우리의 시각으로 보여야 효과가 극대화되기 때문에 scikit-learn에 있는 tsne 함수에서 적용 가능한 축소 차원이 1, 2, 3밖에 없다고 추측된다.
물론 매개변수와 iterable 정도 등을 전부 고정하고 사용하면 실시간 데이터 처리를 하며 사용은 가능하나, 문제가 있다면 이 모델은 데이터 수에 비례해서 걸리는 시간도 길고, 무엇보다 축의 의미가 사실상 없기 때문에 설명력이 매우 떨어진다. 그래서 굳이 t-SNE를 파이프라인의 한 단계로 쓰는 것은 절대 좋은 방법이 아니다.
응용 사례 : 20채널 EEG 신호의 2차원 시각화
이 응용 사례는 실제 내 연구를 바탕으로 한다.
20채널 EEG는 말 그대로 데이터의 차원이 20차원이라서 우리가 볼 수 있는 방법이 없다. 이를 t-SNE로 시각화한 것이다.
이 EEG 데이터에는 일반 노인과 뇌졸중 환자의 것이 같이 있었는데, 앞서 서술한 t-SNE의 특성을 이용하여 차원 축소를 시행하였다.
놀랍게도 일반 노인의 EEG 데이터와 뇌졸중 환자의 EEG 데이터가 끼리끼리 잘 모였으며, 커널 트릭 등으로 분류 가능성이 있다는 것을 검증해냈다.
궁금한 점이나 잘못된 부분이 있다면 언제든지 댓글 달아주시길 바란다.
'Machine Learning > 차원 축소' 카테고리의 다른 글
[차원 축소] 주성분 분석(PCA)을 알아보자 (0) | 2022.07.28 |
---|
댓글