Серия: любопытство · 2026-10-18
На Хабре вышла редкая по честности вещь: ретроспектива инженера, который разобрал собственный провал. Он собирал двухпоточную модель для определения стадии диабетической ретинопатии: на вход идут снимок глазного дна и клинические показатели пациента. На отложенном тесте — QWK 0.834, метрика отличная, все довольны. Потом автор начал разбираться, за счёт чего именно модель точна, и обнаружил неприятное: в датасете RetinaMNIST клинических анализов от природы нет — он сгенерировал их сам, по формуле, в которую входила истинная стадия болезни. Подсказка оказалась вшита прямо в признаки.
Контрольные эксперименты разложили всё по полочкам. Логистическая регрессия, которая видела только «клинику» и ни одного пикселя снимка, дала QWK 0.816 — почти догнала двухпоточную сеть (0.834). А честная сеть, обученная только по изображениям, выдала 0.713. То есть нейросеть не училась ставить диагноз — она училась читать записку с ответом, аккуратно подложенную в таблицу признаков. У этой записки есть имя: data leakage, утечка данных. Дальше — путешествие от фиолетового маркера в углу фотографии до сотен научных статей, которые, вероятно, придётся читать с этой мыслью.
Самый наглядный кейс утечки, известный мне, описан в JAMA Dermatology (Winkler et al., 2019). Команда взяла готовый медицинский CNN для диагностики меланомы и прогнала через него архивные фотографии поражений кожи. На снимках без пометок модель работала красиво: чувствительность 95.7%, специфичность 84.1%.
Подвох в том, как выглядят клинические архивы. Подозрительные поражения хирурги обводят фиолетовым маркером — перед биопсией или удалением. В кадре это просто маленькая фиолетовая точка, но статистически она намертво коррелирует с диагнозом: помечают-то в основном то, что врач уже счёл подозрительным. Модель выучила правило «фиолетовое = рак» с разгромными последствиями: на помеченных снимках специфичность обвалилась до 45.8%, а средняя «уверенность в меланоме» на заведомо доброкачественных невусах подскочила с 0.16 до 0.54. Heat maps (vanilla gradient backpropagation) показали это прямо: пиками внимания модели были как раз синие пиксели меток.
Изящная деталь: если кропом убрать фон и оставить только само поражение, качество взлетает до AUC 0.993 — выше, чем у исходной модели (0.969). Модель всю дорогу держала в голове фон кадра, а не кожный покров. Один фиолетовый штрих стоил ей тридцать восемь процентных пунктов специфичности.
Фиолетовый маркер — грубая, видимая утечка. Тонче работает Zech et al. (PLOS Medicine, 2018). Авторы собрали 158 323 рентгена грудной клетки из трёх учреждений: NIH (112 120 снимков), Mount Sinai Hospital (42 396) и Indiana University (3 807) — и обучали CNN находить пневмонию. Внутри «своей» больницы всё отлично: объединённая модель MSH+NIH даёт AUC 0.931. Но на внешнем датасете Indiana тот же самый сетевой организм выдаёт 0.815 — заметно хуже.
Разгадка гадкая. Три больницы радикально различаются по преваленсу пневмонии: в Mount Sinai больных 34.2%, в NIH и Indiana — 1.2% и 1.0%. Из-за этого даже тривиальное «отсортируй снимки по больнице» даёт AUC 0.861 — выше, чем у многих уважаемых систем компьютерной диагностики. А CNN этот сигнал охотно выучивает: отдельная сеть опознаёт систему-«родину» снимка с точностью 99.95% для NIH и 99.98% для MSH. Аппаратура, протоколы, популяция пациентов — всё это оставляет в пикселях «паспорт» больницы, и модель честно мигрирует к самому надёжному корреляту цели, который смогла найти. Диагноз тут ни при чём: модель выучила «паспорт», а не пневмонию.
Sara Beery с соавторами (ECCV 2018, «Recognition in Terra Incognita») поставили тот же эксперимент в дикой природе: 20 камер-ловушек в трёх заповедниках США, сотни тысяч снимков диких животных. Задача — научиться узнавать виды и переносить это умение на новую, никогда не виденную камеру. Итог трезвый: на знакомой локации state-of-the-art модели прекрасны, на новой — проваливаются. Камера в другой чаще, с другим фоном и освещением, — уже не та вселенная. Model learned the scenery, not the species: тот же механизм, что и с паспортом больницы, только в роли «паспорта» — кусты и тени конкретной поляны.
Есть и обратная сторона медали: сплит может быть безупречным, а тест всё равно слепой. Luke Oakden-Rayner с соавторами назвали это hidden stratification: общая метрика высокая, но внутри данных прячутся подгруппы, до которых никто не додумался её разрезать, — и на них модель стабильно проваливается (в их работах — относительные провалы более 20% на клинически важных подтипах). Подтип «редкий агрессивный рак» уютно живёт внутри общего класса «рак» и портит жизнь тем, кому именно его и надо ловить.
Туда же — качество самих датасетов. В ChestXray-14 (112 120 снимков) метки не ставил врач: они добыты автоматическим data mining-ом текстов заключений. Oakden-Rayner с командой перепроверил репрезентативную выборку — 50 случаев на класс, всего 700, — и позитивная прогностическая ценность меток оказалась в основном на 10–30 процентных пунктов ниже заявленной. Модель, обученная на таком, честно учится — только не тому, что написано в названии колонки.
Отдельные кейсы можно было бы списать на неудачников, но Princeton-статистики Sayash Kapoor и Arvind Narayanan в Patterns (2023) собрали систематику: через 22 обзорных работы они задокументировали утечки минимум в 294 статьях минимум в 17 научных полях — от медицины до политологии. Заодно предложили таксономию из 8 типов утечек: от классики «preprocessing до сплита» до тонкостей вроде feature selection на всём датасете.
Их самый громкий разобранный пример — предсказание гражданских войн в политологии. Из 124 публикаций в этой области код и данные открыли только 12. Из этих двенадцати ошибки, ведущие к утечкам, нашлись в четырёх — ровно в тех, что громче всех декларировали превосходство сложного ML над классикой. Когда утечки починили, преимущество ML над логистической регрессией (моделью, старше которой почти век) исчезло; в самой эффектной паре разрыв AUC сжался с 0.14 до 0.01. Вишенка: у 9 из 12 работ не было оценки неопределённости вовсе — заявленный «AUC 0.85» в одной из них имел 95% CI 0.66–0.95, то есть статистически не отличался от бейзлайна. Неприятный штрих к портрету области: невоспроизводимые статьи цитируются чаще воспроизводимых. Ошибка вознаграждается вниманием.
Пока учёные ломали копья, индустрия показала, как подняться в топ вообще без данных. Moritz Hardt в посте 2015 года «Competing in a data science contest without reading the data» проделал трюк под названием wacky boosting на реальном Kaggle-турнире Heritage Health Prize с призовым фондом $3M и двумя годами длительности. Рецепт: генерируешь случайные бинарные векторы предсказаний, оставляешь те, которым на публичном лидерборде чуть повезло, и голосуешь большинством. Через ~700 сабмиттов «метод» улучшил позицию с ~146-го места на ~6-е, ни разу не взглянув в данные. Счёт на лидерборде округлён — а на дистанции в десятки тысяч повторных замеров это просто машина случайных чисел с расчётливой селекцией.
Peter Blum и тот же Hardt позже оформили диагноз теоретически (The Ladder, ICML 2015; Dwork et al., The Reusable Holdout, Science 2015): holdout-выборка честно валидна на один-единственный запрос. Лидерборд — это тысячи неявных запросов к ней, и рано или поздно удача замаскируется под качество. Стандартная защита Kaggle — пересчёт финального рейтинга на закрытой private-части, но история утечек этим не кончается: в WSDM-KKBox Churn Challenge 2017 (предсказание оттока подписчиков музыкального сервиса) всплыло расхождение между официальными тестовыми метками и данными, по которым они реально считались; автор треда про это, Dan Ofer, описал реакцию организаторов словом «embarrassment» — и метки так и не починили. InfiniteWing, финишировавший 17-м, в публичном solution-письме отмечал, что самогенерация лейблов дала ему ~0.0015 улучшения метрики. Утечка не всегда в коде участника — иногда она в метках организатора.
Лекарство известно, но оно дисциплина, а не спрей:
Мне нравится этот сюжет, потому что leakage — не про глупость и не про жульничество. Машина делает ровно то, о чём попросили: минимизирует ошибку на выборке, где ответ лежит рядом — как шпаргалка под подушкой на контрольной. Она не читает шпаргалку сознательно; просто шпаргалка лежала на виду, и та модель, что её увидела, автоматически победила. Фиолетовый маркер, паспорт больницы, временная метка из будущего — везде одна механика: в процедуре сбора данных образовался канал, по которому ответ течёт в признаки.
Человеческий анализ застревает на утешительном нарративе «модель выучила патологию». Модель выучила нашу процедуру — и она не отличима от умной, пока её не спросили на данных, которые по построению не могли протечь в обучение. Здоровый скепсис здесь — гигиена, а не паранойя: любая неожиданно красивая цифра обязана выжить на внешнем блоке, прежде чем её понесут в журнал или в прод.
Источники: хабр-ретроспектива по ретинопатии (habr.com/ru/articles/1095572, QWK 0.834→0.713); Winkler et al., JAMA Dermatology 155(10), 2019 (специфичность 84.1%→45.8%, скор невусов 0.16→0.54, AUC 0.969/0.922/0.993); Zech et al., PLOS Medicine 15(11), 2018 (158 323 снимка, NIH/MSH/IU, преваленс 34.2/1.2/1.0%, hospital-ID 99.95/99.98%, AUC 0.931→0.815); Beery, van Horn, Perona, «Recognition in Terra Incognita», ECCV 2018; Oakden-Rayner et al., Hidden Stratification (ACM CHIL 2020), Exploring Large-scale Public Medical Image Datasets (Academic Radiology, 2019; выборка 700 случаев, PPV ниже на 10–30 п.п.); Kapoor & Narayanan, «Leakage and the Reproducibility Crisis in ML-based Science», Patterns 4, 2023 (294 статьи, 17 полей, 22 обзора, 124→12→4, AUC-разрыв 0.14→0.01); Moritz Hardt, «Competing in a data science contest without reading the data», blog.mrtz.org, 2015 (Heritage Health Prize, 146→6 за ~700 сабмитов); Blum & Hardt, The Ladder (ICML 2015); Dwork et al., The Reusable Holdout (Science, 2015); InfiniteWing & Dan Ofer, KKBox Churn Challenge discussion, Kaggle 2017; Roberts et al., «Cross-validation strategies for data with temporal, spatial, hierarchical, or phylogenetic structure», Ecography 40: 913–929, 2017.