마지막 포스팅 이후로 꽤 시간이 지났다. K에서 S로 이직하면서 스스로 입단속한 것도 있고 새로운 환경에 적응하는 시간이 필요했다. 재택을 종료하고 출퇴근 시간이 길어졌고 퇴근 후에 밀린 유튜브를 보기에도 빡빡하다. 면접관의 입장에서 인터뷰가 어때야 한다는 여러 편의 글을 적었지만, 역으로 면접자의 입장에서 놓이니 글과는 미묘한 다름이 있었다. 기회가 되면 허용된 범위 내에서 K와 S의 장단점에 관한 글도 적을 수 있길 바란다. 그동안 적고 싶었던 몇 개 주제가 있었지만 이미 기억의 저편으로 지나갔고, 지난 주말에 적으려 했던 걸 짧게 적는다.
예를 들어, 랭킹 시스템을 만든다고 했을 때 가장 최악의 알고리즘은 뭘까? 내가 생각하기에 최악은 단순히 성능 (정확도)가 낮은 알고리즘이 아니라 기준이 없는 알고리즘이다. 명확한 기준에 따라서 A가 B에 앞서고 C가 A에 앞선다고 말할 수 있어야 한다. 기준, 규칙 또는 근거가 있으면 당장 성능을 낮더라도 개선의 여지가 있다. 근거가 틀렸을 수도 있고 잘못 해석했을 수도 있다. 그런데 명확한 기준과 근거가 없는 알고리즘은 특정 순간에는 기똥차게 잘 맞더라도 장기적으로 문제가 된다. 제목에서 눈치챘겠지만 기준과 근거가 없다는 것은 알고리즘이 임의성 (Random)에 따른다는 거다.
자신의 알고리즘을 어필할 때 RANDOM과 비교해서 몇 % 좋다고 설명하는 경우를 종종 본다. 극히 이례적인 경우가 아니라면 랜덤과 비교하는 건 자살골을 넣는 것과 같다. 잘 고민해서 만든 웬만한 알고리즘은 랜덤 대비 2 ~ 3 배의 성능은 나온다. 랜덤은 좋은 비교 기준이 되지 못한다. 베이스라인 알고리즘은 1) 현재까지 가장 좋다고 알려진 알고리즘 (State of the art, SOTA), 2) 그 분야에서 일반적으로 흔히 사용 중인 알고리즘, 3) 현재 시스템에 적용된 알고리즘, 또는 4) 웬만한 경력자라면 (또는 누구든) 생각할 수 있는 최소한의 휴리스틱에 기반한 알고리즘으로 해야 한다. 새로운 알고리즘 X가 좋다고 말하려면 -- 예를 들어, 광고에서 CTR 예측과 추천 문제에서 -- 딥러닝 기반의 DNN-A와 비교해서 정확도가 더 높거나 속도가 빠르다고 말하거나 (SOTA), 가장 일반적인 Logistic Regression보다 낫다고 말하거나 (일반적 또는 현재 시스템), 이도 아니면 Most Popular (MP)나 높은 입찰가순보다 얼마만큼의 성능 향상이 있다고 주장해야 한다. 간혹 랜덤과 비교해야 할 때도 있지만 그게 흔치는 않다.
랜덤이 나쁘다고 주장하려고 글을 적는 게 아니다. 랜덤은 화이트 노이즈 (white noise)와는 다르다. 화이트 노이즈는 랜덤이지만 랜덤이 화이트 노이즈는 아니다. 데이터 분석을 하거나 알고리즘을 만들거나 또는 시스템을 만들 때 의도적으로 랜덤을 잘 활용하면 긍정적인 이득을 얻을 수 있다.
랜덤을 사용한 가장 흔한 방법론이 샘플링 (Sampling) 또는 부트스트랩 (BootStrap)이다. 필요에 따라서 특정 분포를 따르도록 샘플링하기도 하지만 가장 흔히 사용하는 방식은 랜덤 샘플링이다. 수십, 수백 테라의 데이터에서 메모리가 감당 가능한 1기가의 데이터를 추리는 가장 효과적이고 쉬운 방식이 랜덤 샘플링이다. 역으로 데이터를 늘릴 때도 랜덤 샘플링을 기반한 부트스트랩을 쓴다. K 폴더 크로스 밸리데이션을 할 때도 랜덤 파티셔닝을 쓴다. 물론 단 한 번의 랜덤 샘플링이나 파티셔닝에서 결론지을 것이 아니라, 여러 번 반복해서 결과를 종합하면 좀 더 robust 한 결과를 얻을 수 있다.
실시간 서비스를 운영할 때 다양한 지표로 오프라인 테스트를 진행하지만 최종적으로 온라인 A/B 테스트를 진행하는 것이 관행이다. 전체 배포 전에 실서비스에서 버그는 없는지, 전체 트래픽을 처리할 수 있는지 등도 체크하지만, 새로운 알고리즘이 기존 알고리즘보다 성능이 더 좋은지를 실시간 데이터로 검증하는 거다. A/B 테스트를 버킷 (Bucket) 테스트라고 부르는데, 버킷을 구성할 때 의도적으로 5 ~ 10% 정도의 트래픽은 랜덤 버킷에 할당한다. 즉, 전체 트래픽 중 일부에게는 (어떠한) 알고리즘, 규칙에도 영향받지 않고 임의의 콘텐츠가 노출된다. 이렇게 하면 당연히 단기적으로 손해다. 하지만 장기적으로 이득이 된다. 랜덤 버킷을 통해서 바이어스가 없는 (unbiased) 데이터를 수집하고, 이전 데이터로 커버하지 못하는 새로운 영역으로 탐험 (exploration)할 수도 있다. 당장 5 ~ 10%을 낭비해서 장기적으로 더 정확한 알고리즘, 서비스를 얻을 수 있다.
다음으로 생각할 수 있는 기법은 초기화에 있다. 학습 또는 최적화를 위해서 양질의 데이터도 필요하고 우수한 알고리즘도 중요하지만, 초기값만큼 크리티컬한 건 없다고 본다. 제주도 바다로 가장 빠른 방법은 비행기나 쾌속선을 타는 것보다 그냥 제주에 사는 거다. 창문을 여니 제주 바다가 펼쳐져있는 거다. 글로벌 옵티멈이 어딘지 모르는 상태에서 그 주변의 값으로 초기화할 수 없다. 그렇기에 어쩔 수 없이 다양한 임의의 포인트들을 초기값으로 지정해서 글로벌 옵티멈을 찾는다. 램덤과 반복이 가장 무식하지만 다른 편으론 가장 효과 있는 방법이다. 특히 딥러닝은 무수히 많은 모델들이 합쳐진 (ensemble) 모델인데, 개별 모델이 모두 다르게 학습됐기 때문에 우수한 성능을 낸다. 대중의 지혜와 같이 앙상블의 힘은 다양한 독립체들의 합의에서 온다.
요즘은 다소 잊힌 알고리즘이지만, 21세기의 우리 삶에 가장 큰 영향을 준 알고리즘을 하나 뽑으라면 구글의 PageRank도 탑 10 안에는 들어갈 거다. 페이지랭크는 웹페이지들의 voting에 따라서 웹문서의 중요도를 측정하는 알고리즘이다. 수식을 자세히 설명하진 않겠지만, 페이지랭크에서 중요한 개념 중 하나는 랜덤 서퍼 (Random Surfer)다. 웹문서에 포함된 하이퍼링크를 따라서 웹서핑을 하다가도 일정 비율만큼 하이퍼링크로 바로 연결되지 않은 전혀 다른 웹문서로 이동할 때가 있다. 이런 랜덤 서퍼 모형이 페이지랭크 알고리즘을 강건하게 만든다. 머신러닝에는 다양한 Regularization 기법이 있는데, 랜덤 서퍼가 페이지랭크의 Regularizer다.
GAN이 소개되면서 더 많이 알려진 현상이 있는데, 현재 머신러닝/인공지능 모델들은 데이터에 조금의 노이즈만 추가되더라도 완전히 다른 것으로 추론하는 크리티컬한 문제가 있다. 이를 Adversarial Attack이라고 부른다. 이미지에 약간의 노이즈가 추가되더라도 사람의 눈엔 별로 달라진 것이 없지만, 컴퓨터는 전혀 엉뚱한 것으로 추론한다. 노이즈 추가만으로 인공지능을 무력화시킬 수 있다면 애초에 임의의 노이즈가 추가된 데이터로 인공지능을 학습하면 어떻게 될까? 깨끗한 학습 데이터를 수집하는 것은 연구자들의 숙원 사업이지만, 한편으론 깨끗한 데이터를 일부로 더럽혀서 더 강건한 모델을 만든다는 것은 다소 아이러니하다.
이외에도 다양한 환경에서 랜덤이 활용될 수 있다. 랜덤이 싫더라도 의도적으로 잘 활용할 수 있는 것도 데이터 과학자가 갖춰야 할 능력이다. 의도된 임의성은 다양성을 준다. 궁극에는 -- 이론적으로 그리고 무한대에서 -- 다양성이 이긴다.
==
오징어게임이 나오기 전에 달고나란 이름을 사용한 건...