빅데이터: 큰 용량의 역습 – 차원의 저주 (Curse of dimensionality)

(cover image edited from the book “The Making of Star Wars: The Empire Strikes Back“)

빅데이터와 관련된 세번째 글입니다. 첫째 글에서는 용량적 차원에서 축적되는데이터의 크기를 이야기했고, 두번째 글에서는 그 데이터 안에서 독립적으로 취급할 수 있는 샘플이 많을수록 학습모델이 더 강력해짐을 이야기했습니다. 반대로 말하면 용량이 커지더라도 샘플 수가 작으면 모델을 학습시키기 어렵다는 뜻입니다. 그럼 샘플이 적음에도 불구하고 용량이 큰 경우.. 이 경우는 결국 각 샘플에 할애되는 정보량, 즉 차원 (dimension) 이 많은 경우입니다. 데이터에서 모델을 학습할 때 독립적 샘플이 많을수록 학습이 잘 되는 반면 차원이 커질 수록 학습이 어려워지고 더 많은 데이터를 필요로 합니다.

이를 업계에서는 Curse of dimensionality (차원의 저주)라고 합니다. 오늘은 각 샘플에 할애되는 정보량, 즉 차원이 크다는 것이 어떤 점에서 장점이 있는지 그리고 어떻게 학습 모델에 영향을 주는지를 살펴보도록 하겠습니다.

 

  • 차원(dimensionality)이란?

차원이란 말은 여러가지 의미로 쓰일 수 있는데요. 여기서는 데이터의 구조 (예: 그림은 2차원으로 표시 가능하죠) 는 무시하고 샘플과 각 샘플를 정의하는 정보들로만 생각하겠습니다. 즉 각 샘플을 정의하는 정보의 개수가 차원입니다.  모두에게 익숙한 사진의 경우를 예로 생각해 보겠습니다. 새로운 스마트폰이 발매될 때마다 렌즈를 발전시키기 어려운 폰 카메라 입장상 먼저 앞세우는 스펙이 바로 ‘화소수’ 입니다. 결국 사진을 찍었을 시에 저장하는 그림에 몇개의 화소(pixel)를 사용하는가를 말하는 것이지요. 아이폰 3가 나왔을 당시 2 mega pixel 카메라 였던 것이 iphone 7에 이르러서는 12 mega pixel에 도달합니다. [1] 자연스레 사진 한장의 용량도 커졌고 더불어서 폰에 탑재된 메모리 크기도 커졌습니다.

사진 한 개가 샘플 한 개라고 했을 때 이 화소수는 차원의 크기에 해당합니다. 차원이 커진다는 것은 어떤 의미일까요? 아래 두 장의 차원이 다른 사진을 보시겠습니다 (그림 1, [2]; 원본 일부 잘라서 사용). 왼쪽 그림은 화소수가 120 x 80 (즉 9,600 dimension), 오른쪽 그림은 1200 x 800 (960,000 dimension)으로 화소수로는 백배가 차이납니다. 차원이 큰 사진이 용량도 100배 더 크고, 정보도 훨씬 고밀도로 저장되어 있습니다. 저해상도 사진에선 중심의 인물이 눈을 떴는지 안떴는지 알 수가 없지만 고해상도 사진에서는 표정과 눈동자 색깔까지도 선명히 보입니다.

그림 1. (좌) 모두가 싫어하는 모자이크, (우) 모두가 좋아하는 고화질 고해상도 이미지

비슷한 예로 사람의 건강상태를 키와 몸무게 만으로 (즉 2차원으로) 표현할 경우 우리가 할 수 있는 것은 BMI 지수 정도겠지만, 혈압, 체성분 지수, 나이 등까지 알게 되면 (즉 5차원까지 확대되면) 더 구체적인 건강상태 체크가 가능합니다. 결론적으로 우리가 어떻게 해석해야 하는지 아는 정보들은 많이 있을 수록 활용할 수 있는 소지가 많아집니다. 이것이 차원이 갖는 힘, 각 샘플에 대해서 더 많은 데이터를 저장함으로서 할 수 있는 것입니다.

