티스토리 툴바


협업 필터링(Collaborative Filtering)과 같은 집단지성 발굴용 집계 알고리즘(collective algorithm)은 물품 또는 사용자 간의 유사도 계산(similarity function)으로 시작된다. 사용자, 물품이 소량인 경우라면 메모리에 올려 놓고 계산하면 된다. 하지만 현실은 만만치 않다. 사용자, 물품 수가 수십만 이상은 기본이고 수백만 단위가 되기 때문이다. 실무에서 협업 필터링 기법을 적용해 고객에 딱 맞는 물품을 추천하려면 교과서적인 메모리 기반 알고리즘으로는 불가능하다.

하둡(Hadoop)의 맵 리듀스 프레임워크(Map Reduce Framework)은 이런 대규모 계산 용도에 적합하다. 확장성이 뛰어 나지만 제한된 곳에서만 사용할 수 있다. 모든 메모리 기반 알고리즘을 맵 리듀스화 시킬 순 없다. 맵 또는 리듀스 작업 도중에 입력받은 이외의 데이터들이 필요하면 중앙 DB에 조회하여 데이터를 구해야 하기 때문이다. 이런 중앙 DB 연산이 많으면 하둡의 가치가 없어진다. 따라서, 대용량 상황에서 집단지성 발굴용 집계 알고리즘으로 교과서에 소개된 메모리 기반 알고리즘은 적합하지 않고, 대신에 맵 리듀스 전용 알고리즘을 찾아야 한다. 만일 중앙 DB가 꼭 필요한 경우라면 그 크기가 작아 빠른 조회가 되어야 한다.

페이지랭크 알고리즘이 메모리 기반 알고리즘과 맵 리듀스 기반 알고리즘의 기저사상이 다르듯 협업 필터링용 유사도 계산 알고리즘도 맵 리듀스 버전을 찾아야 한다. 다행히도 구글링을 통해 구글이 "대용량 뉴스 개인화 서비스"에서 사용한 기법인 LSA(Locality Sensitive Hashing)란 기법을 찾았다. 이 기법은 두 객체가 가까운 거리에 있을 수록 해쉬 값 충돌 확률이 높도록 해쉬 함수를 설계하는 방법이다. 한마디로 거리 관계를 충돌 확률 문제로 변환하여 해결하는 일종의 확률적 군집화 방법이다.

다양한 거리 계산 방법에 맞는 LSA용 해쉬 함수는 각각 다르다. 유사도 계산에 많이 사용하는 자카드 계수용 LSA 해쉬 함수로 MinHash란 것이 있다. MinHash 기법에 따르면 해쉬에 의해 차원이 축약된 개체들 간의 자카드 거리와 원 개체들의 자카드 거리는 확률적으로 근접하다라고 한다. 결국 어느 사용자들의 MinHash 값이 같으면 근접한 유사 사용자라고 판단할 수 있기 때문에 이 MinHash 값을 유사 군집 식별번호로 사용한다.

MinHash를 사용하면 맵 리듀스 프레임워크에서 다뤄야 할 데이터 량이 크게 준다. 맵 작업에서 "사용자 식별자 - 선호 물품 번호 목록" 입력을 받아 사용자별 물품의 MinHash값을 구한다. 사용자마다 p개 MinHash를 생성해 이 값들을 문자열 형태로 붙혀 군집 식별자를 생성한다. 맵의 출력 키로 군집 식별자를 그리고 맵 출력 값으로 사용자 식별자를 넣는다. 리듀스 작업을 통해 군집 식별자 - 사용자 식별자 목록(ClusterUserMap)을 최종 출력으로 구한다. 다음으로 새로운 맵-리듀스 작업을 통해 역전된 형태인 사용자 - 사용자가 속한 그룹 식별자 목록 데이터(UserClusterMap)를 생성한다. 이 두 출력 파일은 구글 BigTable 같은 중앙 DB에 넣어 키로써 값을 조회할 수도록 저장한다. MinHash로 인해 중앙 DB에 넣을 정도록 작아졌기 때문에 한곳에 저장 가능하다.

