Обширный, но простой обзор наиболее заметных подходов
Недавно моя команда приняла участие в Вызове по идентификации горбатых китов, который проходил на Kaggle. Мы выиграли золотую медаль и заняли 10-е место (из 2131 команды) в таблице лидеров.
В этом сообщении в блоге я обобщу основные идеи нашего решения, а также дам краткий обзор интересных и запоминающихся методов, используемых другими командами.
описание проблемы
Основная цель заключалась в том, чтобы определить, принадлежит ли данная фотография китовой двуустки одной из 5004 известных особей китов или это новый_кит, который ранее не наблюдался.
Загадочным аспектом этого соревнования был огромный классовый дисбаланс. Для более чем 2000 классов использовалась только одна обучающая выборка, что затрудняло использование классификационного подхода из коробки. Более того, важной частью конкурса было определение того, является ли кит новым или нет, что оказалось весьма нетривиальной задачей.
Метрика конкурса была mAP @ 5 (средняя точность 5), что позволило нам представить до 5 прогнозов для каждого тестового изображения. Наш самый высокий результат в частном тестировании составил 0,959 mAP @ 5.
«Санакоеу, Плесков, Шахрай» 💪
В состав команды входили Владислав Шахрай (я), Артем Санакоеу, к.э.н. студент Гейдельбергского университета и Павел Плесков, гроссмейстер Kaggle Top-5.
Мы объединили наши усилия с Artsiom в разгар конкурса, чтобы ускорить эксперименты, и Павел присоединился к нам за неделю до крайнего срока слияния команд.
Проверка и начальная настройка
За пару месяцев до этого конкурса на Kaggle была размещена игровая версия того же конкурса, но, как отметили организаторы конкурса, настоящая (не игровая) версия содержала еще больше данных и более чистые метки. . Мы решили использовать знания и данные предыдущего конкурса по-разному:
- Используя данные предыдущего конкурса, мы использовали хеширование изображений для сбора более 2000 проверочных образцов. Это оказалось очень важным, когда мы позже проверили наши ансамбли.
- Мы удалили класс new_whale из набора обучающих данных, поскольку он не разделяет никаких логических функций изображения между своими элементами.
- Некоторые изображения вообще не были выровнены. К счастью, существовала общедоступная предварительно обученная модель ограничивающих прямоугольников, которая использовалась в выигрышном решении конкурса детских площадок. Мы использовали ее, чтобы определить точную ограничивающую рамку вокруг китовой двуустки и соответственно обрезать изображения.
- Из-за разной цветовой гаммы изображений все данные были преобразованы в оттенки серого перед обучением.
Подход №1: Сиамские сети (Владислав)
Нашей первой архитектурой была сиамская сеть с многочисленными архитектурами ответвлений и настраиваемыми потерями, которая состояла из ряда сверточных и плотных слоев. Мы использовали следующие архитектуры веток:
- ResNet-18, ResNet-34, Resnet-50
- SE-ResNeXt-50
- Подобная ResNet кастомная ветка опубликована Мартином Пиоттом.
Мы использовали жестко-отрицательный, а также жестко-положительный интеллектуальный анализ, решая задачу линейного присвоения на матрице баллов каждые 4 эпохи. В матрицу было добавлено немного рандомизации, чтобы упростить процесс обучения.
Использовалось прогрессивное обучение со стратегией разрешения 229x229 - ›384x384 -› 512x512. То есть мы сначала обучили нашу сеть на изображениях 229x229 с небольшой регуляризацией и большей скоростью обучения. После сходимости мы сбрасываем скорость обучения и увеличиваем регуляризацию, следовательно, снова обучаем сеть на изображениях с более высоким разрешением (например, 384x484).
Кроме того, из-за природы данных использовались сильные дополнения, которые включали случайную яркость, гауссов шум, случайные кадрирования и случайное размытие.
Кроме того, мы реализовали умную стратегию увеличения с переворачиванием, которая значительно помогла создать больше обучающих данных. В частности, для каждой пары обучающих изображений, принадлежащих одному и тому же киту X, Y
, мы создали еще одну обучающую пару flip(X), flip(Y)
. С другой стороны, для каждой пары разных китов мы создали еще три примера flip(X), Y
, Y, flip(X)
и flip(X), flip(Y)
.
Модели были оптимизированы с помощью оптимизатора Adam с начальной скоростью обучения 1e-4, снижающейся в 5 раз на плато. Размер партии был установлен на 64.
Источник моделей написан в Керасе. Обучение моделей на 400-600 эпох на одном 2080Ti занимало 2–3 дня (в зависимости от разрешения изображения).
Самая эффективная одиночная модель с ResNet-50 набрала 0,929 фунта.
Подход № 2: Метрическое обучение (Artsiom)
Другой подход, который мы использовали, - это метрическое обучение с Margin Loss. Мы использовали множество предварительно обученных магистральных архитектур ImageNet, которые включали:
- ResNet-50, ResNet-101, ResNet-152
- DenseNet-121, DenseNet-169
Сети обучались постепенно, в основном с использованием стратегии 448x448 - ›672x672.
Мы использовали оптимизатор Adam, снизив скорость обучения в 10 раз через 100 эпох. Мы также использовали размер партии 96 для всего обучения.
Самое интересное - это то, что сразу дало нам 2% прирост. Это метрический метод обучения, разработанный Sanakoyeu, Tschernezki, et al. и был принят для публикации на CVPR 2019. Он каждые n
эпохи разбивает обучающие данные, а также слой встраивания на k
кластеры. После настройки взаимного соответствия между обучающими блоками и учащимися модель обучает их отдельно, накапливая градиенты для сети филиалов. Вы можете ознакомиться с этой статьей вместе с кодом, когда он будет опубликован здесь.
«Разделяй и завоевывай пространство для встраивания метрического обучения», Арциом Санакоеу, Вадим Чернецки, Ута Бюхлер, Бьорн Оммер, в CVPR 2019
Из-за огромного дисбаланса классов использовались тяжелые дополнения, которые включали случайные перевороты, поворот, масштабирование, размытие, освещение, контраст, изменение насыщенности. Во время вывода были вычислены скалярные произведения между вектором признаков запроса и векторами признаков галереи поездов, и в качестве прогноза ТОП-1 был выбран класс с наивысшим значением скалярного произведения. Еще одна уловка, которая неявно помогала с дисбалансом классов, заключалась в усреднении векторов признаков для изображений поездов, принадлежащих одним и тем же идентификаторам китов.
Модели были реализованы с помощью PyTorch, и обучение на одном Titan Xp занимало 2–4 дня (в зависимости от разрешения изображения). Стоит отметить, что самая эффективная одиночная модель с магистралью DenseNet-169 набрала 0,931 фунта / дюйм.
Подход № 3: Классификация по признакам (Artsiom)
Когда я и Artsiom объединили свои усилия, первое, что мы сделали, - это обучили модель классификации, используя функции, извлеченные из всех наших моделей и объединенные вместе (конечно, после применения PCA).
Головка для классификации состояла из двух плотных слоев с выпадением между ними. Модель обучалась очень быстро, потому что мы использовали предварительно вычисленные функции.
Такой подход позволил получить 0,924 LB и внес еще больше разнообразия в общий ансамбль.
Подход №4: Новая классификация китов (Павел)
Одной из самых сложных частей этого конкурса была правильная классификация новых китов (поскольку около 30% всех изображений принадлежало к классу new_whale).
Популярной стратегией для решения этой проблемы было использование простого порога. То есть, если максимальная вероятность того, что данное изображение X принадлежит какому-либо известному классу китов, меньше порогового значения, оно было классифицировано как новый_кит. Однако мы подумали, что могут быть более эффективные способы решения проблемы.
Для каждой наиболее эффективной модели и ансамбля мы взяли их ТОП-4 прогноза, отсортированных в порядке убывания. Затем для каждой другой модели мы взяли их вероятности для выбранных 4 классов. Цель состояла в том, чтобы предсказать, является ли кит новым или нет, на основе этих характеристик.
Павел создал очень мощную смесь LogRegression, SVM, нескольких моделей k-NN и LightGBM. Комбинация всего этого дала нам 0,9655 ROC-AUC при перекрестной проверке и увеличила оценку LB на 2%.
Ансамбль
Создавать ансамбли из наших моделей было непросто. Дело в том, что выходные данные моих моделей представляли собой матрицу ненормализованных вероятностей (от 0 до 1), в то время как выходные матрицы, предоставленные Artsiom, состояли из евклидовых расстояний (таким образом, в диапазоне от 0 до бесконечности).
Мы испробовали множество методов для преобразования матриц Artsiom в вероятности, в том числе:
- t-SNE-подобное преобразование:
- Софтмакс
- Просто измените диапазон, применив функцию
1 / (1 + distances)
- Множество других функций для изменения диапазона матриц
К сожалению, первые два метода вообще не работали, хотя при использовании практически любой функции для обрезки диапазона до [0, 1] результат был примерно таким же. В итоге мы выбрали эту функцию, выбрав одну с наивысшим значением mAP @ 5 в проверочном наборе.
Удивительно, но лучшим оказался 1 / (1 + log(1 + log(1 + distances)))
.
Методы, используемые другими командами
На основе SIFT
Хочу выделить одно решение, которое, на мой взгляд, было одним из самых красивых и в то же время необычных.
Дэвид, теперь являющийся гроссмейстером Kaggle (ранг 12), был 4-м в Private LB и поделился своим решением в виде сообщения на форуме обсуждений Kaggle.
Он работал с изображениями с полным разрешением и использовал традиционные методы сопоставления ключевых точек, используя SIFT и ROOTSIFT. Чтобы справиться с ложными срабатываниями, Дэвид обучил U-Net отделить кита от фона. Интересно, что он использовал умную постобработку, чтобы дать классам только с одним обучающим примером больше шансов попасть в ТОП-1 прогнозов.
Мы также думали о том, чтобы попробовать методы на основе SIFT, но были уверены, что они определенно будут работать хуже, чем первоклассные нейронные сети.
На мой взгляд, вывод заключается в том, что мы никогда не должны ослепляться мощью глубокого обучения и недооценивать возможности традиционных методов.
Чистая классификация
Команда Pure Magic благодарит Радека (7 место), в которую входят Дмитрий Мишкин, Анастасия Мищук и Игорь Крашеный, применили подход, который представлял собой сочетание метрического обучения (тройное поражение) и классификации. , как описал Дмитрий в своем посте.
Они попробовали Center Loss для уменьшения переобучения при обучении классификационных моделей в течение длительного времени, а также температурное масштабирование перед применением softmax. Среди множества использованных магистральных архитектур лучшей была SE-ResNeXt-50, которая смогла достичь 0,955 LB.
Их решение намного разнообразнее, и я настоятельно рекомендую вам обратиться к исходному сообщению.
CosFace, ArcFace
Как было сказано в посте Ивана Сосина (его команда BratanNet заняла 9-е место в этом соревновании), они использовали подходы CosFace и ArcFace. Из исходного сообщения:
Среди прочего, Cosface и Arcface выделяются как недавно открытая SOTA для задачи распознавания лиц. Основная идея состоит в том, чтобы приблизить примеры одного и того же класса друг к другу в пространстве косинусного сходства и разделить отдельные классы. Обучение с использованием cosface или arcface обычно является классификацией, поэтому последней потерей стала CrossEntropy.
При использовании более крупных магистралей, таких как InceptionV3 или SE-ResNeXt-50, они заметили переоснащение, поэтому они переключились на более легкие сети, такие как ResNet-34, BN-Inception и DenseNet-121.
Команда также использовала тщательно подобранные дополнения и многочисленные методы модификации сети, такие как CoordConv и GapNet.
Что было особенно интересно в их подходе, так это то, как они поступили с тегами new_whale. Из исходного сообщения:
С самого начала мы поняли, что с новыми китами необходимо что-то делать, чтобы включить их в тренировочный процесс. Простым решением было присвоить каждому новому киту вероятность каждого класса 1/5004. С помощью техники взвешенной выборки это дало нам толчок. Но потом мы поняли, что можем использовать прогнозы softmax для новых китов, полученные на основе обученного ансамбля. Итак, мы придумали дистилляцию. Мы выбираем дистилляцию вместо псевдо-меток, потому что считается, что у нового кита метки отличаются от меток поездов. Хотя, возможно, это не совсем так.
Чтобы еще больше повысить возможности модели, мы добавили тестовые изображения с псевдометками в набор данных поезда. В конечном итоге наша единственная модель может достичь уровня 0,958 с объединением снимков. К сожалению, такая тренировка ансамбля не дала никаких улучшений. Возможно, это произошло из-за меньшего разнообразия из-за псевдо-этикеток и дистилляции.
Последние мысли
Что довольно удивительно, так это то, что в итоге встряски почти не произошло, несмотря на то, что частный набор тестов составлял почти 80% всего набора тестовых данных. Я считаю, что организаторы соревнований очень хорошо поработали, предоставив очень интересную задачу вместе с чистыми и обработанными данными.
Это были самые первые соревнования Kaggle, в которых я участвовал, и они определенно доказали, насколько интересными, увлекательными, мотивирующими и обучающими могут быть соревнования Kaggle. Хочу поздравить людей, которые благодаря этому конкурсу стали Экспертами, Мастерами и Гроссмейстерами. Я также хочу поблагодарить сообщество ODS.ai за прекрасные обсуждения и поддержку.
Напоследок хочу особо поблагодарить членов моей команды Артем Санакоеу и Павла Плескова еще раз за незабываемые впечатления от соревнований Kaggle.