Примерно год назад энтузиаст с Kaggle по имени Дарек Клечек провел интересный эксперимент: он собрал все доступные описания (writeups) побеждавших на Kaggle за последние годы решений, пропустил их через LLM и свел по ним общую статистику о том, какие механики и алгоритмы оказываются "наиболее победными". Отчет у парня получился достаточно объемный, интересный, а местами и непредсказуемый. Эта статья – свободный авторский пересказ его эссе. Пусть прологом к ней послужит цитата Дарека:

"Я люблю побеждать. Когда я присоединяюсь к соревнованию, я изучаю победные решения из прошлых подобных конкурсов. На их чтение и осмысление уходит много времени, но это невероятный источник идей и знаний. Но что, если бы мы могли обучиться на всех соревнованиях? Это кажется невозможным, ведь их так много! Что ж, оказывается, что c LLM мы можем это сделать..."

Механика  

Для начала давайте разберемся с тем, как все это было реализовано. В основе анализа Дарека – API GPT-4 от OpenAI. Он использовал эту модель в два этапа: сначала для извлечения из описаний решений структурированный данных, а затем для очищения извлеченных из решений списков методов от шума. В качестве входных данных использовался этот датасет.

На первом шаге каждое описание подается в LLM, чтобы модель извлекла из него список упомянутых методов машинного обучения. Казалось бы, этого должно быть достаточно. Однако оказывается, что на выходе мы получаем довольно шумный список, поэтому мы переходим к следующему этапу. Здесь все извлеченные методы объединяются и снова направляются в LLM, задача которой – стандартизировать этот список, то есть каждому методу сопоставить более чистую категорию или, если угодно, кластер. Например, "размытие" и "вращение" объединяться в единую категорию "аугментация".

Получившаяся таблица. Столбец methods содержит шумный исходный метод, а столбец cleaning_methods – стандартизированную категорию.
Получившаяся таблица. Столбец methods содержит шумный исходный метод, а столбец cleaning_methods – стандартизированную категорию.

Автор упоминает, что в последствии также проводил дополнительную ручную чистку данных: в ходе нее он исправлял некоторые галлюцинации LLM и удалял шум, с которым модель не справилась. Весь код Дарек выложил здесь. Получившимся датасетом он, кстати, тоже поделился. Так что можно поэкспериментировать с ним самостоятельно :)

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

Ну а теперь перейдем к самому интересному – посмотрим, какими приемчиками и методами чаще всего пользуются победители Kaggle соревнований. Кстати, если какие-то из представленных ниже на графике методов вам не знакомы – подписывайтесь на наш тг-канал Data Secrets: там мы ежедневно выкладываем разборы свежих статей, полезные материалы и новости из мира ML.

Итак, гистограмма выше иллюстрирует, что уверенное первое место в нашем рейтинге занимают ансамбли (Ensemble Methods). Пожалуй, неудивительно. Ну правда, кто из нас не пытался застекать или сблендить 100500 моделей?

Мем взят из тг-канала Data Secrets
Мем взят из тг-канала Data Secrets

Дальше – интереснее. На втором месте в рейтинге применяемых техник оказалась... аугментация. А вот всеми любимый бустинг спустился аж на четвертую позицию, его обогнали сверточные нейросети.

Аугментация – это важно?

А может, и не стоит так удивляться тому, что аугментация заняла почетное второе место? В реальной жизни самый важный аспект построения хорошей модели – это данные. На Kaggle данные нам уже даны, и основной способ их разнообразить и сделать датасет больше – аугментация. Если посмотреть на эту категорию "под микроскопом", получается такая картина:

Тут, помимо общей категории, мы видим популярный подход TTA (test-time augmentation — аугментация во время теста), целую кучу методов для преобразования изображений, и наконец, дополнение данных из внешних источников. Да-да, этого тоже не стоит стесняться. Особенно сейчас, когда под рукой LLM.

Кстати про Deep Leaning

А что там на счет CNN? Свертки то что забыли на третьем месте? Тут нужно помнить о том, что соревнования по компьютерному зрению были невероятно популярны на Kaggle в 2018-2023 годах. Поэтому, возможно, они просто преобладали в исходном наборе данных, по которым собирался анализ. Тем не менее, автора тоже заинтересовала такая статистика, и он решил сравнить динамику популярности трех основных архитектур нейросетей: сверток, рекуррентных сетей и трансформеров, которые сейчас считаются по умолчанию наилучшей архитектурой почти для любой задачи. Вот что вышло:

