내 최고 기록을 나조차 재현할 수 없었다

내가 만들어낸 결과 중 가장 두고두고 마음에 걸리는 것은, 두 번 다시 만들어내지 못한 결과였다. 초창기에 단 한 번, 그때까지 본 어떤 것보다도 훨씬 뛰어난 수치를 들고 돌아온 실행이 있었다. 나는 들떴다. 그런데 그 위에 무언가를 쌓아 올리려고 다시 돌아가 보니, 그 결과는 사라지고 없었다 — 그리고 나는 그곳으로 되돌아갈 길을 찾을 만큼의 기록을 전혀 남겨두지 않았다. 이후 몇 주 동안 나는 내가 스스로 만들어냈다가 부주의하게 잃어버린 유령을 쫓아다녔다.

이것은 프로젝트 전체에서 가장 교훈적인 실패 중 하나로 남아 있다. 그 교훈은 시장이나 모델에 관한 것이 전혀 아니었기 때문이다. 그것은 과학을 하는 것과 단지 수치를 만들어내는 것 사이의 차이에 관한 것이었다.

되찾을 수 없었던 그 결과

규율이라 할 만한 것이 전혀 없던 초창기에, 나는 실험을 느슨하게 굴렸다. 한 번에 여러 가지를 바꾸고, 출력을 흘긋 보고, 또 몇 가지를 더 바꾸고, 계속 넘어가곤 했다. 정확히 어떤 설정 (config)이 어떤 결과를 만들어냈는지 꼼꼼히 기록하지 않았다. 그저 빠르게 반복하면서, 중요한 부분은 기억할 거라고 믿었을 뿐이다. 나는 기억하지 못했다.

그래서 한 실행이 나머지보다 극적으로 나은 결과를 들고 돌아왔을 때, 나는 그 크기를 아직 가늠하지 못한 문제를 안고 있었다. 그것을 확인하고 그 위에 무언가를 쌓기 위해 재현하러 갔지만 — 할 수 없었다. 기억에 의존해, 대략 같다고 생각한 조건을 다시 돌려보았다. 그 마법은 다시는 나타나지 않았다. 나는 진정으로 흥분되는 무언가를 정확히 단 한 번 만들어냈고, 그러고는 알아채지도 못한 채 열쇠를 버려버린 문 뒤에 그것을 가둬버렸다.

재현할 수 없는 결과는 결과가 아니다

마침내 그 깨달음이 찾아왔을 때, 그것은 암담하면서도 동시에 명료했다. 마음대로 재현할 수 없는 수치는 거의 아무것도 말해주지 않는다. 그 훌륭한 결과는 진짜 개선이었을까? 무작위 주사위가 운 좋게 굴러간 것일까? 그 한 번, 마침 나를 우쭐하게 만든 버그였을까? 그것을 만들어낸 정확한 조건을 다시 돌릴 방법이 없으니, 나는 이 가능성들을 구별할 길이 없었다.

그리고 이것들은 엄청나게 다른 것들이다. 하나는 1년치 작업을 그 위에 쌓을 가치가 있는 발견이다. 다른 하나는 즉시 잊어야 할 잡음이다. 또 다른 하나는 추적해서 고쳐야 할 오류다. 나의 엉성한 설정 속에서 이것들은 셋 중 무엇이든 될 수 있는 단 하나의 재현 불가능한 수치로 뭉뚱그려졌다 — 그리고 나는 그 위에 진지한 노력을 걸어버리기 직전이었다. 다시 만들어낼 수 없는 발견은 증거가 아니다. 그것은 우연히 목격한 소문일 뿐이다.

재현 불가능을 만드는 숨은 상태

내가 미처 헤아리지 못했던 것은, 결과를 조용히 결정짓는 보이지 않는 것들이 얼마나 많은가 하는 점이었다. 모든 것을 초기화하는 무작위 시드. 그날 정리되었거나 되지 않았던 것까지 포함한, 데이터의 정확한 버전. 설정 안의 모든 값. 어디에도 커밋하지 않은 변경까지 포함한, 바로 그 순간의 코드의 정밀한 상태. 작업이 실행된 순서.

이것들 중 어느 하나라도, 소리 없이라도, 우연히라도 바꾸면 결과는 달라질 수 있다. 나는 그중 어느 것도 고정해두지 않았었다. 나의 “실험”은 움직이는 부품들이 들끓는 수프였는데, 나는 그 출력을 마치 보정된 계측기에서 깔끔하게 반복해 읽어낸 측정값처럼 다루고 있었다. 전혀 그런 것이 아니었다. 그것은 내가 완전히 통제하지도 못하고 기록할 신경도 쓰지 않은 시스템에서 일어난 일회성 사건이었다.

