Как выигрывать Kaggle соревнования: LLM-анализ выигрышных решений
Примерно год назад энтузиаст с Kaggle по имени Дарек Клечек провел интересный эксперимент: он собрал все доступные описания (writeups) побеждавших на Kaggle за последние годы решений, пропустил их через LLM и свел по ним общую статистику о том, какие механики и алгоритмы оказываются «наиболее победными». Отчет у парня получился достаточно объемный, интересный, а местами и непредсказуемый. Эта статья — свободный авторский пересказ его эссе. Пусть прологом к ней послужит цитата Дарека:
«Я люблю побеждать. Когда я присоединяюсь к соревнованию, я изучаю победные решения из прошлых подобных конкурсов. На их чтение и осмысление уходит много времени, но это невероятный источник идей и знаний. Но что, если бы мы могли обучиться на всех соревнованиях? Это кажется невозможным, ведь их так много! Что ж, оказывается, что c LLM мы можем это сделать…»
Механика
Для начала давайте разберемся с тем, как все это было реализовано. В основе анализа Дарека — API GPT-4 от OpenAI. Он использовал эту модель в два этапа: сначала для извлечения из описаний решений структурированный данных, а затем для очищения извлеченных из решений списков методов от шума. В качестве входных данных использовался этот датасет.
На первом шаге каждое описание подается в LLM, чтобы модель извлекла из него список упомянутых методов машинного обучения. Казалось бы, этого должно быть достаточно. Однако оказывается, что на выходе мы получаем довольно шумный список, поэтому мы переходим к следующему этапу. Здесь все извлеченные методы объединяются и снова направляются в LLM, задача которой — стандартизировать этот список, то есть каждому методу сопоставить более чистую категорию или, если угодно, кластер. Например, «размытие» и «вращение» объединяться в единую категорию «аугментация».
Получившаяся таблица. Столбец methods содержит шумный исходный метод, а столбец cleaning_methods — стандартизированную категорию.
Автор упоминает, что в последствии также проводил дополнительную ручную чистку данных: в ходе нее он исправлял некоторые галлюцинации LLM и удалял шум, с которым модель не справилась. Весь код Дарек выложил здесь. Получившимся датасетом он, кстати, тоже поделился. Так что можно поэкспериментировать с ним самостоятельно :)
Самые популярные методы и приемы
Ну, а теперь перейдем к самому интересному — посмотрим, какими приемчиками и методами чаще всего пользуются победители Kaggle соревнований. Кстати, если какие-то из представленных ниже на графике методов вам не знакомы — подписывайтесь на наш тг-канал Data Secrets: там мы ежедневно выкладываем разборы свежих статей, полезные материалы и новости из мира ML.
Итак, гистограмма выше иллюстрирует, что уверенное первое место в нашем рейтинге занимают ансамбли (Ensemble Methods). Пожалуй, неудивительно. Ну правда, кто из нас не пытался застекать или сблендить 100500 моделей?
Мем взят из тг-канала 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 в нашем тг‑канале. Подпишись, чтобы ничего не пропустить!