2015. 12. 27. 01:33

[기계학습, 머신러닝, 데이터마이닝] 인공지능, 그 허상을 깨자. (05)

이제, 본 컬럼도 5번째 접어들고, 슬슬 마무리 단계에 들어갈것 같다. 실제 보다 부풀려져있는 인공지능이나 머신러닝에 대한 한계를 정리하였는데, 다음부터는 "그럼 이제 어떻게 하라구? 즉, 어떻게 해야 훌륭하게 머신러닝을 적용할 수 있냐구?"를 진행하고자 한다. 물론, 이는 다음글 부터이고, 이글은 앞선글의 연속으로, 그 한계를 설명한다.


앞선 글에서 언급했듯이, 이번글은 concept drifting[위키]에 대해 설명하고자 한다.


혹시 그런 생각을 한 적 있는가? "세계, 우주는 무한하다!"라고.

SETI같은 우주 외계 생명체를 탐사하는 단체를 생각한다면(칼 세이건(Carl Edward Sagan) 같은 과학자가 있던 - 참고 : 영화 콘택트(contact)), 외계 생명체가 존재 확률을 계산하는 드레이크 방정식을 만들어 두기도 했다(이 공식은 찬반의 여지가 많다). 이들은 우주는 거의 무한대에 가깝고, 생명체가 이곳, 지구에만 있다면, 그건 공간의 낭비라고, 다소 낭만적인 견해를 가지기도 한다. 어떻든, 우주는 거의 무한에 가깝고, 그것또한 팽창하고 있음은 사실일듯 하다(무한이 아니니깐, 아직 팽창하고 있지 않을까?)


그런데, 갑자기 왜, SETI, 우주인, 무한... 이런 얘기를 머신 러닝 글에 언급을 했는지 알겠는가?

다시, "세계, 우주는 무한하다"라고 했는데, 이는 과연 무었을 의미할까? 앞선글에서, 하나의 Object를 다루는 data는 해당 Object의 Hash와 유사하다고 하였다. 그래서, Hash 충돌을 없애기 위해서 다소 다양한 Data의 속성이 필요하다고 하였다.

고객 ID

 나이

 혈액형

 성별

 게임 현금 결재 여부

 greenfish

 30

 O

 남

 N

 redfish

 10

 A

 여

 N

 bluefish

 30

 O

 여

 Y

위는 앞선글의 예제이며, greenfish와 bluefish data 충돌을 피하기 위해, "성별"이라는 attribute를 "사람"이 인위적으로 추가해야만 했다. 만일 고객의 수가 수십, 수백만명이라면 동일한 data에 다른 결과, 즉, "게임 현금 결재 여부"가 다른게 등장할 수 있다고 하였다. 즉, 동일한 나이, 혈액형, 성별인데, "게임 현금 결재 여부"가 다를 수 있다는 것이다. 이러한 data들은 머신 러닝의 정확도를 하락시키는 요인이 된다고 하였는데, 문제는, (나이, 혈액형, 성별)이 가질수 있는 모든 조합의 개수보다 고객 ID가 훨씬 많은 경우, data의 충돌은 꽤나 많아질 수 있다는 뜻이다. 더군다나, 최근의 Big data로 인한 수많은 데이터들을 처리하다보면, 반드시 등장하게 될 것이다.


문제는, Big data라 하더라도, 이는 "유한"하다는 점이다. 만일 고객 ID가 "행성 ID"가 된다면, 행성 ID는 행성의 개수가 될 것이고, 행성의 개수는 거의 "무한"에 가까운 엄청나게 큰 규모가 될 것이다. HDD나 CPU 혹은 GPU가 엄청 발달하여, 최고의 Infra를 갖춘 서버를 구축하더라도, TOO big data(행성 ID)의 data를 조사해보면, 동일한 data에 다른 결과를 가지는것들또한 "무한"에 가까울 것이다. 무한 + a = 무한, 무한 / a = 무한, 뭐... 이런 공식을 사용하면 말이다.


다시 돌아와서, "무한하다"를 생각해보자.

