Предобработка тихо выбросила сигнал

В работе такого рода есть этап, который почти все воспринимают как скучную чёрную работу уборщика: предобработка — очистка, масштабирование и переформатирование данных, прежде чем они вообще дойдут до той части, которая занимается собственно обучением. Я относился к ней именно так — как к нейтральной рутине, которую нужно поскорее сбыть с рук, прежде чем начнётся настоящая работа. Она не нейтральна, и такое отношение обошлось мне дорого. Одно рутинное преобразование, применённое не задумываясь, тихо выбросило ровно ту информацию, которая была нужнее всего, а потом я неделями недоумевал, почему система словно слепа к тому, что очевидно было прямо перед ней.

Всё это время я искал не там. Я снова и снова допрашивал хитроумные части, будучи уверенным, что сбой кроется где-то в этой замысловатости. А сбой произошёл гораздо раньше — в той части, которую я даже не удосужился счесть решением.

Предобработка кажется нейтральной. Это не так.

Когда вы нормализуете, масштабируете, сглаживаете или переформатируете данные, это и вправду ощущается как уборка — будто протираешь стол перед готовкой. Нейтрально, гигиенично, очевидно правильно. Именно это ощущение и есть ловушка, потому что каждая из этих операций на деле является решением: решением о том, какую информацию сохранить, а какую выбросить.

«Стандартная» предобработка особенно соблазнительна здесь, ведь само слово «стандартная» придаёт ей вид устоявшегося, нейтрального значения по умолчанию, а не выбора. Но стандартное преобразование — это всего лишь набор значений по умолчанию, которые кто-то где-то выбрал для общего случая. В каждое из них вшито допущение о том, что важно, а что нет, — и эти допущения, вполне разумные в общем, могут оказаться напрямую и катастрофически неверными для вашей конкретной задачи. Вы наследуете допущение, никогда его не увидев, потому что оно приходит замаскированным под рутину.

Преобразование, стёршее смысл

В моём случае — и я намеренно буду держаться общего — совершенно рутинный шаг нормализации привёл к тому, что сгладил начисто тот вид информации, который для моей конкретной задачи как раз и оказался осмысленной частью. Само преобразование было корректным. Оно было стандартным. Это было ровно то, что любой туториал рекомендует как само собой разумеющееся. И для моей задачи оно удаляло сигнал, добросовестно сохраняя шум.

Обнаружить это было по-настоящему отрезвляюще, потому что это означало, что модель вовсе никогда и не была не в состоянии учиться. Её ослепили ещё до того, как данные до неё доходили. Я собственными руками убрал значимое различие во время очистки, а затем усадил систему перед вычищенным результатом и недоумевал, почему она не видит того, чего там уже не было.

Нельзя научиться тому, чего не видишь

Вот принцип, который должен был быть очевидным, но не был: модель может работать только с тем, что переживает предобработку. Всё, что ваши преобразования удаляют до прихода данных, попросту исчезает навсегда — для всего, что идёт дальше. Никакая последующая изощрённость не восстановит информацию, которая была удалена раньше. Невозможно рассуждениями вернуться к различию, которое вы уже стёрли.

Так что всю работу я делал задом наперёд. Я всё пытался сделать модель умнее, дать ей больше ёмкости, помочь ей найти закономерность — тогда как настоящая проблема состояла в том, что я выбросил эту закономерность на входе и теперь просил модель заново открыть то, что я лично удалил. Это какая-то странная жестокость — требовать от системы найти то, что вы уже убрали за пределы её досягаемости, а потом осуждать её за неудачу.

Любое преобразование теряет данные и несёт мнение

Общая истина, лежащая в основе всего этого, такова: нейтральных преобразований не существует. Любое переформатирование данных привилегирует одни их аспекты и подавляет другие; в этом и состоит само преобразование данных. Масштабирование, по сути, объявляет, что абсолютная величина не имеет значения. Сглаживание объявляет, что краткосрочные детали не имеют значения. Каждое из них — это мнение о вашей задаче, утверждение о том, что есть сигнал, а что шум, — и каждое заявлено молча, как значение по умолчанию, ещё до того, как у вас была хоть какая-то возможность согласиться или не согласиться.

Опасна именно эта молчаливость. Значения по умолчанию коварны как раз потому, что вы не переживаете их как выбор. Решение, поданное как рутина, не получает того внимания, какого заслуживает решение. Вы бы никогда не приняли «эта часть не имеет значения» как небрежное утверждение о вашей задаче — но именно это вы принимаете, не разбирая, каждый раз, когда применяете стандартное преобразование, не спросив, что оно допускает.

Смотрите на данные до и после

Дисциплина, выросшая из этого, до неловкости проста: реально смотрите, что ваша предобработка делает с данными. Сравнивайте их до и после каждого шага. Видьте конкретно, что изменилось и что исчезло. Спрашивайте для каждого преобразования: «что это только что удалило, и могу ли я на самом деле позволить себе это потерять?»

Это нудная работа, и она отчётливо ощущается ниже достоинства интересной задачи. Но именно это скучное, неэффектное сравнение — то место, где тихо принимаются некоторые из самых судьбоносных решений во всём конвейере: принимаются по умолчанию, по инерции, по рекомендации туториала, при том что никто на самом деле ничего не решает. Выбрать смотреть — значит выбрать превратить эти молчаливые значения по умолчанию обратно в видимый, поддающийся разбору выбор.

Дешёвые на ощупь части прячут дорогие ошибки

К этому моменту в проекте всё это закрепилось в закономерность, которую я видел повсюду. Шаги, которые ощущаются дешёвыми и скучными — предобработка, конфигурация, скромные значения по умолчанию, — это ровно те места, где накапливаются дорогие, невидимые ошибки, как раз потому что их дешевизна и освобождает их от пристального внимания. Эффектным, трудным частям достаётся всё аккуратное внимание. Сантехнике достаются допущения и пожатие плечами.

А сантехника — это как раз туда, куда на самом деле течёт вода. Неверное значение по умолчанию в скучном шаге не заявляет о своей важности; оно просто тихо отравляет всё, что идёт дальше, пока каждый взгляд прикован к захватывающей машинерии наверху. Несоответствие между тем, где живут проблемы, и тем, куда уходит внимание, — это, как я теперь убеждён, один из самых надёжных источников впустую потраченных месяцев во всём этом предприятии.

Более глубокий урок: не доверяйте слову «просто»

В конечном счёте я вынес глубокое подозрение к одному маленькому слову: просто. Это просто нормализация. Это просто очистка данных. Это просто стандартное преобразование, просто предобработка, просто рутина. Это слово, «просто», — ровно там, где прячется опасность. Это лингвистический маркер шага, о котором вы заранее решили не думать, — флажок, который вы втыкаете в землю, чтобы сказать себе, что здесь нет ничего, достойного разбора.

Очень часто там есть что-то, достойное разбора. Теперь, когда что-то ломается так, что в этом нет никакого смысла, один из самых ранних моих вопросов уже вовсе не о хитроумной части. Он такой: что я сделал с этими данными там, в скучных шагах, прежде чем интересная часть вообще получила возможность их увидеть? Не раз ответом было то, что я выбросил ровно то, что искал, и назвал это действие «просто уборкой».

— Никаких сигналов, никаких доходностей, не является инвестиционной рекомендацией.