회사 아지트 (게시판)를 보다 보면 간혹 아래와 같이 실험 결과를 적은 글을 보게 된다. 데이터 분석이나 알고리즘 개발에 경험이 전무/부족한 기획자나 개발자들이 적은 경우가 많다. (때로는 악의적이고 의도적으로 이렇게 적는 사람들도 있다. 이런 사람은 조심해야 한다.)
랜덤 대비 50% 상승
놀랍게도 새로운 알고리즘의 성능을 랜덤과 비교해서 ‘우리는 잘 해요’라고 적고 있는 거다. 랜덤과 비교하는 것은 '그냥 뭐라도 했더니 효과가 있었어요’라고 말하는 것과 같다. 즉, 아무것도 모르는데 그냥 하니 효과는 있어요인 셈이다. 결국 뭘 했는지도 왜 효과가 있는지도 모른다는 얘기다.
개인적으로 알고리즘 — 이라 적고 휴리스틱이라 읽는 — 을 설계할 때 랜덤을 사용하는 걸 좋아하는 편이다. 이는 대조군을 랜덤으로 둔다는 의미가 아니다. 모델을 더 강건 robust하게 만들기 위해서 랜덤을 활용한다는 의미다. 랜덤을 통해서 Exploration을 도모하거나 랜덤 초기화를 통해서 새로운 최적값을 찾도록 한다. 딥러닝을 포함한 모든 앙상블 알고리즘은 랜덤의 도움을 받아서 성공했다. 그리고 A/B 테스트에 랜덤 버킷도 두지만 이는 Exploration과 Unbiased를 위한 것이고, 그리고 오직 참고를 위한 것이지, 새로운 알고리즘 (또는 메인버킷)과의 성능 비교를 위한 것이 아니다. 실험에서 랜덤을 보는 이유는 랜덤과 차이가 있음을 확인하기 위함이지, 랜덤에 비해서 얼마나 좋은지를 보기 위함이 아니다.
랜덤이 좋은 대조군이 아니라면 뭘 대조군에 두는 게 맞는가?
첫째. 기존 연구나 논문에서 소개(주장)하는 SOTA (State-of-the-art) 방법을 대조군에 둬야 한다. 즉, 현재 가장 잘 나가는 놈과 싸워서 이겨야지 제대로된 승리다. 이때 실험군과 대조군의 실험 환경/조건은 모두 동일해야 한다. 같은 데이터를 사용하고, 같은 학습/테스트 데이터 스플릿을 갖고, (실험 대상 외의 하이퍼 파라미터는 동일하게 설정하고) 등등의 조건이 같아야 바른 비교가 된다. SOTA와 비교해서 새로운 방법이 더 좋다면 당연히 가장 좋은 케이스다. SOTA 대비 7% 향상… (끝) 그런데 SOTA의 성능은 잘 조절된 실험 환경에서 얻어지는 경우도 종종 있고 그런 성능을 얻기 위해서 이미 알고리즘이 매우 복잡해져서 서비스 적용에 어려울 수도 있고 결정적으로 우리의 서비스 환경과 데이터와 맞지 않을 수도 있다. (학계에서 이뤄지는 연구/논문이라는 게 실제 서비스에 적용, 즉 프로덕션과 거리가 멀 때가 많다.) 즉, 아무리 노력해도 여건 상으로 SOTA의 성능을 뛰어넘지 못하더라도 'SOTA 대비 94%의 성능을 보임’ 정도의 비교면 합리적이다. 그리고 알고리즘을 다루는 사람들은 보통 정확도 측면에서 성능 비교를 많이 하지만, 프로덕션을 염두에 둔다면 정확도보다는 속도나 안정성 등의 다른 지표를 우선/함께 봐야 할 때도 있다. 정확도는 SOTA보다 조금 낮더라도 다른 지표에서 SOTA보다 낫다면 괜찮은 알고리즘이라 볼 수 있다.
잘 알려진 SOTA 알고리즘이 우리 서비스/실험 환경과 너무 동떨어졌다면 SOTA와 비교는 불가능하다거나 새로운 또는 아주 마이너한 분야여서 적당한 기존 연구/논문이 없는 경우도 있다. 이런 경우라면, 둘째, 최소한 현재 시스템에 적용된 버전과 비교해야 한다. 현재보다 더 나으면 된다. 앞서 말했듯이 정확도뿐만 아니라 속도나 안정성 등의 여러 측면에서 검토해야 한다. ‘기존 대비 13% 향상됐어요’보다 더 좋은 비교가 있을까? 설마 '기존 = 랜덤'은 아니겠지?
때로는 적당한 기존 연구/방법론도 없고 완전히 새로 시작하는 프로젝트여서 운영중인 시스템도 없다면, 셋째, 가장 기본적인 휴리스틱과 비교한다. '기본적인 휴리스틱’란 아주 뛰어난 알고리즘이 아니더라도 누구나 떠올릴 수 있는 방법이다. 예를 들어, 뉴스 기사를 추천하는 시스템을 만든다고 치자. (추천 시스템은 레퍼런스가 많지만) 맨땅에 시작한 프로젝트여서 가장 기본적인 메모리 기반의 CF조차도 없다고 가정하자. 이런 경우라면 현재 가장 인기있는 글 (Most Popular)나 가장 최신 글을 추천한다가 기본 휴리스틱이 될 거다. 인기글이나 새글을 보여주는 것이 랜덤으로 보여주는 것보다 낫다는 것은 대부분 알고 있다. 이렇게 누구나 쉽게 설계할 수 있는 — 그러나 랜덤보다는 나은 — 휴리스틱과 새로운 알고리즘을 비교하는 게 합당해 보인다. 진짜 랜덤은 아니잖아요.
모든 걸 다 양보해서 어쩔 수 없이 랜덤과 비교해야하는 상황이 있을 수도 있다. 그런 상황이더라도 최소 랜덤 대비 2배나 3배 이상일 때만 자랑하자. 경험상 아주 개판이 아니라면 (잘) 설계된 알고리즘은 랜던 대비 최소 2배의 성과를 낸다. 랜덤 대비 겨우 1.x 배라면 성과로 내세우기에는 조금 부끄럽다. 자기 위안일 뿐이다. ‘랜덤보다 나아요’는 메시가 초등학생을 앞에 두고 드리블 돌파를 했다고 자랑하는 것과 같다. 앞서 적었듯이 랜덤은 비편향 학습데이터를 수급하기 위한 것이지 성능 평가/비교를 위한 것이 아니다. 랜덤은 "아무것도 안 하면 이것밖에 못해요”라는 진짜 순수한 참고용으로만 사용하자.
글을 다 적고 문든 든 생각인데... 만약 랜덤보다도 못하면...?