[책을 읽고] 페드로 도밍고스의 <마스터 알고리즘> (10)
페드로 도밍고스의 <마스터 알고리즘>을 읽은 것이 2020년 10월이다. '당신도 할 수 있다'라고 외치는 책은 많지만, 대개는 과장법이다. 그럴 가능성이 농후함에도, 나는 페드로 도밍고스의 조언에 따라 파이썬을 독학하기 시작했다. 6개월이 지난 지금의 나는 아직도 파이썬 초보다. 하지만 싸이킷런과 텐서플로(케라스)를 맛보는 데까지 왔다. 책 한 권에서 시작된 짧지 않은 여정에 관해 조금 개인적인 소감을 적어보려 한다.
1. 신경망과 랜덤 포레스트
현재 가장 강력한 머신러닝 알고리즘은 무엇인가? 다름 아닌 신경망이다. '딥러닝'이라는 이름으로 대중에게도 친숙한 그것이다. 그러나 서포트 벡터 머신도, 의사결정트리도 매우 강력한 알고리즘이다. 특히 의사결정트리에 기반한 랜덤 포레스트는 그야말로 막강하다는 말로밖에는 표현할 수 없는 수준의 정확도를 보여준다. 아직 배우는 중이지만, 적어도 내게 현재 머신러닝 알고리즘은 랜덤 포레스트(앙상블)와 신경망의 양강 체제로 보인다. 재미있는 것은 이 둘이 참 많이 다르다는 것이다.
도밍고스가 구글 토크에서 말했듯이, 머신러닝은 우리를 가르치지도 않고 가르칠 수도 없다. 그 복잡한 양상을 설명할 수가 없는 것이다. 바로 이렇게 설명할 수 없지만 일을 척척 해내는 인공지능의 대표가 바로 신경망이다. (이 부분도 앞으로 바뀔 수 있다. 최근 XAI, 즉 '설명가능한 인공지능'이라는 것이 대두되고는 있으며, 실제로 작동하는 것을 보면 대단히 직관적이어서 놀랍기까지 하다.)
랜덤 포레스트는 그 정반대의 자리에 서 있다. 랜덤 포레스트는 의사결정트리에 (과적합을 막기 위한) 적절한 규제를 가해 수백, 수천 번을 돌리는 것이다. 여러 종류의 알고리즘을 섞어 사용하는 '앙상블' 기법 중에서도 랜덤 포레스트는 군계일학이다. 다양한 알고리즘을 섞는 것도 아니고 단지 의사결정트리만 죽어라고 돌리면 웬만한 앙상블을 안드로메다로 보내버리는 실력을 과시한다. 물론 랜덤 포레스트를 포함한 몇 가지 알고리즘을 앙상블로 섞어 주는 것이 현재로서는 최고의 정확도를 담보하는 방법이다.
모형들이 의사결정트리이고, 학습 예제에만 변화를 주는 것이 아니라 각 지점에 파악하여 얻은 속성들 가운데 무작위로 뽑아 부분 집합을 만들고 이를 각 트리가 보유하는 식으로 변화를 주면 랜덤 포레스트트라 부르는 방식이 된다. 랜덤 포레스트는 매우 정교한 분류기다. 마이크로소프트의 키넥트는 당신의 동작을 파악할 때 랜덤 포레스트 방식을 사용하며, 이 방식은 머신러닝 경연 대회에서도 자주 우승한다. (384쪽)
의사결정트리란 무엇인가? 보르헤스의 '끝없이 갈라지는 길이 있는 정원' 같은 것인데, 실상은 정말 단순하다. 처음 보는 동물이 앞에 있다. 컴퓨터는 질문을 던진다. 털이 있나? 그렇다. 그렇다면 다음 질문, 귀가 큰가? 그렇다. 귀가 쫑긋한가? 이렇게 화살표를 따라 질문에 대답하다 보면 답이 나오는 것이다. 이런 가장 단순한 알고리즘이 최고의 적중률을 보이다니, 뭔가 배신당한 느낌이 들 정도다.
페드로 도밍고스는 의사결정트리를 기호주의자(Symbolist)의 머신러닝 알고리즘으로 분류한다. 수식으로 나타내는 것이 가능한 차원을 넘어 쉽게 이해가 되는 정도이니, 과연 고개가 끄덕여진다. 질문과 선택지를 컴퓨터가 (대개는 무작위로) 선택한다는 점을 빼면, 의사결정트리는 1세대 인공지능과 아주 많이 닮았다. 단순무식한 방법의 귀환인가?
<마스터 알고리즘>은 다섯 '종족'의 머신러닝을 다루면서 그 첫 번째인 기호주의자를 설명하는 와중에 과적합(overfitting) 문제를 설명한다. 과적합은 기호주의자만의 것이 아니다. 모든 머신러닝 알고리즘이 과적합이라는 악마와 싸워야 한다. 이것은 페드로 도밍고스도 명시적으로 설명하고 있는 내용이다. 그런데 기호주의자에 대해 논하면서 과적합을 이야기한 것이, 단지 순서 때문만은 아니다. 의사결정트리야말로 과적합의 왕이다.
생각해보면 당연하다. 모든 샘플이 서로 분리될 때까지 질문을 퍼부으면 되기 때문이다. 몸길이 2.1센티미터인 개미와 2.2센티미터인 개미를 서로 다른 종류로 분류할 필요가 있을까? 의사결정트리는 그렇게 해야한다면 그렇게 한다. '몸길이가 2.15센티미터 이상인가?'라는 단순한 질문을 맨 마지막 노드에 추가하기만 하면 된다. 하지만 이것이 과연 필요한 구별일까? 몸길이 0.05센티미터를 구별하여 다른 종류로 구분하는 알고리즘이 과연 얼마나 쓸모가 있을까? 우리가 과적합을 경계해야 하는 이유는 그것이 실용 차원에서 오류를 양산하기 때문이기도 하지만, 실질적인 쓸모에 관해 우리가 제대로 된 질문을 해야 하기 때문이기도 하다.
2. 국소최적화와 돌연변이, 그리고 알고리즘에 벌칙 가하기
국소최적화와 돌연변이에 관해서도 짚고 넘어가자. 도밍고스도 국소최적화가 단지 연결주의자만의 문제가 아니라고 말하고 있다. 모든 머신러닝 알고리즘의 문제다. 그러나 그는 돌연변이가 국소최적화에 대한 매우 탁월한 대응책이라는 듯이 말하고 있다. 돌연변이는 진화주의자의 도구이고, 이 책에서 진화주의자는 신경망의 연결주의자들 다음 차례에 등장한다.
돌연변이는 분명 국소최적화에 대한 좋은 대응책이다. K2에 오르지 않고 뒷동산 꼭대기에서 여기가 최고라고 말하던 당신을 지진이 뒤흔든다고 생각해보자. 당신은 어딘가로 굴러떨어져 다시 산등성이를 올라야 한다. 뒷동산보다는 더 높은 봉우리에 다다를 수 있고, 운이 좋으면 K2 등정도 가능할 것이다.
그러나 머신러닝에서 돌연변이란 단지 난수에 불과하다. 난수는 대략 난감하게도 거의 모든 머신러닝 코드가 가진 요소다. 진화주의자의 유산이라고 말하는 것은 아주 심한 과장이다. 게다가 도밍고스는 복잡한 알고리즘에 벌칙을 주는 것이 뚱보의 승리(survival of the fattest)에 대해서 별로 좋지 않은 방책이라 말하는데, 사실은 다르다. 규제(regularization)라 불리는 벌칙 방식은 거의 모든 머신러닝 알고리즘에 사용되며, 이는 과적합은 물론 국소최적화의 문제도 종종 해결한다. (국소최적화의 문제는 그 정의상 근본적으로는 절대 해결할 수 없다.) 예를 들면 의사결정트리나 랜덤 포레스트는 복잡한 알고리즘에 대해 가하는 벌칙 없이는 거의 100% 과적합을 일으킨다.
3. 베이즈 분류기의 순진함과 카오스적 세계
순진한, 즉 나이브 베이즈 분류기는 모든 사건을 독립 사건으로 판단한다. 그렇게 하지 않으면 특성(feature) 하나가 가세할 때마다 발생하는 무수한 경우의 수에 갇혀 우리는 아무 계산도 하지 못하게 된다. 물론 베이즈 네트워크를 통해 일부 특성의 선후 관계를 설정하기도 하고 연관성을 계산에 넣기도 하지만, 그건 극히 일부에 불과하다. 수학자들은 종종 사태를 단순화시켜서 문제를 해결하기도 하지만, 그들은 적어도 검산이라는 것을 할 수 있다. 그러나 알고리즘의 시간복잡도란 그렇게 단순한 문제가 아니다. 경사하강법에서 가장 성능이 불량한 무작위경사하강법(Stochastic Gradient Descent, sgd)이 쓰이는 이유는 단지 속도가 빨라서다. 비선형 차원축소에서 매우 강력한 알고리즘인 국소선형임베딩(Locally Linear Embedding, LLE)이 외면 받는 이유는 샘플 숫자의 제곱에 비례하는 계산시간 때문이다.
큰 수의 법칙에 따르면 개인은 예측불가능하지만 전체 사회는 불가능하지 않다고 확신할 수 있다. 관계형 학습은 이것이 왜 사실이 아닌지를 밝혀 준다. 사람들이 독립적이어서 각각 고립되어 결정한다면 사회는 정말로 예측 가능할 것이다. 그런 무작위적 결정을 모아서 살펴보면 일정한 평균값이 나오기 때문이다. 하지만 사람들이 상호작용을 하면 큰 집단이 작은 집단보다 더 예측 가능하지는 않다. (373쪽)
모든 사건을 독립적이라 간주하는 나이브 베이즈 분류기의 성공을 입이 마르게 칭찬하던 도밍고스가 이런 말을 하는 것이 믿기 어렵다. 카오스 이론에 따르면 우리가 라플라스적 예측을 하지 못하는 이유는 단지 계측과 계산이 어렵기 때문이다. 양자역학적 불확정성이 그 원인이라고 할 수도 있겠지만 적어도 거시 차원의 문제에서는 양자적 불확정성을 이야기할 이유가 없다. 우리는 겨우 3체 문제도 풀지 못한다. 이런 상황에서 얼토당토않은 가정을 기반으로 현실 문제에 맞는 대답을 연이어 내어놓는 나이브 베이즈 분류기는 엉뚱한 상상을 하게 만든다. 카오스계의 방정식도 마찬가지 방법으로 풀 수 있지 않을까 하는 것이다. 3체 문제를 2.5체 차원에서는 그럭저럭 풀어내는 천체물리학의 현실도 이런 생각을 지지하는 것처럼 보인다.
4. 맺는 말
나는 과학교양서 읽기를 좋아하고 엑셀로 숫자놀음을 즐기지만 기본적으로 문과 사람이다. 그런 내가 페드로 도밍고스의 책을 읽고 코딩 공부를 시작한 것은 전형적인 무모함의 사례였다. 기초적인 코딩은 서버에 연결해주는 사이트에서 실행해 볼 수 있었지만, 텐서플로를 사용하려고 하니 주피터 노트북을 깔아야 했고, 그때부터 고생길이 시작되었다. 그래서 머신러닝 최고의 교과서라는 <Hands-On Machine Learning and Deep Learning> 읽는 것을 두 차례나 중단해야 했다. (물론 이 책의 제2장이 지나치게 과욕을 부려 읽는 사람을 좌절시키는 점도 문제이기는 하다.)
아직도 나는 코딩 쌩초보다. 코드 몇 줄만 입력해도 에러 메시지가 주르르 뜬다. 대부분은 오타지만, 클래스에 없는 메서드를 호출하기도 하고 배열에 인덱스를 잘못 지정하기도 한다. 초보적인 실수들이다. 그럼에도 불구하고 코드가 실행되면 왠지 즐겁다. 겨우 2단짜리 신경망이 에포크를 하나 도는 데 몇 초씩이나 드는 걸 보면, Asus 게이밍 컴퓨터가 버벅댈 정도의 계산거리를 던져줬다는 생각에 뿌듯하기도 하다.
나도 잘 안다. 제대로 데이터를 다루게 될 때까지 나는 수많은 산을 넘어야 한다. 대개는 모델링이 문제가 아니고 데이터가 문제일 것이다. 데이터를 모으는 것부터가 큰 난관이고, 목적에 맞게 전처리를 하는 것도 아주 무지막지하게 성가신 일이다. 다양한 알고리즘 중에서 어떤 것을 쓸지 결정하고 그에 맞게 특성공학적 처리를 거쳐 수도 없이 교차검증을 한 다음에야 적절한 하이퍼패러미터 조합을 찾아낼 것이다. 그렇게 한 다음에도 그것이 최선인지 알려줄 사람은 없다. 그러나 블랙박스를 그냥 검은 상자로 보는 것과는 달리, 나는 이제 그 안쪽에서 일어나는 일을 막연하게나마 이해할 수 있다.
뭔가를 배우는 일은 그것 자체로 가슴 뛰는 일이다. 단순한 지식이 아니라 어딘가에 응용할 수 있는 지식이라면 즐거움은 배가 된다. 그 끝판왕은 아마도 언어일 것이다. 코딩 역시 하나의 언어다. 또다른 세계가 열리는 중이다.
파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음