버그는 내가 얼마나 열심히 탐색했는가였다
한동안 나는 내 진지함을 탐색의 규모로 가늠했다. 나는 한 전략의 설정(config)을 수억 가지 조합으로 테스트했고, 그것이 부족하게 느껴지자 수십억 가지로 늘렸다. 나는 그 숫자가 자랑스러웠다. 그것은 엄밀함처럼 느껴졌다 — 마치 내가 어떤 가능성도 빠뜨리지 않고 살펴보고 있는 것처럼.
그것은 엄밀함의 정반대에 가까웠다. 탐색의 그 막대한 규모는 내가 엣지를 찾는 데 도움이 되지 않았다. 그것은 신기루를 만들어내고 있었고, 내가 그것을 크게 만들수록 그 신기루는 더 설득력 있게 다가왔다.
경고였어야 할 자부심
나는 내가 일한 시간이 얼마인지 언급하듯 내 탐색의 규모를 언급하곤 했다. 노력의, 철저함의, 문제를 진지하게 받아들였다는 증거로서. 수억 가지 조합을 평가했다고. 그다음엔 더 많이. 그렇게 큰 숫자를 가리키며 사실상 내가 얼마나 샅샅이 들여다봤는지 봐라 하고 말하는 데에는 실제로 만족감이 있다.
그 만족감이 문제였다. 나는 조용히 탐색의 규모를 결과의 품질로 착각하고 있었고, 그 둘은 단지 무관한 것이 아니다 — 어느 지점을 넘어서면 서로 반대 방향으로 잡아당긴다.
거대한 탐색이 실제로 하는 일
여기 불편한 메커니즘이 있다. 역사의 어떤 고정된 한 조각을 가져다가 충분히 많은 서로 다른 전략들을 그것에 대해 시도해 보라. 그러면 그중 일부는 굉장해 보일 것이다 — 그것들이 좋아서가 아니라, 수백만 번의 시도 중 몇몇은 순전히 운으로 과거의 특정한 우연들과 맞아떨어질 수밖에 없기 때문이다. 더 많은 설정을 테스트할수록, 당신은 이런 요행 중 하나를 찾으리라는 것을 더 확신하게 되고, 가장 운 좋은 요행은 더 극단적으로 보이게 된다.
그래서 거대한 탐색은 최고의 진짜 전략을 안정적으로 드러내지 않는다. 그것이 안정적으로 드러내는 것은 가장 잘 들어맞는 우연 — 당신이 탐색한 바로 그 데이터의 무작위적 별난 특성에 가장 정밀하게 빚어진 설정이다. 그리고 그것은 당신이 본 적 없는 가장 아름다운 결과를 입혀 그 우연을 당신에게 내민다.
이 함정에는 이름이 있다
이중 어느 것도 새롭지 않다. 이것은 통계학 전체에서 가장 닳고 닳은 함정 중 하나이며, 작은 박물관 하나만큼의 이름을 가지고 있다: 다중 비교, 데이터 준설, p-hacking. 그 핵심은 늘 같다. 하나의 가설을 테스트하면, 강한 결과는 정보를 담는다. 같은 데이터에 대해 십억 개를 테스트하면, 겉보기에 예외적인 결과를 순전히 우연만으로 찾을 확률은 — 실제로 무언가가 거기 있든 없든 — 매우 높아질 수 있다. 충분히 많은 시도가 있으면, “순전히 운으로 예외적인” 것은 더 이상 가망 없는 일이 아니게 된다.
나는 십억 개 가설 실험을 돌리면서 그 승자를 마치 단 하나의, 어렵게 얻어낸 발견인 양 읽고 있었다. 그것은 아니었다. 그것은 아주 큰 방 안에서 가장 시끄러운 소음이었다.
왜 그것이 과적합의 정반대처럼 느껴졌는가
잔인한 부분은 그것이 얼마나 미덕처럼 느껴졌는가다. “어떤 돌도 뒤집지 않고 남기지 마라”는 좋은 조언으로 여겨진다. 하지만 단 하나의 고정된 데이터셋에 대해 어떤 돌도 뒤집지 않고 남기지 않는 것은, 결국 우연히도 보물 모양을 한 돌 하나를 뒤집어내고야 말도록 보장하는 가장 확실한 방법 중 하나다. 하나의 표본에 대한 철저함은 엄밀함과 같지 않다. 흔히 그것은 그저 스스로에게 속아 넘어갈 기회를 점점 더 많이 사들이는 것이고, 그러다 그중 하나가 결실을 맺으면 감탄하는 것이다.
나는 내가 신중하게 굴고 있다고 생각했다. 나는 상황을 더 나쁘게 만드는 바로 그 방향으로 신중하게 굴고 있었다.
단서: 승자는 접촉에서 결코 살아남지 못했다
그 징후는, 일단 그것을 찾아보는 법을 익히고 나니, 대개 같았다. 그 거대한 탐색에서 우승한 설정은 그것이 선택의 기준으로 삼았던 데이터에서는 믿기지 않을 만큼 좋아 보였고, 그다음 그것이 선택의 대상으로 삼지 않았던 데이터를 만나자 곧 무너졌다. 그 붕괴는 단순한 불운이 아닐 수 있다. 그것은 탐색이 우연을 찾아냈다는 흔한 경고 신호다 — 인-샘플에서는 강한데, 인-샘플이야말로 그것이 들어맞도록 최적화된 바로 그것이기 때문이고, 아웃-오브-샘플에서는 약한데, 그 우연이 안정적으로 반복되지 않을 수 있기 때문이다. (조건의 진짜 변화나 단순한 버그가 붕괴를 일으킬 수도 있다. 거대한 탐색에서의 선택은 그저 유력한 용의자일 뿐이다.)
완화책: 탐색을 제약하고, 검증 데이터를 보호하라
복구에는 두 부분이 있었다. 첫 번째는 탐색의 규모를 미덕으로 취급하기를 멈추는 것이었다 — 무엇이든 들어맞는 것을 찾아내려 데이터를 그저 채굴하는 방대한 맹목적 일제 탐색 대신, 어떤 설정이 작동할 것이라 기대할 만한 이유에 이끌린, 더 작고 더 신중한 탐험을 돌리는 것. 두 번째는, 그리고 더 중요한 것은, 어떤 승자든 그것이 선택되는 동안 결코 볼 수 없었던 데이터에서 견고함의 증거를 보여줄 것을 요구하는 것이었다 — 깨끗한 홀드아웃조차 너무 자주 들여다보면 서서히 깨끗하지 않게 된다는 것을 알면서.
그 두 번째 규칙이 게임의 상당 부분이다. 중요한 질문은 “내가 과거에서 찾을 수 있는 가장 좋아 보이는 것은 무엇인가?”가 아니다. 충분한 연산력을 가진 사람이라면 누구나 과거에서 멋져 보이는 것을 찾을 수 있다. 과거는 유한하고, 충분히 큰 탐색은 결국 그 우연들에 들어맞을 것이다. 중요한 질문은 “내가 찾아낸 가장 좋은 것이, 그것이 도저히 그 모양에 맞춰 빚어질 수 없었던 구간의 데이터에서 살아남는가?”이다. 내 거대한 탐색들이 들춰낸 거의 모든 것이 그 질문을 통과하지 못했고, 그 실패는 그것들이 만들어낸 가장 유용한 결과 중 하나였다.
더 많은 연산력은 더 많은 진실이 아니다
내가 간직하는 교훈은 이 분야에서 거의 거부할 수 없게 느껴지는 어떤 본능에 대한 조용한 교정이다: 엣지를 찾지 못하고 있다면, 그저 더 열심히 탐색하면 된다는 것 — 더 많은 설정, 더 많은 연산력, 더 많은 무차별 대입. 어떤 문제들에 대해서는 그 본능이 옳다. 노이즈 많은 데이터에서 진짜로 지속되는 엣지를 찾는 문제에 대해서는, 그것은 흔히 거꾸로에 가깝다. 더 많은 무차별 대입이 반드시 당신을 진실에 더 가까이 데려가지는 않는다. 때때로 그것은 그저 노이즈에게 경연에 더 많은 출전권을 줄 뿐이다 — 그리고 노이즈는, 충분한 출전권이 주어지면, 무언가를 이기는 경향이 있다.
탐색이 나를 위해 한 가장 정직한 일 중 하나는, 엄청난 횟수의 시도 끝에, 살아남은 것이 아무것도 없이 돌아온 것이었다. 이것이 탐색의 실패가 아니라는 것을 이해하기까지 나는 부끄러울 만큼 오랜 시간이 걸렸다. 그것은 탐색이, 마침내, 나에게 진실을 말해주는 것이었다.
— 신호도 없고, 수익도 없으며, 투자 자문이 아니다.