A 사용자의 유사 사용자 목록을 구하려면 2단계 거쳐야 한다. 먼저 UserClusterMap에서 A가 속한 군집 식별자 목록을 구한다. 이 군집들에 속한 유사 사용자를 ClusterUserMap에서 찾는다. 이렇게 얻은 <A 사용자 - 사용자 식별자> 간의 유사도 계산을 위해서는 A와 유사한 사용자들간의 군집 식별자를 구해 MinHash값을 분리낸 뒤 자카드 계수 계산법에 따라 계산하면 된다. 대용량의 로그 데이터에서 맵 리듀스 방식 알고리즘을 사용해 내 취향에 맞는 상품은 이렇게 구해질 수 있다.

@webJOY

MinHash 알고리즘을 이해하기 쉽게 설명한 파워포인트맵 리듀스 프레임워크를 이용한 확장성 있는 협업 필터링 기법 논문





집단 지성은 사용자들이 제공한 선호 정보에서 발현되기 때문에 집단 지성를 발굴하려면 사용자들의 선호가 녺아든 선호 정보를 수집해야 한다. 일부 웹 2.0 사이트들의 경우 이런 선호 정보를 오픈 API를 통해 직접 제공하지만 대다수 웹 서비스에서는 제공하지 않는다. 특히 국내 웹에서 선호 정보를 구하기 매우 어려워 알고리즘 실험에 외국 데이터를 사용하지만 데이터에 대한 낮은 이해도로 인해 결과 해석이 어려웠다.

국내에서 공개된 선호정보를 찾아보았다. 오픈 API를 통해 직접 제공하는 서비스는 못 찾아 스크린 스크래핑 기술로 직접 수집하기로 했다. 수집할 선호정보를 찾던 중에 온라인 서점들의 '마이 리스트' 서비스에서 제공하는 '사람 - 찜 - 책' 선호정보를 수집해보았다. liburl2을 사용해 선호 정보를 담고 있는 웹 페이지를 가져와 BeautifulSoup을 사용해 파싱한 후 HTML 태그들에 포함된 특정 패턴의 문자열을 파이썬 정규식을 통해 꺼내는 방식으로 스크린 스크래핑했다. 이 기법들은 '집단 지성 프로그래밍' 책에 잘 나와있다.

스크린 스크래핑을 통해 예스 24 마이 리스트에서 1,075명의 사용자 목록과 이 사용자들이 마이리스트에 등록한 9,853개 책 제목을 추출했다. 사용자들이 찜한 총수는 12,881개였다. 사용자당 평균 10개 책을 등록하고 있고, 책 기준으로 보면 책 당 평균 1명이 관심 사용자가 있다. 마이 리스트 선호 정보도 소셜 데이터의 특성인 희박성(sparseness)를 그대로 드러낸다.

집단 지성은 집합적인 개인 판단들이 모여 특정 판단 문제에 대한 현명한 해답을 제공한다. 개인이 마이 리스트에 특정 책을 둘지 말지를 판단할 때는 여러가지 목적이 있을 수는 있지만 이런 책에 대한 관심은 주로 "읽고 싶은 책" 목록일 것이다. 이런 상황에서 집단 지성이 현명한 해답을 제공할 문제는 "이 책의 읽고 싶은 선호도 순위는?"가 된다. 구글의 페이지 랭킹 처럼 마이 리스트로 표현된 사용자 관심을 모아 선호 정보를 구축함으로써 각 책들의 선호도 점수를 구할 수 있다.