자, 여기서 한가지 생각해야 할 대목이 있습니다. 사진의 경우는 우리가 시각적으로 자연스럽게 해석이 가능합니다. 사진 안에 담긴 사물을 사람이 직접 인식할 수 있습니다. 의학적으로 건강에 미치는 영향이 알려진 정보들은 우리가 해석할 방법을 알고 있습니다. 그럼 그렇지 않을 경우에는 어떻게 해야할까요? 혹은 이미 우리가 해석할 줄은 알지만, 기계학습을 통해서 자동화를 시키고 싶다면 (왓슨과 같은 경우이죠) 이 차원이 크다는 것은 모델 학습에 어떤 영향을 줄까요?

 

  1. 데이터는 크면 무조건 좋다? 차원의 저주 (Curse of dimensionality)

이전 글에서 시뮬레이션 데이터와 회귀 분석을 통해서 샘플이 많을 수록 성능이 높아지는 것을 확인했습니다. 이번에는 같은 모델을 두고 차원의 크기가 주는 영향에 대해서 알아보도록 하겠습니다. 다시 한번 이전 글에서 사용했던 단순한 회귀 분석 문제를 가져와 보겠습니다. (마찬가지로 glmnet R package를 사용했고, 소스코드는 여기에 첨부되어 있습니다.)

Y = a*X1 + b*X2 + c*X3 + d*X4 + e*X5

X1~X5 다섯개의 변수의 선형 결합 (linear combination)으로 결정되는 Y 변수입니다. 조합 계수 (regression coefficients) a-e 는 이전 글과 동일한 것을 사용했습니다 (그림 2).

 

그림 2 시뮬레이션에 사용된 조합계수

이전 실험에서는 이런 조합계수에 노이즈를 더해가면서 샘플 양이 많지 않으면 단순 회귀분석이 잘 동작하지 않음을 보였습니다. 이번에는 다른 방향으로 문제를 어렵게 만들어 보겠습니다. 즉, X = (X1,…,X5, X6,…Xn) 이렇게 차원의 개수를 X1-X5 외에도 Y를 예측하는데 관련없는 랜덤한 변수들(X6,…,Xn)을 추가하여 X의 차원을 높였습니다. 이제 모델은 불필요하게 많은 변수를 조합하여 Y를 설명하려고 합니다.

불필요한 변수 개수를 다양하게 바꿔가면서 실험을 해보도록 하겠습니다.  학습데이터는 10개이고, 따로 생산된 200개의 검증 데이터로 성능을 검증하였습니다. 차원의 개수에 따른 검증 데이터에서의 예측 성능은 그림 3에 나타나 있습니다. 우선 불필요한 변수가 없을 경우 (즉 X가 5차원일 경우), 회귀 분석 알고리즘은  완벽한 성능을 보여줍니다 (그림 3; R squared = 0.98).

 

그림 3. 연구자를 행복하게 만드는 그림

하지만 한개 두개씩 변수가 추가됨에 따라서 서서히 성능이 떨어지다가 (그림 4; 8-9차원), 차원이 학습 데이터 개수만큼 올라가면 (10차원) 성능이 급격히 떨어지고 (R squared = 0.55), 변수의 개수가 학습 데이터보다 많아지면 (11차원) 학습된 모델은 전혀 새로운 데이터를 설명하지 못합니다 (R squared = 0)

그림 4. 차원의 역습이 시작되다.

여기서 주목할 점은 학습데이터 개수가 차원보다 적어질 때 급격히 성능이 나빠졌다는 점입니다. 일반적으로 변수보다 학습 데이터가 적은 경우를 underdetermined 된 문제라고 볼 수 있습니다. 연립방정식에서 변수보다 수식이 적어서 해가 하나의 값으로 나오지 않고 무수히 많은 경우(부정)와 같습니다.[3] (고등학교 때 배운 기억 나시죠?) 이런 경우 회귀 분석 모델에 추가적인 제약 (constraint)을 두지 않으면 잘 학습하지 못하는데, 여기서 사용한 회귀분석에는 이런 경우를 잘 다루지 못합니다.

