매우 다양한 사람들이 데이터 과학이나 기계학습에 참여하고 있다. 그 다양성을 모두 나열할 수 없지만 아주 단순화해서 양 극단의 두 부류의 데이터 과학자가 있다. 많은 문제를 감으로 해결하려는 휴리스틱파와 무조건 최고의 알고리즘을 사용해야 한다는 소타파가 있다. 쉽게 예상하듯이 나는 휴리스틱파 쪽이다. Beyesian vs Frequentist 논쟁도 아니고, 어느 쪽이 낫다/맞다를 논하려는 건 아니다.
휴리스틱 Heuristic은 '복잡하고 불확실한 상황에서 문제를 가능한 한 빨리 해결하기 위해 쓰는 직관적 판단 또는 추론' 정도로 정의한다. 어떤 사전은 '주먹구구식 셈법'이라고 소개하기도 했지만 본 글의 취지와는 맞지 않아 보인다. 어쨌든 복잡하고 불확실한 상황에서 명확한 답을 찾기 어려울 때 상황적 증거를 바탕으로 경험적 지식으로 그럴듯한 해결책 (feasible solution)을 찾는 거다. 해결책이 비교적 직관적이고 단순할 때가 많다. SOTA는 State of the art의 줄임말로 어떤 분야의 모든 기술을 총망라한 Survey 논문을 의미하기도 하지만, 그 분야에서 현재 가장 성능이 뛰어난 기술을 뜻하는 의미로 많이 쓰인다. 이 글은 후자를 취한다.
데이터 과학에서 SOTA를 채택하는 이유는 명확하다. 이론적으로 검증됐고 실험적으로 성능이 보장되기 때문이다. 특히 잘 정의된 문제에서 단기적으로 효과가 있다. 하지만 연구/논문에서 제시한 문제 또는 데이터가 현실의 문제나 데이터의 상황과 정확히 일치하지 않는 것이 일반적이다. 문제의 정의, 즉 상황과 가정이 바뀌면 SOTA 기술의 성능을 보장할 수 없다는 거다. 예를 들어, 연구 단계에서는 1만 차원 이하 또는 수백 MB 미만의 데이터로 테스트해서 성능을 검증했는데, 현실의 수백만 차원의 수 TB의 데이터에서도 같은 성능을 낼 거라고 항상 보장할 수 없다. 특히 잘 알려진 공개 데이터로만 검증된 알고리즘이 복잡한 실제 문제에서 기대했던 성능을 내지 못하는 경우가 다반사다. 때론 치팅이지만 제안한 알고리즘의 성능이 좋게 나온 데이터의 결과만을 논문에 싣는 경우가 없다 할 수 없다. 그리고 논문에서 말하는 SOTA 성능은 보통 정확도 측면에서(만) 가장 좋은 결과를 준다를 내포한다. 1%의 정확도 향상을 위해 10 배나 더 긴 계산 시간을 요한다거나 클라우드나 (극단적으로) 슈퍼컴퓨팅의 성능을 요할 수도 있다. SOTA 기술을 수용해서 자신의 문제에 적용하는 것은 데이터 과학자로서 매우 중요한 자세다. 하지만 여기에 머물면 안 된다. 누군가가 더 좋은 알고리즘을 제안하기만을 무한히 기다릴 수는 없다. 따먹기 좋은 낮은 가지의 열매만으로 오래 생존할 수 없다. 그리고 SOTA라고 해서 이론적으로 완벽히 검증 또는 증명됐다는 의미가 아니니 조심해야 한다.
현재 우리가 SOTA라 부르는 대부분의 기술이 누적된 휴리스틱의 결과물이다. 새로운 상황에서 이걸 좀 바꾸면 성능이 개선되지 않을까?라는 작은 생각이 SOTA로 발전한 것을 자주 본다. 설령 결과적으로 맞더라도 감에 의존한 -- 말 그대로 -- 주먹구구식 접근은 늘 경계하고 피해야 한다. 직감이라 표현했지만 데이터 과학자의 휴리스틱은 문제와 데이터에서 얻은 인사이트이며 오랜 경험으로 다진 산물이다. 나는 이를 귀납적 연역법이라 부른다. 다양한 데이터 문제를 해결하면서 쌓은 경험 (귀납)을 바탕으로 새로운 문제의 해결책을 유추 (연역)하는 거다. 휴리스틱의 결과가 당장은 SOTA에 못 미치더라도 꾸준히 다양하게 수정하며 시도해야 한다. 휴리스틱을 강조하는 이유는 전에 보지 못한 새로운 문제와 상황에서 그럴듯한 해결책을 제시하기 때문이다. 일단은 휴리스틱으로 당장의 문제를 해결하고 더 나은 (SOTA) 기술을 조사하거나 기다리는 게 현실적이다. 기계학습에서 unseen 테스트 데이터가 필요하듯이 unseen (& uncertain) 상황에 대처하는 능력을 키워야 한다. 휴리스틱이 당장은 더 좋은 결과를 만들어내지 못하더라도 오랜 이론적, 실증적 가공을 거치면 언젠가 새로운 SOTA가 될 수도 있다.
문제가 명확하고 리소스가 충분하다면 SOTA 기술을 적용하지 않을 이유가 없다. 결과가 뻔한데 나는 창의적인 사람이기 때문에 다른 해결책을 제시해야 한다는 생각은 그냥 아집이다. SOTA 만을 고집하는 것도, SOTA를 배제하는 것도 바른 프랙티스가 아니다. 그리고 언제 SOTA를 어떻게 적용할 것인가?를 바로 알아차리는 것도 경험이고 휴리스틱이다. 우리가 일상에서 만나는 대부분의 데이터 문제는 정해진 하나의 정답만이 존재하지 않는다. 하지만 문제마다 잘 어울리는 적정 기술(들)은 늘 존재한다. 그게 SOTA일 수도 있고 아주 간단한 카운팅이나 사칙연산일 수도 있다. 때론 그냥 랜덤일 수도 있다. 정답을 찾는 노력은 중요하나 하나의 정답만을 찾는 것은 헛수고나 무지일 수도 있음을 명심해야 한다. 문제마다 다르겠지만 -- 정확도, 속도, 편의성, 기타 부가 기능 등을 종합적으로 고려해서 -- 일단은 가장 적합한 SOTA 기술을 적용하고 그걸 개선할 휴리스틱을 시도하는 건 좋은 프랙티스인 듯하다. 이전 문단과 상충된 듯하지만 기술이 있다면 일단 적용하고 더 개선하면 되고, 없다면 당장 떠오르는 생각으로 미봉책, 임시방편으로 대처하고 더 적합한 기술을 찾으라는 거다. 예를 들어, 시급하게 추천 시스템을 구현해야 한다면 일단 Most Popular (MP)라도 적용하고 더 나은 알고리즘을 찾아서 개선하면 된다. 역으로 이미 좋은 추천 알고리즘을 사용하고 있는데 굳이 맨땅에 헤딩할 필요가 없다는 거다.
장인은 하나의 도구로 여러 가지 일을 자유자재로 할 수 있지만, 지금 우리 손에 망치가 쥐어졌다고 세상의 모든 문제가 못인 건 아니다.
프로그래밍 실력이 출중한 주니어 개발자가 SOTA의 늪에 빠질 위험이 크다. 평소에 SOTA 기술을 연마하는 것은 전혀 문제가 없다. 다만 SOTA만이 유일한 답이다 식의 접근은 위험하다. 주니어에겐 작고 명확한 문제가 주어질 가능성이 크다. 앞서 말했듯이 명확한 문제에는 명확한 해답 (SOTA)이 보통 존재한다. 그런 기술을 기계적으로 적용하니 바로 성과가 나온다. 이런 경험을 몇 차례 하다 보면 그냥 가장 좋은 알고리즘을 찾아서 빨리 구현해서 적용만 하면 모든 문제가 해결될 것처럼 느껴진다. 자기만의 관점을 넓히지 않고 그저 누군가가 만들어놓은 좋은 것을 가져와서 사용하면 된다는 얄팍한 자기 꾀에 빠진다. 그렇게 시니어가 된 후 더 복잡하고 불명확한 문제를 마주했을 때 그때도 어떤 귀인이 나타나서 SOTA가 든 보자기를 건네줄 거라고 기대할 수 없다. 휴리스틱 만능론을 주장하려는 게 아니다. SOTA는 SOTA 대로 중요하지만 자기만의 관점으로 문제를 (재)정의하고 해결책을 제시할 수 있어야 한다. SOTA를 만들어내는 데이터 과학자가 돼야지 그저 SOTA만 이용하는 기술자가 되지 않았으면 한다. 경력 개발에도 Exploration과 Exploitation이 적절히 균형을 맞출 필요가 있다.