На графике видно, как глубокое обучение выходит на сцену Kaggle в 2016 году. Сначала мы пристрастились к CNN, а вскоре за ними последовали и RNN. Трансформеры были изобретены в 2017, на Kaggle начали появляться в 2019, а к 2022 году достигли пика. По мере роста популярности трансформеров, любовь к RNN заметно пошла на спад, но CNN поначалу продолжили процветать. Только в 2022, когда трансформер обрел настоящую славу, их популярность начала падать.

Градиентный бустинг

Вот еще один график, где к нашей Deep Learning троице присоединяется градиентный бустинг:

Что тут скажешь, настоящий dramatic fall. Доминирование градиентного бустинга до эпохи глубокого обучения, вероятно, неудивительно, особенно учитывая популярность табличных соревнований в то время. Конечно, потом, по мере того, как Kaggle добавлял все больше соревнований по CV и NLP, метод перестал быть настолько распространенным.

Но обратите внимание на 2022 год – в это время популярность бустинга снова начинает расти (на диаграмме, кстати, логарифмическая шкала). Дело в том, что многие участники приноровились использовать GBDT в сочетании с трансформерами или другими DL архитектурами. Например, в соревнованиях по NLP. Если хотите посмотреть на то, как такие коллаборации реализуются на практике, можете залезть в приведенный выше датасет и воспользоваться этим скриптом:

combined_methods = df.groupby(['year', 'competition_name', 'place', 'link']).agg({'cleaned_methods' : list}).reset_index()
combined_methods['both'] = combined_methods.cleaned_methods.apply(lambda x: 'Gradient Boosting' in x and ('Transformers' in x or 'CNNs' in x or 'RNNs' in x))
sample = combined_methods[combined_methods.both == True].sample(n=5, random_state=1)
for i, (_, row) in enumerate(sample.iterrows()):
    print(f'[{14 + i}] {row.place}st place in {row.competition_name} ({row.year}): {row.link}')

Лоссы и оптимизаторы

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

Получается довольно интересная картина: дефолтные лоссы и оптимизаторы оказываются самыми надежными! Наверное, не зря они считаются дефолтными :) Так, семейство Адам полностью захватило власть в мире оптимизаторов. Примерно то же самое и с лоссами: за исключением focal loss (почитать о нем можно здесь) большинство решений используют стандартные CE/BCE/MSE.

Лейбелинг и пост-обработка

Эти разделы автор не зря анализировал отдельно: бытует мнение, что именно в них заложена вся магия победы. В любом случае, вот вам топ методов, которые стоит держать в своем арсенале:

Не удивительно, что самой излюбленной фишкой победителей оказывается pseudo-labeling и label smoothing. Они действительно работают хорошо. Ну а что касается пост-обработки, то в этом топе магия точно есть: трешхолд, averaging, weighted averaging – все это определенно стоит иметь в виду.

Выводы

Итак. Вот чему нас учит все перечисленное AKA ваш чек-лист для следующего Kaggle соревнования:

  • Данные — это ключ: правильно их обработайте и грамотно дополните

  • Не забывайте про GBDT, CNN и RNN! О трансформерах всегда вспомнить успеете :)

  • Не игнорируйте дефолтные конфиги (оптимизаторы, функции потерь)

  • Попробуйте псевдо-лейбелинг

  • Уделите много времени и сил пост-обработке

  • Ну и, конечно, используйте старые добрые ансамбли!

Больше новостей, мемов и пасхалок из мира ML в нашем тг‑канале. Подпишись, чтобы ничего не пропустить!

Комментарии (3)


  1. mixsture
    02.10.2024 12:25

    Но, постойте, gradient boosting и есть подвид метода Ensemble. Зачем их разделили на 2 столбца?
    Ensemble - это совместное использование большого числа моделей.
    Gradient boosting - это ensemble, в котором каждой модели назначаются все уменьшающиеся веса (gradient) с основной идеей: что каждая следующая модель должна исправлять ошибки предыдущей (boosting).


    1. DataSecrets Автор
      02.10.2024 12:25

      Да, вы правы, конечно. Каждый бустинг ансамбль, но не каждый ансамбль бустинг)) Возможно, автор как-то вручную контролировал выделение метода в другую категорию из-за заслуживающей отдельного внимания популярности именно бустинга как самостоятельного алгоритма, а не как части ансамблей. В оригинальном эссе об этом информации нет


  1. mixsture
    02.10.2024 12:25

    del (повтор)