[기계학습, 머신러닝, 데이터마이닝] 인공지능, 그 허상을 깨자. (04)
어느덧 글이 4번째에 진입하게 되었다. 쓸 내용은 앞으로도 몇몇가지 있는데, 글을 쓸 시간이 없는 관계(핑계지만)로 자주 업데이트되지 못하는것이 안타깝다(사실, 글 하나를 쓰는데도, 적게는 1~2시간은 잡아야 한다).
머신 러닝을 종합하자면,
- 데이터
- 알고리즘
- 인프라
정도가 필수 요건인데, 최근에 널리 뉴스거리에 나오는 것들은, "알고리즘"과 "특정" 인프라에 집중하는데, "데이터" 부분은 소흘하다고 하였다. 즉, 위 3총사가 잘 뭉쳐야 되는데, 오로지 "특정" 문제(이미지 분석, 음성 분석)에 집중하여, "알고리즘"에만 주안점을 둔다는 것이다. 즉, "사람 혹은 고양이" 그림을 분석하는 최적의 조합으로 위 3총사를 운영하는 서버를 구축했다고 가정하자. 해당 서버에 Input되는 수많은 data들을 이미지 대신에, 앞선 글에서 소개했던 "설문조사" DB로 교체했을때, 과연, 잘 동작할까? 답은 Yes or No. 하지만, 명백한건, 특정 문제(이미지분석)에만 잘 동작하는 알고리즘이 따로 있다는 것이다. 예를 들면, 이미지 분석은 SVM 알고리즘이나 최근의 딥러닝의 근본인 인공신경망등에서 두각을 나타낼수 있다. 이에 반해, "설문조사"같은 문제는, Decision Tree(C4.5, C5.0, 의사결정트리)가 좀더 좋은 효과를 낼 수 있다. 중요한건, 하나의 알고리즘으로, 전 우주의 문제를 해결할 수 있는, "슈퍼 알고리즘"은 존재하지 않는다는 뜻이다(NP Complete 문제 참고). 그럼에도 불구하고, 최신의 뉴스들은 마치 "슈퍼 알고리즘"으로 떠들어 댄다.
앞선 글들의 정리는 이정도로 하고, 이제 "인공지능, 그 허상을 깨자. (03)"글의 마지막에 반문했던, hash에 대한 언급이 필요할거 같다.
수많은 DB는 아래와 같이 구성될 수 있다.
고객 ID |
나이 |
혈액형 |
게임 현금 결재 여부 |
greenfish |
30 |
O |
N |
redfish |
10 |
A |
N |
bluefish |
30 |
O |
Y |
딱 느낌만 봐도,... 고객의 나이와 혈액형을 기반으로 "게임 현금 결재 여부"를 예측하는 모델링을 목표로 할 수 있을거 같다. 한명의 고객 ID는 "나이, 혈액형, 게임 현금 결재 여부"의 정보로 나눠지게 되는데, 이는 일종의 hash 개념으로 접근할 수 있다.
만일, 혈액형 O형을 숫자1로, A형은 숫자 2로, 그리고, 게임 현금 결재 여부의 N은 0, Y는 1로한다면, 아래와 같은 수식을 만들 수 있다.
f(greenfish)=3010
f(redfish)=1020
f(bluefish)=3011
즉, 나이, 혈액형, 게임 현금 결재 여부를 모두 숫자로 붙여 쓴다면, 한명의 ID는 한개의 숫자로 표현할 수 있다는 점이다. 이런것이 hash와 비슷한게, 3010이라는 숫자를 greenfish로 추산할 수 없다는 점이다. 즉, f(x)의 역함수는 없다는 점이다.
만일, 쉽게 이해가 되지 않는다면, f(x)의 함수를 "짝수는 0, 홀수는 1"를 전달하는 함수라 고려해 보면된다.
즉,
...
f(10)=0
f(11)=1
f(12)=0
...
와 같으며, f(10)=0은 만들어 낼 수 있어도, f'(0)=10으로 만들수 있는 역 함수는 존재하지 않는다는 점이다.
이런 hash 함수는 일반적으로 f("비밀번호")=abcdef와 같이, 비밀번호를 저장하는데 주로 이용되기도 하는데, 이러한 hash의 주요 취약점중 하나가 "hash 충돌"이다. 만일, f("비밀번호")=abcdef이고, f("해킹했음")=abcdef라면, 어떤 누구의 비밀번호가 "비밀번호"일때, 다른 누군가가 "해킹했음"을 비밀번호로 입력하면, 승인될 수 있다는 점이다. 즉, abcdef는 노력에따라 획득할 수 있는데, 역함수가 없는 관계로, 수십-수백년간 PC로 계산하다보면, "해킹했음"을 찾을수 있다는 점이다.
왜 갑자기 hash 얘기가 등장했냐고 궁금할 수 있을 것이다. 아마도, 외국의 어떤 머신 러닝 관련 글에서도 hash를 언급하지는 않았을 것이다. 뭐냐 하면, greenfish와 bluefish가 그 답을 알려준다.
만일, 위와 같은 data를 가지고 머신 러닝으로 학습하게 되면, 임의의 f(x)를 도출하게된다. f(x)의 x는 (나이, 혈액형)이고, f(x)의 값은 "게임 현금 결재 여부"가 되는데, 예를 들어, f(11,O)=N를 계산해 준다는 점이다. 즉, 11살의 O형은 결재를 하지 않는다는 결론을 내려준다는 것이다.
그런데, 문제는 greenfish와 redfish이다. f(30, O)와 같이 동일한 Input인데, 결과는 N, Y와 같이 다르다는 점이다. 수많은 DB를 다루다 보면, 이러한 현상이 비일비재하다.
만일, 사람의 나이는 (0~100)까지의 범위를 가지고, 혈액형은 (A,B,O,AB), 그리고, 게임 현금 결재 여부는 (Y,N)이라면, 총 가능한 조합의 수는 (100 x 4 x 2) = 800이 된다. 그런데, 만일, 고객의 수가 800만명이라고 한다면? 분명, 겹치는 data가 엄청나게 많아질 것이며, greenfish, bluefish처럼, 동일한 input에 상이한 output인 data도 매우 많다는 점이다. 이것이 바로, "hash 충돌"과 상당히 유사하다는 점이고, 이러한 "hash 충돌"과 같은 data가 머신 러닝의 결과를 나쁘게 하는 요소가 된다.
만일, 고객의 DB수가 4000만명이라면, Data attribute는 어떻게 구축해야 할까? 그 조합의 수를 따져, 4000만개까지는 아니더라도, 최소한 절반이상은 되야 하지 않을까? 즉,
고객 ID |
나이 |
혈액형 |
성별 |
게임 현금 결재 여부 |
greenfish |
30 |
O |
남 |
N |
redfish |
10 |
A |
여 |
N |
bluefish |
30 |
O |
여 |
Y |
중간에 "성별"이 들어가니, greenfish와 bluefish간의 차별점이 생기게 되었다. 이러한 "성별" attribute는 머신 러닝 알고리즘으로 하여금 분별력을 갖출수 있도록 도와주기 마련이다.
앞선 글에서도 언급했지만, 어떠한 알고리즘도 이러한 중간의 "성별" attribute를 추가하지 못한다(역으로, 제거 혹은 변환하는것은 가능하다). 즉, 철저하게 사람의 계획이 필요하다는 점이다.
다음에는 concept drifting, 즉, data의 변동에 대해 알아보자(즉, greenfish가 나이가 30->31로 바뀐다던지, greenfish가 갑자기 게임 현금 결재를 N->Y로 변경했다던지).