특정 책의 선호도 점수를 가장 간단하게 표현하는 지표는 그 책을 찜한 사람 수다. 마이 리스트는 도서 블로그 안에 특정 책을 찜해 놓는 목록이고 아직까지는 스패머가 보이지 않기 때문에 이런 단순 누적치도 좋아 보인다. 책 선호도 점수를 찾았다면 자연스럽게 "이 선호도가 현명한 판단인지를 어떻게 검증할 수 있을까?"라는 질문을 떠올리게 된다. 사회적인 선호도 점수를 평가하기란 매우 어렵지만, 책의 경우에는 '판매 부수'를 통해 간접적으로 검증할 수 있다. 인기있는 책은 잘 팔린다란 명제가 성립된다면 책의 선호도 점수순이 판매부수가 되어야 한다.

도서판매부수는 한국출판인회의가 매주 회원사들의 판매량 집계를 가지고 주간 베스트 20위를 발표한다. 판매량 상위 20위와 예스24 인기 20위 간를 비교해보면 다음과 같다.


위 두 목록에서 공히 출현한 책들을 노란색으로 마킹했다. 갹 20개 책들 중에 7개가 중복되었고 13개는 달랐다. 이 두 목록에서 왼편 목록은 지난 주의 도서 판매 부수고 오른편 목록은 금주 초에 만든 인기 목록이다. 집단 지성이 미래를 잘 반영한다면 오른편 목록이 다음 주에 나올 도서 판매 부수와의 중첩도가 더 높아져야 할 것이다. 감히 예견해 본다면 차주 주간 도서판매부수의 1위는 "시골의사의 주식투자란 무엇인가1" 또는 "부동산 대폭락 시대가 온다", "가슴 뛰는 삶" 중에 한개가 될 것 같다.

@webJOY





토비 세가란의 집단 지성 프로그래밍 책을 제대로 이해하려면 "집단 지성"에 대한 이해가 있어야 합니다. 집단 지성은 웹 2.0 서비스의 특징을 설명하는 7 원칙 중의 한 개로 알고 계신 분들이 많겠지만, 그렇지 않습니다. 위키 피디어의 사전적 정의로는 "집단 지성(Collective Intelligence)이란 다수 개체들이 협력 또는 경쟁하면서 발현되는 공유 또는 집단 지성(group intelligence)을 뜻하며, 박테리아와 동물, 인간 집단, 컴퓨터 네트워크 안에 합의된 다양한 형태의 의사 결정들을 말한다."라고 되어 있습니다.

집단 지성이란 단어도 웹 2.0의 창시자인 팀 오라일리가 창제한 것이 아닙니다. 1994년에 발간된 "Collective Intelligence"라는 피에르 레비 책 이름을 빌려 썼을 뿐이죠. 집단 지성에 대한 본격적인 탐구는 2004년에 제임스 서로위키가 쓴 "The Wisdom of Crowds"란 책에 잘 정리되어 있습니다. 이 책을 통해 서로위키는 "특정 상황에서 집단은 놀라울 정도로 똑똑해지며 종종 집단내 가장 똑똑한 사람보다 더 똑똑해진다."라는 주장을 하며 어떤 상황에서 집단지성이 잘 발현되고 어떤 상황에서 발현되지 않는지 사례를 들면서 설명하고 있습니다.

집단 지성에 대한 정확한 이해를 위해서는 이 책에서 소개하고 있는 집단 지성 발현을 위한 3가지 원칙인 독립성, 다양성, 분산화들과 발현 주체의 속성, 그리고 적용가능한 문제들에 대한 이해가 중요합니다. 이해를 돕기 위해 서로위키의 책을 보고 집단 지성의 발현 원리를 도식으로 그려보았습니다. 특정 집단이 엘리트 몇명보다 현명한 집단 판단을 하기 위해서는 이 3가지 조건들을 만족해야 합니다.



 먼저, 집단 지성이 발현되는 집단은 이해 집단이어야 합니다. 즉 집단 지성을 발현하는 집단 구성원들은 개개인의 이득을 추구해야 함니다. 개개인들이 얻게 되는 이득의 크기에 비례해 신중히 판단하기 때문입니다. 인간이 추가하는 가장 큰 이득 중의 하나인 금전적인 이득을 추구하는 금융 시장(예. 주식 시장)이 가장 대표적인 집단 지성의 예라고 말하는 것이 이 때문입니다.