지금 글을 쓰고있는 "나"는 DNA 염기서열 "ACGT"의 배열이 "ACCCGGTTTTTT...."와 같은 유한한 속성을 가지고 있는데, 세상이 무한하다고 한다면, 동일한 염기서열을 가지는 존재도 반드시 존재할 것이며, 그 수도 무한일 것이다. 왜냐하면, 무한 / 0.00000000000000000000000001% = 무한이기 때문이니깐. 그리고, 나랑 동일한 생명체가 동시에 현재 같은 생각을 가지고 블로그에 동일한 글을 쓰고 있는 사람의 수도 무한일 것이다. 이는 꽤나 머리아픈 일이다. 왜냐하면 현재 글을 쓰고, 커피를 마실 "나"와 주스를 마실 "나", 어느것도 예측할 수 없기 때문이다.


혹시나, 현재 "내"가 다음에 "주스"를 마시는 것이, 세상의 어떤 규칙에 의해서 이뤄질지, 아니면 정말 순수하게 나의 의지로 이뤄질지, 나도 알 수 는 없다. 만일, 세상의 어떤 규칙에 의해서 이뤄진다면, 그 규칙은 정말 대단한것이겠지만서도. 여하튼, 나는 앞으로 "주스"를 마실지 "커피"를 마실지 알수 없으며, "주스"를 마시는 "나"도 있을 것이며 "커피"를 마실 나도 있을 것이다. 이는 일정한 규칙으로 미래를 예측하려고하는 머신 러닝에게는 그다지 도움이 되는 이론은 분명 아니다.


일기 예보 또한 과거의 수많은 data를 가지고 예측하는것인데, 대기 오염이나 엘니뇨 현상 같은 원인으로 점점 시간이 지날수록 예보를 벗어나는 경우가 허다해지고 있다. 이는 분명 "과거"의 패턴과 다르게 "현재"가 흘러가고 있다는 점이다. 최근의 경제또한 뉴 노멀, new normal이라고 한다. 즉, 인류가 처음 격는, 이전의 미국의 "대공항"이나 일본의 "잃어버린 10년"과 다른 전혀 새로운 경기 침체를 격고 있어 쉽게 예측이나 결론을 내릴수 없는 지경에 이르고 있다.


여기까지 본 글의 서론이였는데 꽤나 장황해진거 같다. concept drifting이란, wiki에서도 언급했지만, data의 통계적 변화(예, 평균, 분포, ...)가 지속적으로 발생하여, 예측하는 모델의 정확도가 시간이 지날수록 점점 낮아지는 현상을 말하는 것으로, 앞에서 말한 일기 예보가 대표적인 예일듯 하다. 혹은, 어떤 문제를 해결하는데 google의 텐서 플로(tensorflow)같은 머신러닝 도구를 이용하여 완벽한 모델을 만드는데 성공했다고 가정하자. 그런데, 전혀 예측하지못하게, 지구와 소행성의 충돌로 인해, 인류의 삶이 완전히 바뀌었다고 생각해보자. 그 상황에서 data는 이전의 "완벽한 모델"에서 잘 맞아떨어질까? 그렇다면, 이전 모델은 왜 "소행성충돌"이 발생한 이후의 상황을 예측하지 못한 것일까. 이는, 바로 new normal 상황인 것이다. 즉, 머신러닝은 data의존적인데, "소행성충돌" 이후의 data는 아직 학습하지 못했기 때문이다.


"소행성 충돌"은 다소 극단적인 예이긴 한데, 이러한 극단적인 예는 이해를 쉽게 하기 위한 가정임을 우선 알려드리는바이다. 여하튼, data는 object의 표현이고, object는 유행이 있어, old-fashioned가 발생할 소지가 다소 있으며, 이러한, old-fashioned data로 학습된 모델은 최신의 data로 적용하는데는 다소 무리가 있는 경우가 많다. "소행성 충돌"같은 극단적 예 말고라도, 일반적인 data는 늘 시간에 따라 바뀌기 마련이다. 즉,