(필자 주: glmnet은 제약을 둔 회귀분석이 가능하고 고차원의 경우에도 조금 더 나은 성능을 기대할 수 있습니다. 하지만 여기서 실험할 때는 컨셉을 보이기 위해서 그 기능을 꺼 두었습니다.)

그렇다면 X의 차원과 학습데이터 양을 바꾸어가면서 실험을 반복하면 성능에 어떤 영향을 볼 수 있을까요? (그림 5) 이전 글에서도 보였다시피 X의 차원이 고정되어 있을 경우 학습 데이터 수가 많아질 수록 알고리즘의 성능이 좋아집니다.  주목할 만한 점은 거의 대부분의 경우 X의 차원 개수보다 많은 샘플 개수가 있을 때 알고리즘이 좋은 성능을 보인다는 것입니다. X가 500차원이 될경우 700개 이상의 샘플이 있어야 성능이 좋아집니다.

그림 5. 노이즈 없는 조용한 세상

방금까지 실험은 관측된 학습 데이터의 Y가 노이즈가 없이 X1-X5로 완벽하게 설명 가능한 상황이었습니다. Y에 노이즈가 추가된다면 (Y’ = Y+E) 학습에 더 많은 데이터가 필요하다는 점은 어렵지 않게 예측가능할 것입니다.

우선 노이즈 레벨 1 (가우시안 노이즈, 표준편차 = 1; 이전 글 참조) 의 경우입니다. (그림 6) 우선 눈에 띄는 것은 차원이 500에 이르는 경우 학습데이터가 1000개 있어도 성능이 0.8에 미치지 못한다는 점입니다.

그림 6. 서서히 노이즈가 끼기 시작하면…

여기서 노이즈 레벨을 2로 올려봅시다. (그림 7) 이제 학습데이터가 1000개가 되어도 차원이 500의 경우에는 성능이 0.5에 겨우 미치고, 100차원의 경우에도 0.8 정도의 성능이 나타납니다.

그림 7.  그래프는 꿈틀거리기 시작하고…

노이즈 레벨을 5까지 끌어올려 봅시다. (그림 8)  이제 대부분의 경우 성능이 0.8에 도달하지 못합니다. 눈에 띄는 점은 차원이 커질수록 훨씬 더 많은 데이터를 가지고도 높은 성능에 이르지 못한다는 점입니다.

그림 8. 노이즈는 그래프도 춤추게 한다.

즉, 정리해서 이야기하면 우리가 한 샘플을 특정짓기 위해서 많은 양의 정보를 준비할수록 (즉 고차원 데이터일수록) 그 데이터로부터 모델을 학습하기가 훨씬 더 어려워지고 훨씬 더 많은 데이터 양이 필요하게 됩니다. 이것이 바로 차원의 저주 (Curse of dimensionality) 입니다. [4]

 

결론:  데이터의 용량이 커지면 성공적 모델의 학습을 저해할 수도 있다.

기계학습 모델 학습 관점에서 봤을 때 데이터는 독립적 샘플과 차원의 두 축으로 나누어 생각할 수 있습니다. 주어진 샘플에 대한 세밀하고 밀도 있는 데이터는  많은 정보를 담고 있지만, 반면에 유용한 모델을 세우는 데는 이 차원의 크기가 오히려 걸림돌이 되기도 합니다. 이 걸림돌이 아주 단단한 돌부리처럼 날을 세우고 있는 데이터가 바로 유전체데이터 (genome data)입니다. 과연 우리는 얼마나 다루기 곤란한 데이터를 가지고 일을 하고 있을까요? 이를 넘어서기 위한 노력으로 어떤 것이 있을까요? 다가오는 연재들을 통해서 한가지씩 다루어 보도록 하겠습니다.


참고문헌

[1] https://en.wikipedia.org/wiki/IPhone#Camera

[2] http://shutha.org/node/796

[3] http://mathbang.net/355

[4] https://en.wikipedia.org/wiki/Curse_of_dimensionality

 

The following two tabs change content below.

안야로

기계 학습을 토대로 하는 생명 정보학 연구를 하고 있습니다.