2015년 12월 1일 화요일

PCA(주성분분석)의 의미와 한계점

데이터가 고차원일 때 차원축소(dimensionality reduction) 방법은 데이터를 분석하고 시각화(visualize) 하는데 매우 편리한 수단을 제공합니다. 사실 우리가 관측한 데이터는 관측된 차원과는 상관없이 그 데이터 자체만의 고유한 차원이 있다고 여겨지는데요, 무슨 말인고 하니 데이터가 내부적으로 갖고있는 특성은 우리가 센서 10개로 측정하든, 100개로 측정하든 변하지 않는다는 이야기지요. (관측 상의 차원은 10차원과 100차원으로 다르지만요.)

예를 들어 우리가 4개의 회전관절로 이루어진 로봇을 관측하기 위해 각각의 관절 위치 (x,y,z)를 기록했다고 하면 우리는 아마도 매 순간마다 12차원 공간 상의 데이터를 얻게 될 것입니다. 하지만 이것을 한번 12차원 상에서 그려보면 사실 데이터를 표현하는데는 12차원이 모두 필요하지는 않음을 알게될 것입니다. 사실 데이터는 아마 12차원 공간에서 4차원의 다면체(manifold)를 형성하고 있을테지요. (원래의 데이터가 4자유도 움직임에서 비롯되었기 때문에요.)

3차원 공간 상에 존재하는 2차원 manifold (사진출처)
따라서 차원을 축소한다라는 것은 단지 고차원의 데이터가 불편하기 때문에 편의대로 마구 줄이는 것이 아니라, 관측된 차원과는 관계 없이, 원래 데이터가 갖고 있는 내재적 속성을 밝힌다라는 매우 중요한 의미를 가지고 있지요. 따라서 차원 축소는 차원이 줄어듦에 따라 생기는 계산 상의 이점 뿐만 아니라 그 데이터를 더욱 잘 이해하려는 노력의 차원에서 봐주시면 되겠습니다.

대표적으로 사용되는 것이 바로 주성분분석(Principal Component Analysis, PCA)죠. PCA에 대해서는 이미 이전 글에서 설명한 적이 있으니 혹시 못보신 분들께서는 다음의 글들을 먼저 확인해주세요.
[Link] 미스코리아 얼굴은 다 똑같다? PCA의 마법
[Link] PCA, 주성분 분석 튜토리얼


PCA는 기본적으로 다음과 같은 가정을 가지고 데이터를 분석합니다.
첫째, 데이터를 나타내는 submanifold는 직선의 basis를 가지고 있습니다. 다시 말해서 우리는 달팽이 모양을 따라 움직이는 basis 따위는 취급하지 않는거죠.
둘째, 큰 분산을 갖는 방향이 중요한 정보를 담고있다고 가정합니다. 위의 그림에서 보면 길쭉하게 늘어진 방향을 가장 중요한 방향으로 생각하고 그곳을 축(basis)으로 데이터들을 투영(projection)하게 되죠.
셋째, 우리가 찾은 주축(principal component)들은 서로 직교(orthogonal)한다고 생각합니다. 예를 들어 위의 그림을 다시보면, 첫번 째 주축이 가장 길게 즐어선 대각선방향의 벡터가 된다면, 그 다음 주축은 무조건 이것과 직교하는 축을 찾는다는 것이죠.
그렇다면 PCA로 잘 분석되는 데이터의 예는 어떤 것들이 있을까요? 만약에 3차원 공간 상에 관측된 데이터가 어떠한 2차원 평면 상에 가지런히 놓여있다면 이 경우는 PCA로 분석이 매우 잘 되는 경우라 할 수 있습니다. 주 축은 바로 그 2차원 평면을 표현하는 지역좌표계(local coordinate)가 되겠지요. 하지만 2차원 평면이긴한데 그 평면이 굽었다면? (가장 첫번째 사진처럼?) 그렇다면 2차원으로는 표현이 불가능하고 3차원까지 고려를 해야겠죠. 그리고 그것은 우리가 원하는 바가 아닐 것입니다.

Nonlinear PCA (사진출처)
이러한 경우엔 데이터를 더 좋은 표현법을 이용해 먼저 평평하게 펴주는 작업을 하던지, 아니면 커널 등을 이용해 nonlinear의 경우에도 submanifold를 잘 찾아주는 방법을 차원축소법을 이용합니다 (e.g. kernel PCA). 개인적으로는 전자를 더 선호합니다. 왜냐하면 후자처럼 kernel을 이용할 경우, 그 데이터에 대해선 더 좋은 성능을 발휘할 수도 있겠지만, 그 지식을 다른 곳에 일반화하여 활용하는 것에는 (generality) 한계가 생기거든요. (그런데 '인간이 굳이 이해할 필요없다. 성능만 나오면 된다.'라는 생각으로 kernel PCA나 autoencoder 등을 이용하시는 분들도 많습니다.)

또 한가지, 두번 째 가정인 "큰 분산을 갖는 방향"이 정말로 우리가 찾고자하는 중요한 방향인지 생각해봐야 합니다. 예를 들어 우리가 "힘이 최고로 많이 들어가는 순간"을 찾는데 PCA를 쓴다고 가정해보죠. 만약에 우리가 각 관절의 각도를 측정했다면, 힘이 최고로 많이 들어가는 순간은 아마도 각도가 넓게 퍼져있는 부분(즉, 속도가 빠른 부분)이 아니라 방향 전환과 같은 각도 변화가 좁게 분포되어있는 부분일 것입니다. 이 경우 무작정 '분산이 큰' 방향을 주축으로 생각하면 안되겠지요.

PCA가 실패하는 경우. (A)같은 경우 데이터는 theta만으로 표현할 수 있을테지만 PCA의 가정에서는 이러한 것이 불가하다. B 역시 마찬가지로 두 주축이 직교하지 않는 경우 PCA는 적절하지 않은 방법일 수 있다. (사진출처)
마지막으로 주축들에 대해 "직교"한다는 가정을 해도 되는지 역시 잘 살펴봐야 할 것입니다. 사실 이 모든 문제가 데이터를 올바른 공간에서 이해하지 않았기 때문에 생기는 문제입니다. 즉 관측에서부터 독립적으로 꼭 관측해야하는 부분만 관측한 것이 아닌, 마구잡이로 관측했기에 후처리 작업으로서 원래 데이터의 차원을 밝히는 이러한 차원축소가 필요한 것이지요. 따라서 기계학습을 할 때 다양한 데이터를 마구 때려넣고 PCA, 인공신경망 등으로 처리를 기대할 것이 아니라, 데이터를 수집할 때부터 무엇을 수집해야 원하는 목표를 달성할 수 있는지 곰곰히 생각해봐야 할 것입니다.