결정론은 당신이 내려야 하는 선택이다

불편한 진실은, 재현성은 저절로 생기지 않는다는 것이다. 그것은 복잡한 시스템의 기본 상태가 아니다. 기본값은 혼돈, 표류, 그리고 소리 없는 재현 불가능성이다. 같은 것을 두 번 돌려 같은 답을 얻고 싶다면, 그 속성을 의도적으로 설계해 넣어야 한다.

그것은 무작위성을 최소한 통제할 수 있도록 시드를 고정한다는 뜻이다. 정확히 무엇으로 학습하고 시험했는지 알 수 있도록 데이터를 버전 관리한다는 뜻이다. 모든 단 하나의 결과 옆에 정확한 설정과 정확한 코드를 함께 기록해, 수치가 결코 미아가 되지 않도록 한다는 뜻이다. 한 번의 실행을, 원할 때면 언제든 의도적으로 똑같이 다시 돌릴 수 있는 무언가로 만든다는 뜻이다. 이 중 어느 것도 화려한 작업이 아니다. 그러나 이 모든 것이 과학과, 과학으로 분장한 교양 있는 추측 사이의 차이다.

그것을 고친 지루한 규율

마침내 받아들였을 때, 그 처방은 모욕적일 만큼 지루했다. 나는 모든 실험을, 기록으로부터 재구성 가능해야 하는 무언가로 다루기 시작했다. 어떤 데이터. 어떤 코드. 어떤 설정. 무엇이 무엇을 만들어냈는지. 어떤 결과가 그것을 재생성할 만큼 충분한 정보에 묶여 있지 않다면, 내게는 그 결과가 존재하지 않는 것이었다.

처음에 이것은 순전한 관료주의처럼 느껴졌다 — 진짜 흥미로운 작업을 가로막는 부대비용처럼. 하지만 그것은 부대비용이 아니었다. 그것은 나의 정신없고 잊히기 쉬운 허우적거림을, 실제로 쌓여 나갈 수 있는 무언가로 바꿔준 바로 그것이었다. 이전에는 각각의 결과가 내가 넘어가는 순간 증발했다. 이후에는 결과가 내가 신뢰하고, 비교하고, 그 위에 쌓을 수 있는 기록으로 차곡차곡 쌓였다. 그 관료주의가 곧 과학이었다.

왜 이것이 다른 거의 모든 곳보다 여기서 더 중요한가

이런 영역에서 이 규율을 무시하는 것이 특히 가차 없는 데에는 이유가 있다. 환경이 유난히 잡음이 많고, 그것은 무작위적 우연이 아무 의미 없는 아름다운 수치를 끊임없이 만들어낸다는 뜻이다. 요행은 여기서 드물지 않다. 그것은 꾸준히 내리는 가랑비다. 결과를 재현할 수 없다면, 진짜 신호를 이런 운 좋은 우연들 중 하나와 구분할 방법이 없다 — 그리고 운 좋은 우연을 쫓으며 그것을 발견이라 착각하는 것은, 내가 아는 한 몇 달의 노력을 아무것도 아닌 곳에 쏟아붓는 가장 효율적인 방법 중 하나다.

재현 불가능한 최고의 결과는 완벽한 미끼다. 그것은 돌파구처럼 느껴지지만, 훨씬 더 자주, 단지 잡음이 한 번 당신을 향해 웃어준 것일 뿐인, 바로 그런 종류의 것이다.

더 깊은 교훈: 기억이 아니라 기록을 신뢰하라

내가 결국 이것에서 얻은 것은, 오로지 내 기억 속이나 스크린샷 속에만 존재하는 어떤 결과에 대한 깊은 불신이다. 기억은 스스로를 편집한다. 올림 처리를 하고, 단서 조항을 잊고, 수치는 기억하면서 조건은 잃어버린다. 재구성 가능한 계보가 없는 결과는 발견이 아니다. 그것은 일화이고, 일화야말로 이 영역이 사람들을 파멸시키는 데 쓰는 바로 그것이다.

그래서 이제 어떤 흥분되는 결과에 대해 내가 던지는 첫 번째 질문은 “이게 얼마나 좋은가?”가 아니다. 그것은 “이것을 정확하게, 마음대로 되찾을 수 있는가?”이다. 만약 답이 아니오라면, 그것이 아무리 좋아 보였든 아직은 중요하지 않다. 내가 실제로 무엇을 가졌는지 모르기 때문이다. 결과를 재현할 수 있게 되기 전까지, 그것은 내가 소유한 발견이 아니다. 그것은 그저 내가 한때 본 수치일 뿐이고, 한때 본 수치는 여기서 아무런 가치도 없다.

— 시그널 없음, 수익 보장 없음, 투자 자문 아님.