둘째로 이 집단 구성원들이 판단해야 하는 구체적인 문제가 있어야 합니다. 예를들어 주식 시장의 경우 개개인들이 주식으로 돈을 벌기 위해 매수 매도할 주식 가격 예측(판단) 문제가 개개인들에게 주워 져야 합니다. 서로 위키는 이런 판단 문제를 크게 3가지로 구분하고 있습니다. 해답 발굴 문제, 행동 조율 문제, 공익 추구 문제가 그것들입니다. 주어진 판단 문제에 따라 개개인들은 협업, 경쟁 또는 차별, 통합이란 다양한 상호작용을 하면서 반복적인 판단을 수행해야 합니다.

마지막으로 특정 그룹이 현명한 집단 판단(=집단 지성)을 하려면 각 개개인들이 독립적으로 사고하고 판단해야 하고(독립성), 참여하는 개개인들이 다양한 배경지식을 가져 다양한 판단을 해야 하고(다양성), 그룹 내 소규모 전문 집단들이 좁고 특수한 지식을 사용해 판단한 결과를 적절히 통합해야 함을 뜻합니다 (분산화). 마지막 분산화 특성은 전자들에 비해 이해하기 어렵습니다. 완전 반대 상황인 중앙 집중화를 빗대어 보면 이해하기 다소 수월합니다. 즉 개개인의 판단 결과를 지혜로운 한 사람이 혼자서 집계하지 않음을 말합니다. 이 특성의 기저에는 자기조직화(Self-Organization)이란 개념이 숨어 있습니다.

위 3가지 조건들이 구비된 상황에서 주어진 판단 문제에 대해 개개인들이 자신의 이해를 위해 신중한 판단을 반복적으로 수행한다면 소수 엘리트에 의한 판단보다 집단의 판단이 더 현명해질 수 있습니다.


서로위키가 정리한 내용만 보아도 집단 지성 발현 원리를 제대로 이해하란 쉽지 않습니다. 하물며 토비 세가란의 "집단 지성 프로그래밍" 책에서는 이런 배경 지식이 전혀 없습니다. 따라서, 책 전체를 통해 가장 중요한 개념인 "사람 - 판단 대상 - 판단 강도"로 표현되는 선호 공간(Preference Space)와 집단 지성이 무슨 관계인지 처음 접하면 이해하기 어렵습니다. 선호 공간과 기계 학습은 무슨 관계인지를 유추하기란 더욱 어렵게 되어 있습니다.

단지 집단 지성 프로그래밍 책에 대한 깊은 이해 뿐만 아니라 집단 지성의 발현 원리에 대한 이해는 웹2.0 사상을 이해하거나 웹2.0 서비스를 기획하는데 있어 아주 중요합니다. 집단 지성이 잘 발현되는 웹 서비스를 개발할 때도 그저 사람들이 누적 평가 점수가 집단 지성이 되겠지라고 막연하게 생각하게 되는 우를 쉽게 범하게 됩니다. 웹 서비스에서 집단 지성을 발현해 가장 성공한 사례로 구글의 페이지 랭킹 알고리즘이라고 합니다. 왜 그럴까요? 왜 이처럼 복잡한 계산이 필요할까요? 페이지 랭킹 알고리즘을 보면서 유입 링크 개수를 그 페이지의 중요도로 판단하면 왜 안되는지도 3 원칙에 빗대어 볼 때 더 쉽게 이해할 수 있습니다.

@webJOY

제임스 서로위키의 "The Wisdom of Crowds"는 램덤하우스에서 "대중의 지혜"란 제목의 번역판이 있습니다.