와 같이 1970년대 data 통계와 2010년 data 연간 소득 통계는 전혀 다르다는 것이다. 1970년대 data를 가지고 학습된 모델을 2010년대에 적용하는데는 좀 무리가 있을 것이다. 앞서 말한 concept drifting이 발생했기 때문이다(여기서 무리가 있다고 한것이, 결과를 나쁘게 하지 않을 수도 있다는 뜻도 있다. 만일, data가 "1년 소득 금액"으로 구성되어 있다면, 분명 매우 틀려질 것이다. 이에 반해 data가 "1년 소득 순위"로 되어 있다면, 큰 오차가 발생하지 않을 수도 있다. 70년대 연봉 400만원과 2010년대 연봉 4억원이 같은 개념으로 사용되려면, 순위 만큼 좋은 것도 없기 때문이다. 다만, 이런 경우, 1970년대의 분포와 2010년대 분포가 같아야 된다는 단점이 있다. 즉, 위 그림의 종 모양이 똑같이 겹쳐야 한다는 점이다. 그런데 만일 분포마저 바뀌게 된다면, 정확도는 매우 낮아질 것이다). 또한 위 그림에서 1970년대 -> 2010년대 즉, 소득이 증가하였는데, 2020년대에 만일 전혀 예측하지 못한 경제 시스템의 도입으로 다른 모양의, 다른 위치로 이동하게 된다면, 더더군다나 정확도가 떨어질 것이다.


보통의 머신 러닝은 현재의 data를 가지고 미래를 예측하는 방안을 가지고 있다. 이는 1970년, 1971년, ... 과 같이 인접한 data는 서로 잘 융합되나, 만일, 1970년, 2010년으로 바로 jump하게 되면 의미가 없어질 정도로 낮은 결과를 가져올수 있다. 이 원인이 concept drifting이 된다. 이러한 원인을 해결하려면, 현재의 data를 계속적으로 학습시키는 증분 학습(incremental learning)이 필요할지 모른다. 즉, 1970년으로 학습하여 1971년, 1972년, ...을 적용하는 것이 아니라, 1970년으로 학습하고, 그 결과를 다시 1971년으로 update하고 다시 1972년으로 update하고... 이렇게 하다보면, 1970년대 data도 적응이되고, 2010년도 적응이 될 것이다. 다만, 2010년까지 적응이 되었다면, 2011년정도는 어느정도 예측이되지만, 2030년같이 먼 미래는 예측되지 않을것이다. 왜냐? concept drifting이 발생했으니깐. 만일, incremental learning이 적용되지 않았다면, 1970년대, 1980년대, 1990년대와 같이, 각각 분리하여, 각각 학습하고 따로 여러개의 모델을 만들수 밖에 없을 것이다. 이런 여러개의 모델을 가지고, 투표를 하여, 가장 높은 항목으로 결정하는 방식이 응용될 것이다. 이런것이 보통 meta learning인데, 만일,

- 1970년대 data로 학습한 결과 : 모델 A

- 1980년대 data로 학습한 결과 : 모델 B

- 1990년대 data로 학습한 결과 : 모델 C

- 2000년대 data로 학습한 결과 : 모델 D

- 2010년대 data로 학습한 결과 : 모델 E

가 있다고 할때, 임의의 단일 Data를 각각의 모델 A~E까지 넣었다면,

- 모델 A : No

- 모델 B : No

- 모델 C : Yes

- 모델 D : No

- 모델 E : No

와 같았다고 하자. 투표의 논리라면, 해당 Data의 예측 결과는 No일 것이다. (예를 들어, 비가 온다 -> Yes라고...)


그런데, 투표가 과연 정답이될까? 만일, 해당 data가 1990년대 data중 일부였다고 한다면, 모델 C가 1990년대 data로 모델링되었기 때문에, 모델 C의 결과를 전적으로 따르는것이 가장중요할 것이다. C이외의 다른 모델은 concept drifting으로 정확도가 낮기 때문이다. 그런데, 이를 어쩌나. 투표를 해버렸기 때문에 모델 C의 의견은 뭍혀 버렸다. 여하튼, 쉽지 않다. 그리고, 머신 러닝 알고리즘에서, 증분 학습은 아직도 괘 도적적인 이론이다.


다시 돌아와서.

1분뒤 "내"가 주스를 마실까? 커피를 마실까?

Object의 같은 data인 "내"가, 이 우주는 무한대라는 가정을 한다면, 1분뒤 주스를 마실는 "나"도 있을 것이고, 커피를 마실 "나'도 있을 것이다. 물론, 다른 행동을 하는 "나'도 무수히 많을 것이다. 미래 예측은 정말 쉽지 않고, data는 끊임없이 변화하고, 변화하고, 변화한다. 그 변화는 쉽게 "예측"되지 않기 때문에, data 의존적인 머신러닝 알고리즘은 고민이 많아지게 된다. 그러나 좋은답을 찾기란 쉽지 않을거 같다.