전처리가 조용히 신호를 버리고 있었다
이런 종류의 작업에는 거의 모두가 지루한 잡일쯤으로 취급하는 단계가 하나 있다. 바로 전처리다. 데이터가 실제 학습을 담당하는 부분에 도달하기 전에 그것을 정제하고, 스케일링하고, 형태를 바꾸는 일 말이다. 나도 정확히 그런 식으로, 진짜 작업이 시작되기 전에 치워버려야 할 무색무취의 허드렛일로 취급했다. 그것은 결코 무색무취하지 않으며, 그렇게 취급한 대가는 혹독했다. 아무 의심 없이 적용한 어느 일상적인 변환 하나가 내가 가장 필요로 하던 바로 그 정보를 조용히 버려버렸고, 그 뒤로 나는 명백히 거기 있어야 할 무언가에 시스템이 눈먼 듯한 상황에 어리둥절해하며 몇 주를 보냈다.
그 내내 나는 엉뚱한 곳을 들여다보고 있었다. 실패가 그 영리한 부분 어딘가에 있으리라 확신한 채, 정교한 부분들만 계속 추궁했다. 정작 실패는 훨씬 앞쪽에서, 내가 결정이라고 생각조차 하지 않았던 그 부분에서 벌어진 일이었다.
전처리는 무색무취하게 느껴진다. 하지만 그렇지 않다.
데이터를 정규화하거나, 스케일링하거나, 평활화하거나, 형태를 바꿀 때면 그것은 정말로 청소처럼 느껴진다. 요리를 시작하기 전에 조리대를 한 번 닦는 것처럼 말이다. 무색무취하고, 위생적이며, 누가 봐도 옳은 일. 바로 그 느낌이 함정이다. 그 작업들 하나하나가 사실은 결정이기 때문이다. 어떤 정보를 남기고 어떤 정보를 버릴지에 대한 결정 말이다.
“표준” 전처리는 특히 더 유혹적이다. 표준이라는 단어가 그것을 하나의 선택이 아니라 이미 정착된 무색무취의 기본값처럼 들리게 만들기 때문이다. 하지만 표준 변환이란 그저 누군가가, 어딘가에서, 일반적인 경우를 상정해 골라둔 기본값의 묶음일 뿐이다. 그 하나하나에는 무엇이 중요하고 무엇이 중요하지 않은지에 대한 가정이 박혀 있다. 일반적으로는 더없이 합리적인 그 가정들이, 당신의 특정 문제에 대해서는 완전히, 그리고 파국적으로 틀릴 수 있다. 당신은 그 가정을 한 번도 제시받지 못한 채 물려받는다. 그것이 일상적 절차로 위장한 채 도착하기 때문이다.
의미를 지워버린 변환
내 경우에는 — 의도적으로 일반화해서 말하겠다 — 완전히 일상적인 정규화 단계가, 내 특정 문제에서 하필 의미 있는 부분이었던 어떤 종류의 정보를 평평하게 뭉개버리는 효과를 냈다. 변환 그 자체는 옳았다. 그것은 표준이었다. 모든 튜토리얼이 당연하다는 듯 권하는 그런 종류의 작업이었다. 그런데 내 문제에 대해서는, 그 변환이 잡음은 충실히 보존하면서 신호를 삭제하고 있었던 것이다.
이건 정말이지 겸허해지지 않을 수 없는 발견이었다. 모델이 애초에 학습에 실패한 적이 단 한 번도 없었다는 뜻이었기 때문이다. 모델은 데이터가 도착하기도 전에 눈이 가려져 있었다. 나는 내 손으로, 정제 과정에서 그 핵심적인 구별을 제거해 놓고는, 말끔히 닦여 나온 결과 앞에 시스템을 앉혀 놓고 어째서 이제는 거기 없는 것을 보지 못하느냐고 의아해하고 있었던 것이다.
볼 수 없는 것은 학습할 수 없다
명백했어야 마땅하지만 그러지 못했던 원칙은 이것이다. 모델은 오로지 전처리에서 살아남은 것만으로 작업할 수 있다. 데이터가 도착하기 전에 당신의 변환이 제거해 버린 것은, 그 하류의 모든 것에 관한 한 그저 영구히, 사라진 것이다. 나중에 아무리 정교함을 더해도 앞 단계에서 삭제된 정보를 되살릴 수는 없다. 당신은 이미 지워버린 구별로 되짚어 추론해 들어갈 수 없다.
그러니까 나는 노력의 방향을 통째로 거꾸로 잡고 있었다. 나는 계속 모델을 더 똑똑하게 만들고, 더 많은 용량을 주고, 패턴을 찾아내도록 도우려 애썼다. 정작 문제는 내가 그 패턴을 상류에서 버려놓고는, 이제 와서 모델에게 내가 직접 삭제한 것을 다시 발견하라고 요구하고 있다는 것이었는데 말이다. 이미 손이 닿지 않는 곳으로 치워버린 것을 시스템더러 찾아내라 요구하고, 그러고는 찾지 못했다고 그것을 탓하는 것은 묘한 종류의 잔인함이다.
모든 변환은 손실적이고 편향되어 있다
이 모든 일의 밑바탕에 깔린 일반적 진실은, 무색무취한 변환 같은 것은 존재하지 않는다는 것이다. 데이터를 형태 짓는 모든 행위는 그것의 어떤 측면은 특권화하고 다른 측면은 억누른다. 데이터를 변환한다는 것이 바로 그런 일이다. 스케일링은 사실상 절대적 크기는 중요하지 않다고 선언하는 것이다. 평활화는 단기적 세부는 중요하지 않다고 선언하는 것이다. 그 하나하나가 당신의 문제에 대한 하나의 의견이다. 무엇이 신호이고 무엇이 잡음인지에 대한 주장인 것이다. 그리고 그 각각은 당신이 동의하거나 반대할 기회를 갖기도 전에, 기본값으로서 조용히 단언된다.
위험한 부분은 바로 그 침묵이다. 기본값이 위태로운 까닭은 다름 아니라 당신이 그것을 선택으로 경험하지 않기 때문이다. 잡일로 제시된 결정은 결정이 마땅히 받아야 할 검토를 받지 못한다. 당신은 “이 부분은 중요하지 않다”라는 말을 당신의 문제에 대한 가벼운 단언으로는 결코 받아들이지 않을 것이다. 그러나 표준 변환을 그것이 무엇을 가정하는지 묻지 않은 채 적용할 때마다, 당신이 검토 없이 받아들이는 것이 정확히 바로 그것이다.
전처리 전후의 데이터를 들여다보라
여기서 나온 규율은 부끄러울 만큼 기본적인 것이다. 전처리가 데이터에 무슨 짓을 하는지 실제로 들여다보라는 것이다. 각 단계의 전후를 비교하라. 무엇이 바뀌었고 무엇이 사라졌는지를 구체적으로 보라. 모든 변환에 대해 이렇게 물어라. “이게 방금 무엇을 제거했는가, 그리고 나는 그것을 잃어도 정말 괜찮은가?”
지루한 작업이고, 흥미로운 문제의 격에는 한참 못 미치는 일처럼 느껴진다. 하지만 이 따분하고 멋없는 비교야말로, 파이프라인 전체에서 가장 중대한 결정들 일부가 조용히 내려지는 자리다. 기본값에 의해, 관성에 의해, 어느 튜토리얼의 권고에 의해, 아무도 실제로는 아무것도 결정하지 않은 채로 내려지는 것이다. 들여다보기로 선택한다는 것은, 그 침묵하는 기본값들을 다시 눈에 보이고 검토할 수 있는 선택으로 되돌려 놓기로 선택한다는 뜻이다.
값싸 보이는 부분이 값비싼 실수를 숨긴다
프로젝트의 이 지점에 이르자, 이것은 내가 도처에서 목격하는 하나의 패턴으로 굳어졌다. 값싸고 지루하게 느껴지는 단계들 — 전처리, 설정(config), 변변찮은 기본값들 — 바로 그곳에 값비싸고 눈에 보이지 않는 실수들이 쌓인다. 다름 아니라 그 값싸 보임이 그것들을 검토에서 면제시켜 주기 때문이다. 화려하고 어려운 부분들이 세심한 주의를 독차지한다. 배관 설비에는 가정과 어깨 한 번 으쓱하는 것만 돌아간다.
그런데 물이 실제로 흘러가는 곳은 그 배관이다. 지루한 단계의 잘못된 기본값은 자신이 중요하다고 떠벌리지 않는다. 모든 눈이 그 위에 얹힌 신나는 기계장치에만 쏠려 있는 사이, 그것은 그저 조용히 하류의 모든 것을 오염시킬 뿐이다. 문제가 사는 곳과 주의가 가는 곳 사이의 이 불일치야말로, 나는 이제 확신하건대, 이 모든 작업에서 몇 달을 허비하게 만드는 가장 믿을 만한 원천 가운데 하나다.
더 깊은 교훈: “그냥”이라는 말을 의심하라
내가 끝내 얻어낸 것은 한 작은 단어에 대한 깊은 의심이다. 바로 그냥이라는 말이다. 그냥 정규화일 뿐이다. 그냥 데이터를 정제하는 것일 뿐이다. 그냥 표준 변환일 뿐, 그냥 전처리일 뿐, 그냥 일상적인 절차일 뿐. 그 단어, “그냥”이야말로 위험이 숨는 바로 그 자리다. 그것은 당신이 미리 생각하지 않기로 작정한 단계를 가리키는 언어적 표식이다. 여기엔 살펴볼 만한 것이 아무것도 없다고 스스로에게 말하기 위해 땅에 꽂아두는 깃발인 것이다.
살펴볼 만한 무언가가 거기 있는 경우는 아주 많다. 이제는 무언가가 도무지 말이 안 되는 방식으로 실패할 때, 내가 가장 먼저 던지는 질문 중 하나는 더 이상 그 영리한 부분에 관한 것이 아니다. 그 질문은 이것이다. 흥미로운 부분이 이 데이터를 들여다보기도 전에, 저 지루한 단계들에서 나는 이 데이터에 무슨 짓을 했는가? 그 답은 한두 번이 아니라, 내가 찾고 있던 바로 그것을 버려놓고는 그 행위에 “그냥 정제”라는 이름표를 붙여둔 것이었다.
— 신호도, 수익도 없습니다. 투자 자문이 아닙니다.