존 맥코믹 저,
[미래를 바꾼 아홉 가지 알고리즘 - 존 맥코믹]
아주 가까운 곳에 도서관이 있어서 요즘 시간이 날 때마다 관심이 있는 컴퓨터 과학이나 수학 분야의 책을 보고 있습니다. 그래서 나름 즐겁게 시간을 보내고 있는데, 단점이라면 서평을 남기기가 조금 애매하다는 것입니다. 그러다가 드디어 서평 남기기에 적당한 책을 접해서 읽고 서평을 남깁니다. 바로 존 맥코믹이라는 저자가 쓴 '미래를 바꾼 아홉 가지 알고리즘'이라는 책입니다.
이 책은 '알고리즘'에 대해서 이야기하는 책입니다. 그중에서도 인류의 삶에 막대한 영향을 끼친 '위대한 알고리즘'에 대해서 다루고 있는 책입니다. 저자는 책의 서두에서 먼저 '위대한 알고리즘'의 기준에 대해서 말합니다. 위대한 알고리즘이란, 저자의 생각에 일련의 조건을 만족시키는 알고리즘입니다. 이때 일련의 조건이란, 1) 일반 컴퓨터 사용자가 날마다 사용하는 알고리즘이어야 하며 2) 알고리즘이 구체적이고 실질적인 문제를 다뤄야 하고 3) 컴퓨터 하드웨어에 중점을 둔 기술이나 인프라스트럭쳐 설계가 아닌 컴퓨터과학 이론에 우선적으로 연관되어야 한다라는 것입니다.
저자가 이런 조건을 설정하고, 또 이런 조건을 충족하는 알고리즘을 소개하는 글을 쓰고자 한 이유는, 사실 아주 실용적인 이유라기보다는 '즐거움'을 위해서입니다. 저자는 자신이 이런 글을 쓰게 된 이유를 설명하기 위해 자신의 천문학 지식에 대한 이야기를 꺼냅니다. 저자인 존 맥코비는 천문학 전문가가 아닙니다. 하지만 짤막한 천문학 지식을 갖고 있어서, 별이 빛나는 밤하늘을 만나면 그 밤하늘을 그저 흘러 보내는 것이 아니라 그 속에서 짤막한 지식으로 배가 된 즐거움을 누리곤 한다고 합니다. 저자가 이 글을 쓰면서 우리에게 알리고 싶은 것도 이런 맥락입니다. 저자가 소개하는 9가지 알고리즘은 모두 우리가 매일 컴퓨터를 사용하면서 수차례 이상 접하는 서비스의 기반이 되는 알고리즘입니다. 그러니, 저자가 삶 속에서 별이 밝게 빛나는 하늘을 만났을 때, 자신의 지식을 바탕으로 즐거움을 찾는 것처럼, 이 책의 독자들도 IT 서비스를 이용하면서 그런 즐거움을 느꼈으면 하는 마음에서 이 책을 저술했다고 합니다.
책에서 다루는 알고리즘 잉 꽤 많은데, 제가 가장 인상 깊게 본 알고리즘은 3장에 나오는 구글의 페이지랭크 알고리즘과 공개키-암호화 알고리즘입니다.
구글의 페이지랭크 알고리즘을 이해하기 위해서는 그보다 앞에서 다루는 검색엔진이라는 기술이 탄생하기 위한 '인덱싱'과 '랭킹'이라는 기반 기술에 대해서 알고 있어야 합니다. 인덱싱과 랭킹은 간단한 개념입니다. 우리가 검색엔진을 쓰는 이유는, 수많은 웹의 문서들 중에서 우리가 지금 필요로 하는 문서를 찾기 위해서입니다. 인덱싱과 랭킹은 이러한 우리의 검색엔진 사용 목적을 충족시키기 위한 기술들입니다. 즉, 웹에 있는 수없이 많은 문서들을 사전에 검색엔진에 '인덱싱'함으로써, 우리는 검색엔진에 어떤 키워드를 입력했을 때, 해당 키워드를 포함하고 있는 문서들을 골라낼 수 있게 됩니다. - 사실 되게 가볍게 넘어가고 있지만, 인덱싱도 꽤 많은 문제가 있었고, 그 문제를 해결하기 위한 많은 노력이 있었기에 해결이 되었습니다. 컴퓨터는 절대로 글을 읽을 수 없으니까요. 어떻게 컴퓨터에게 글을 가르쳤는지는 책에서 확인하세요 - 그럼 이걸로 모든 문제가 해결된 것이 아닐까 싶을 수 있습니다. 하지만 다시 한번 생각해보면 문제는 이제 시작입니다. 예컨대, 우리가 검색엔진에 'Apple'라는 영단어를 입력했을 때, 해당 단어를 포함하고 있는 문서는 정말 수없이 많을 것입니다. 그런데, 우리의 시간은 한정되어 있고, 능력은 제한적이기 때문에 해당 단어를 포함하고 있는 모든 문서를 확인하고, 우리가 필요로 하는 문서를 골라내는 것은 불가능합니다. 그럼 결국 컴퓨터에게 그 문서를 골라달라고 해야 하는데... 앞에서 언급한 바와 같이 컴퓨터는 글을 읽을 줄 모릅니다. 그러니 당연히 맥락을 고려하여 이용자가 원하는 문서를 뽑아주는 것도 어렵습니다. 이때 어떤 문서의 중요도가 더 높은지 고려하여, 중요도가 높은 문서를 선별적으로 보여주는 것이 바로 '랭킹'이라는 기술을 통해서 해결해야 하는 문제입니다.
그런 의미에서 구글의 페이지랭크 알고리즘을 보면 왜 구글의 페이지랭크 알고리즘이 중요한 알고리즘인지, 그리고 2명의 대학원생이 기숙사 방에서 시작한 작은 프로젝트가 전 세계 IT 기업의 대표주자로 성장하게 만든 원동력이 무엇인지 알 수 있게 됩니다.
제가 이해한 구글의 페이지랭크 알고리즘, 즉 구글이 문제를 해결한 방식은 이러합니다. '컴퓨터가 글을 읽을 수 없다면, 사람들이 글을 읽어주면 되지 않을까?'라는 생각에서 시작하는 것입니다. 이게 무슨 말도 안 되는 소리인가요? 컴퓨터가 글을 읽을 수 없는데, 사람들이 글을 대신 읽어주면 된다니, 이런 겁니다. 컴퓨터는 0과 1이라는 - 전기가 통함, 통하지 않음 - 원시적인 방식으로만 작동합니다. - 섀넌의 위대한 발견이 없었다면... - 즉, 글의 맥락을 읽을 수 없습니다. 하지만 '연산이 가능한 방식'으로 중요도를 판단하는 방법을 가르치면(프로그래밍해두면) 그런 일은 어떤 사람보다 빠르고 정확하게 할 수 있습니다. 그리고 구글이 도입한 방법은 학술지 인용 방식과 비슷합니다. 즉, 어떤 문서(페이지)를 인용하는 다른 페이지가 얼마나 많이 있느냐를 세는 방식으로, 문서의 중요도를 판단하게 만든 것입니다.
책에서 설명하는 것을 조금 뛰어 넘어서 구글의 창업자들이 쓴 'The Anatomy of a Large-Scal Hypertextual Web Search Engine'라는 논문을 참고해서 조금 더 알아보면 이런 맥락입니다. 구글의 페이지랭크 알고리즘은 학술지 인용 방식을 조금 더 확장시켜서, 다른 페이지에서 오는 링크를 단순 합계하는 것이 아니라 그 페이지에 걸린 링크 숫자를 정규화하는 것입니다.
그리고 앞서 말한 바와 같이 단순히 이런 '말'로는 컴퓨터에게 가르칠 수 없기 때문에 결국 더 이상 간단해질 수 없는 수식이 필요한데, 구글 논문을 보면 페이지랭크 수식은 다음과 같습니다.
PR(A) = (1-d) + d(PR(T1)/C(T1) + PR(T2)/C(T2) +... + PR(Tn)/C(Tn) )
여기서 PR은 페이지랭크의 줄임말이고, PR(A)는 A라는 웹사이트의 페이지랭크 값을 의미합니다. Tn은 A라는 페이지를 인용한 다른 페이지들을 의미합니다. 그렇다면 PR(Tn)은 무엇일까요? 당연히 Tn이라는 페이지의 페이지랭크를 의미합니다. 그리고 마지막으로 C(Tn)은 Tn이라는 페이지의 링크 총개수를 의미합니다.
그러면 이제 d라는 변수가 중요해주는데, 이 d라는 변수는 Dramping Factor라고 합니다. 책에서 '무작위 서퍼'라는 개념으로 설명하는데, 간단히 말하자면, 웹 문서들을 마구잡이로 불규칙하게 타고 다니는 '무작위 서퍼'가 다른 페이지로 가는 링크를 클릭할 확률을 의미합니다. 즉, d가 1이면 무작위 서퍼는 영원히 다른 링크를 클릭한다는 것이고, d가 0이면 무작위 서퍼는 첫 번째 페이지에서 무조건 멈춘다는 것입니다. 구글의 논문에서는 이 d값을 0.85로 해두었다고 합니다.
아무튼 구글은 이렇게 어떤 페이지를 링크하는 페이지의 숫자를 정규화함으로써 각 페이지의 상대적 중요도를 계산하도록 함으로써, 이용자들이 엄청난 웹 문서들 속에서 필요로 하는 문서를 찾아내도록 만들었습니다. 그리고 이런 페이지랭크 기술을 바탕으로 현재 IT제국 구글이 성장했습니다. 물론 실제 구글이 사용하는 방식에 비해서 이 방식은 아주 많이 단순화되어 있겠지만 말입니다.
- 아 그리고 이건 여담으로, 사실 구글 논문에는 모든 웹 페이지의 PR값을 합하면 1이 된다고 되어 있는데, 실제 저 수식은 모든 웹 페이지의 PR을 합하면 1이 되지 않을 것 같습니다. d값이 0면 수식 뒷부분은 모두 0이 될 테니 A라는 페이지의 PR값이 1이 될 테니까요. 뭔가가 잘못되어 있는 것 같은데, 서평 다 쓰고 한번 찾아봐야겠습니다. 근데 일단 논문에는 수식이 저렇게 되어 있습니다. -
이 뿐만 아니라 공개키 암호화 알고리즘도 정말 인상적이었습니다. 특히 '페인트'를 가지고 공개키 암호화를 설명한 부분이 직관적으로 공개키 암호화 알고리즘을 이해하는데 큰 도움이 된 것 같아서 특히 인상적이었습니다. 사실 서평을 작성할 때까지만 해도 공개키 암호화 알고리즘에 대해서도 페이지랭크 알고리즘의 경우처럼 하나하나 정리를 해볼 계획이었는데, 시간이 부족하네요.
아무튼 정말 우리가 알게 모르게 자주 사용하고 있는 서비스의 근간이 되는 알고리즘에 대해서 '아주 쉽고 직관적으로 이해할 수 있도록' 설명해주고 있는 책입니다. 사실 이 책은 위대한 알고리즘을 소개하고 있다는 점에서도 의미가 있다고 생각하지만, 그보다는 위대한 알고리즘을 위대하게 설명하고 있는 점이 훨씬 더 의미가 있다고 생각합니다. 당장 저처럼 저자의 찰진 설명 때문에 관심이 생겨서, 구글의 페이지랭크 논문을 찾아서 읽고, 암호에 대한 또 다른 책을 빌려서 보고 있을 정도니까요.
컴퓨터 과학과 알고리즘에 관심이 있는 분이라면 정말 재미있게 읽을만한 책이라고 생각합니다. 추천합니다.