Запрети мне псевдолейблить – Telegram
Запрети мне псевдолейблить
2.76K subscribers
153 photos
3 files
147 links
Канал о пути к Kaggle competitions (теперь уже) GrandMaster и пиве, которым обливаешься в процессе

Последний авторский канал про мл, претендующий на искренность и позволяющий ставить клоунов
Download Telegram
Завтра выступаем на воркшопе NeurIPS 2023 как выбор организаторов!
Подключайтесь, радуйтесь с нами 😍

Время:
В Москве 1:00
В Европе 23:00

В комменты кину приведенное время и дату
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20211
Вчера закончилось соревнование CAFA5. Заняли с командой 132 место и зафармили бронзовую медальку 🥉
Разбирать эту сореву нет особого смысла: случилась она давно и только сейчас подбили лб нормально. Я даже биологический контекст не помню

Тем самым переполз с 1213 места на 1121 в глобальном рейтинге соревнований. Видимо в этом календарном году это последняя медалька 😭

Стало быть примерно за год получилось:
Вползти в Competition Expert
Выступить на Мюнхенском каггл митапе
Дать кучу разборов прошедших соревнований
Зафармить серебро 🥈и три бронзы 🥉️️️️️️ в компетишнах

И самое главное: познакомиться с кучей мотивированныих и интересных людей
Please open Telegram to view this post
VIEW IN TELEGRAM
👍205🔥4🏆3🕊111
Тинькофф запустил игру в слова, и я в ней не мог проиграть

Правила просты: 6 попыток, слово из 5 букв.
Нужно предложить существительное.
Игра подсветит, каких букв нет, какие есть, но не на той позиции, и угаданные буквы.

Пример: правильное слово 'канат', а вы пишете 'набат' – последние две и вторая буква угаданы, первая присутствует, но не на той позиции, а 'б' исключается. 🅰️

Я подумал и решил, что игра алгоритмически проходима, так что используйте мой скрипт. Он сильно помогает решать эту задачу. 🤖🤖🤖
1. Скачиваем массив всех русских слов
2. Из них отбираем только те, что содержат нужные буквы
3. Из них вычищаем слова, где есть ненужные буквы
4. Фильтруем по знанию о позициях присутствующих букв
5. Оставляем только существительные

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


В качестве компенсации желтому банку, подписывайтесь на канал @scitator_ai. Он ресерчит, иногда допиливает Catalyst (я туда даже контрибьютил) и вообще крутой человек из Тинькофф, его канал незаслуженно непопулярен

Маркетологи тинька, свяжитесь со мной, если вдруг хотите заплатить за интеграцию. Я не против
Please open Telegram to view this post
VIEW IN TELEGRAM
😁5211
CrackTinkoff.ipynb
5.5 KB
Скрипт для кракеров, инструкции внутри. Осторожно, внутри аж Pymorphy2, у новоявленных LLM экспертов может случиться шок

UPD:
Да вот вам коллаб просто https://colab.research.google.com/drive/1H8K_bHMcX935PDIzISvhMcJgt1DQnBo6?usp=sharing
😁13🔥3👨‍💻1111
Рубрика "идеи для изи контрибюшнов"

Есть такой майкрософтовский фреймворк для DL: torchscale.
Фреймворк предназначен для обучения PyTorch моделей на нескольких GPU эффективно и, в общем, для использования DataParallel "из коробки". Кстати, у них есть даже собственная реализация статьи LongSeq + VIT => LongVIT.
Решил поиграться с ним, но вот у меня он отказывался запускаться даже для примеров. Оказалось, господа инженеры забыли добавить часть зависимостей в requirements.txt, вероятно, потому что на их тестовом стенде всё уже было на месте.
Угадайте, кто за ними починил?

К чести мейнтейнеров этого фреймворка: после открытия пулреквеста не прошло и двух часов, как его влили в мастер. Сегодня ставлю внезапный лайк людям, подарившим мне бесконечную любовь к Windows 95 🤍️

Мораль, как обычно: все ошибаются, и если вы что-то починили, поделитесь со всеми. Будете контрибьютором фреймворка с 3к звездочками. Ну, или хотя бы переименуйте что-нибудь в polars и разберитесь, как всё это работает. Обычно контрибьюшн гайды позволяют неплохо прокачаться в том, как нужно писать код.
Please open Telegram to view this post
VIEW IN TELEGRAM
19🔥10👍322🥴1
Начинаем год с простых радостей
🔥2033
Тут один английский сэр наконец созрел и поставил аватарку на свой канал. Это будет означать только одно:
Пора сработать моему смарткнотракту на привлечение к нему внимание.
У Сережи совершенно противоположный моему каналу контент:
Он пишет о том, как избегать мл в бизнесе и если избежать не удается- как его правильно сервить, чтобы никто по дороге не умер.

Лично наблюдал, как из нескольких стажеров он вырастил плотных и ответственных сенйорчиков, а потом под шум уехал работать в мету на E5.

https://news.1rj.ru/str/pragmaticml

Подписывайтесь, я сам вычитываю посты перед публикацией и за качество ручаюсь. Ну и с Сережей каждый день общаюсь 😍. Он даже поддался на мою агитацию и тоже воспользовался секретным сигналом, и тоже неудачно. Разбор кстати почему так вышло и как вообще секретный сигнал иногда работает- через час. А еще я вам наверно задолжал разбор open problems
Please open Telegram to view this post
VIEW IN TELEGRAM
7🔥3🌭2
Секретный сигнал не сработал, но вот идею за трюком я вам расскажу:
В некоторых соревнованиях скор не сильно превосходит случайное угадывание, и лучше всего паблик-сабмиты работают через невоспроизводимые паблик-ядра. Хитрые авторы этих ядер часто получают медали за обсуждение, но они не готовы делиться кодом обучения своих моделей, что не способствует развитию сообщества. Я всегда ставлю минусы таким ядрам, потому что такая дешевая гонка за кармой должна быть хоть как-то уравновешена 😈

Под конец некоторых соревнований можно заметить, что бронза заканчивается именно теми скорами, которые были представлены такими публичными решениями.

Kaggle так устроен, что если вы сабмитите одни и те же предикты с вашим другом, тот, кто послал первым, будет выше в рейтинге. Получается, что в бронзе и чуть ниже нее выстраивается ряд из сотен человек с абсолютно одинаковыми значениями предсказания. При этом они отсортированы по скорости, и, несмотря на вашу быстрейшую по эту сторону Миссисипи руку, где-то в Дели найдется стрелок еще быстрее. И его банда. Пусть этим непреодолимым пределом по метрике будет const. Им заканчивается бронза. Часть решений в бронзе представляют собой улучшения этого лучшего публичного решения, до которого не все дошли, или там просто немного подправили коэффициенты, чтобы быть выше на паблике. Допустим, такие решения заслуживают половину бронзовых медалей на лидерборде.

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

Теперь представим, что мы добавим к этой константе случайную величину X с малым весом, например, из равномерного распределения. Тогда наш скор можно представить как const * 0.99 + 0.01 * X. Малый вес нужен, потому что функции качества оценивают это самое качество не вполне линейно, и при борьбе за тысячные на лидерборде локальная оценка уже не так точна, плотность объектов невелика, и случайности много. Так что можем моделировать всю разницу как случайную величину и в малой локальной области вокруг const полагать, что изменения линейны.

Рассмотрим два случая:
1. Вы подаете просто лучшее публичное решение и получаете const на лидерборде. Вы попадаете куда-то рядом с Делийскими стрелками, и вероятность получить медали стремится к нулю.
2. Вы подаете лучшее публичное решение с добавлением шума и получаете const + X на лидерборде и в прайвате. Вероятность P(const + X > const) около 0.5. У вас есть шанс случайно опередить конкурентов.

Для прайват-лидерборда у вас обычно есть два сабмита. Вероятно, вы помните из курса теории вероятностей, что P(X > 0) <= P(max(X_1, X_2) > 0). Для равномерного распределения на [-0.5, 0.5], например, можно показать, что P(max(X_1, X_2) > 0) = 0.75. Таким образом, если подать два раза топовое публичное ядро с шумом, то вероятность достичь бронзы уже больше 50% при идеальных условиях.

Как можно понять, что трюк может сработать и попробовать его использовать 🧠:
1. Сделать сложное собственное решение в соревновании. В UBC, например, очень большие изображения, и сложно предобработать их, поэтому создать хорошо работающее ядро сложно.
2. Понять, что вы не верите в свое решение.
3. Зайти в соревнование, но идеи закончились на последней неделе.
4. Топовое публичное решение не выглядит злонамеренным или случайным.

Но в этот раз трюк не сработал 💩:
1. Видимо, я выбрал переобученное ядро для базы. Возможно, степень его переобученности можно было бы определить по тому, насколько тонко подобраны коэффициенты, и добавить нормальную валидацию для TMA. Было два типа и один из них был хорошо представлен в прайвете/лб, но не в трейне
2. Не всегда трюк работает, ведь это случайность.

Если у вас есть свои размышления о том, какие распределения лучше использовать для моделирования и смешивания с предсказаниями, и как оптимизировать вес примешивания, делитесь ими в комментариях. Я не могу прийти к каким-то окончательным выводам. Кстати, этот трюк применялся даже для получения серебра, но не для меня.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14👍72😁2🤔1🥴11
#openproblems

Давайте немного разбираться с Open Problems, где не удалось взять золото, но все равно все очень довольны.

Начнем с краткого описания соревы:
Компания-организатор занимается тем, что пытается оптимизировать проведение дорогостоящих экспериментов с препаратами на живых, но отделенных от самих созданий клетках 🧪 (in vitro) 🧪. У клеток много разных типов и препарат лечащий одну клетку мог спокойно убить все клетки другого типа в том же организме. Взяли много таких экспериментов, в том числе контрольные. Можно увидеть на картинке подробности того, как проводился тест
И того на вход у нас есть:
1. Химическая формула препарата (строка в формате SMILES)
Например вот так записывается Л-аланин: N[C@@H](C)C(=O)O
Сейчас пойду завтракать и его есть


2. Тип клетки, которая будет воздействовать на препарат (просто название-категориалка)
Пример T cell CD8+, надеюсь к меня их очень много. Они убивают рак

Все, больше ничего нет. Есть только таргеты. Таргеты забавные:
Для каждого эксперимента замеряли экспрессию генов и прогнали ее через эконометрически-биоинформатическую модель-пакет из R под названием Limma (Linear Models for Microarray Data) сравнивая с контрольным экспериментом. Взяли diff p-value изменений каждого гена и их логарифмировали и умножили все это дело на знак изменения (уменьшение- минус, увеличение плюс).

Решайте задачу господа! Через час пост про то, как 6 и 7 место смело ворвались в топ и всех порвали.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10🏆2🦄1
#openproblems

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

Прием можно представить как нормализацию для каждого триплета взаимодействий, а затем доучивание того, как всю эту великолепную микровселенную меняет препарат.

Пошлем kudos человеку, который не стакал 10к неинтерпретируемых моделей (как мы)
👍223😍2🔥1👏1😁1🥴1
#openproblems

Муж с 6 места, наоборот, поступил в лучших традициях Александра Геннадьевича:
Разобрался с пакетом Limma на R:
1. Обучил Limma на трейне
2. Предсказал тест
3. Понял, что цифры на трейне не совсем сходятся
Понял, что Limma была обучена на трейне и тесте одновременно (так правильно, это же эконометрическая модель!), а он учился только на трейне.
4. Вспомнил два ключевых слова и одно секретное (среднее, дисперсия и таргет-лик) и домножил на коэффициенты параметры линейной модели, чтобы цифры сходились.
5. Посчитал обратное преобразование из получившейся модели

Таким образом он получил пайплайн восстановления оригинальных экспрессий генов и получил великолепное свойство для таргетов:
Теперь таргеты были не из островершинного распределния (что бы не говорили, бог хранит гдр-война Королева за то, что заставил меня помнить все каноничные названия на русском языке для этих штук), а из вполне себе нормального. Но эта моделька хорошо перформила на private test, на лб она работала средне. Тем ценнее вера в себя и в свою схему валидации!

Поэтому на всякий противопожарный случай, автор сблендил решения еще и с моделью, учащейся на обычные таргеты.

Из интересных штук, которые можно себе унести в любые соревнования/продакшны: учился в обеих моделях на Smooth L1 loss и клянется, что это сильно помогло на лб и валидации, еще и стабильности добавило.
👍108🔥32
#openproblems

Третье место (да, в местах 4-5 нет классных приколов, о которых хотелось бы рассказать):
Все пошло уже мощным и грамотным заливанием ресурсов:

1. Человек взял маленькую нейростеку и оптимизировал ее ширину/длину/место для батчнормов/место для дропаутов/место для леернормов c помощью оптуны
2. Из получившихся хороших сеток собрал ансамбль, для которого веса тоже оптимизровал оптуной.
3. Для этого ансамбля предсказал тест и взял результат как псевдолейблы 🤍️, для которых веса при обучении тоже оптимизировал (конечно оптуной).
Тут интересно: вес для всех псевдолейблов был глобальный, т.е. в обучение добавлялись вообще все предикты теста, но с одинаковым весом и никак не оценивалась 'уверенность' в предикте.
4. Затем собрал ансамбль назад и обучил его 20 раз, после чего взял медиану аутпута по каждому гену

Ставки на то, сколько терафлопс-часов потратил гений оптимизации- пишите в комменты
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21👍32🥰1
Хочу немного похвалить команду катбуста:
1. Чтобы завести multi-gpu тренировку, достаточно добавить две строчки в параметы модели
{...
"task_type": "GPU",
"devices":'0:1',
...}

2. Чтобы вы не улетали по лимиту памяти, катбуст сам определяет размер памяти каждой гпу и позволяет контролировать загрузку их памяти в процентах

Пост написан после 8 часов попыток правильно скомпиллить любимый LGBM для GPU в энвайроменте каггла
Вообще ребята сделали огромный прогресс с тех пор, как я устанавливал пакет под python3.6, запускал их примеры и получал ошибки исполнения в строках стиля
print learning_rate

Хотя вся остальная часть пакета даже выглядела как третий пайтон. Приходилось лезть в сорсы обертки и уже ее фиксить.
🔥183😁21👍1
#openproblems

На втором месте у нас несколько удачных находок:

Оригинальная стратегия валидации:
Автор применил подход к валидации, где кластеризовал многомерные таргеты с использованием K-means. Для кросс-валидации он затем равномерно семплировал данные из получившихся кластеров. Таким образом, в каждом фолде кросс-валидации получались похожие глобальные, но различные локальные распределения таргетов. Мы также попытались использовать схожий метод, семплируя по типам клеток, что также добавило стабильности валидации. Размер валидационных фолдов был подобран вручную в пределах 10% - 20%, лучшим был размер 10%, что докидывало немного скора

Фичегенерация:
1. Добавлен mean-target-encoding для типов клеток и драгов, что заметно улучшило производительность моделей.
2. Применен TruncSVD для преобразования таргетов, и обнаружено, что некоторые семплы имеют значительную дисперсию для TruncSVD, что было использовано как отдельная фича. Подобный прием с включением Var таргетов в фичи я уже пар раз видел в топовых решениях, хотя определение правила для применения трюка остается открытым вопросом.

Модель:
Обучал собственный трансформер. Архитектура была относительно простой, включая два эмбединга для континуальных и категориальных признаков, два линейных слоя для них, LayerNorm, линейный слой на конкатенации и трансформерный энкодер с GELU, завершенный линейным слоем для вывода. Мы пробовали похожие архитектуры, но без энкодера от трансформера. Кстати другие места тоже говорили о том, что пробовали трансформеры и у них не завелось.
Для оптимизации использовался Lion. Он прям хорошо работает для трансформеров. Ну и Huber Loss для применял для смягчения воздействия выбросов и улучшения общего качества.

Из того, что можно утащить себе:
• Huber Loss
• Lion
• Попробуйте включить трансформерный энкодер в сеть
• Очень важно правильно подбирать размер валидации
10👍3🔥31
Какие из доступных на Kaggle GPU лучше использовать?
В принципе есть две опции: P100 vs 2xT4.

По железу разница неоднозначная:
1. У 2xT4 карточек памяти больше (на двоих, конечно же): 2x16 GB против 16 GB VRAM. Хотите очень большой батч и можете себе позволить мультидевайс тренировку- лучше ходить в T4.

2. У T4 память формата GDDR6 c 256 битной шиной, в то время как у P100 HBM2 и 4096 бит для шины. Означает буквально следующее: на P100 данные загружаются сильно быстрее. Если нужно часто таскать туда-обратно тензоры (например учиться минибатчем)- будет работать эффективнее. Но разница на самом деле не в 8 раз, а в 4. За счет того, что карточек две- загрузка параллелится. Теоретическая пропускная способность P100 в этом плане 732 GB/s, а для T4 320 GB/s. Так что в случае распараллеливания разница шины не так существена, всего 12.5%
640 GB / 732 GB

3. Для работы в FP32 у P100 заявлены 9 tFLOPS производительности, в то время как у T4 8 tFLOPS. Помним, их две.
Для смешаной точности (для тренировки и для предикта) у P100 заявлены скромные 19 tFLOPS, в то время как у T4 совершенно безумные 65 tFLOPS. Разницу дают тензорные ядра, которых в более старой P100 нет.

4. Секретный немецкий пункт: энергоэффективность. Две T4 едят 140 ватт на двоих, в то время как P100 поедает 250 ватт

В общем логика принятия решений для DL на каггле такая:
Ваша задача хорошо параллелится и фреймворк поддерживает мультидевайс тренировку- однозначно T4.
Используете что-нибудь экзотичное и не так хорошо параллелящееся (на вскидку- графовые сетки, авторегрессионную тренировку на последовательностях, какую-нибудь экзотичную штуку на старом тензорфлоу или керасе) забейте и живите с P100, она тоже неплохая, хоть и чуть более старая.

Насчет GPU-бустингов можно побенчмаркать, там сильно все зависит от реализации. Например LGBM под CUDA или хотя бы несколько гпу я в окружении Kaggle не справился скомпилировать (да, надо из сорсов) и единственный путь- гонять его на P100. А вот катбуст завелся с полпинка и очень шустро у удобно утилизрует две T4
🔥15🥰731
#openproblems

🥇 🏆Победитель соревнования скорее удивил своей находчивостью и упорством

Фичи:
В первую очередь он вспомнил о статье из Nature: BioWordVec, improving biomedical word embeddings with subword information and MeSH
Идея
статьи: обучим на заголовках статей/терминов word2vec и в нем будет крыться некоторая близость терминов.
Помните, что как входные данные были доступны только название лекарств, их формулы и типы клеток? Победитель пошел на вики и спарсил для каждого препарата и каждого типа клеток их короткое описание. Там, где описания не находились по обычному названию- он шел и руками находил релевантные или сам дописывал тексты. А вот уже эти описания он прогнал через BioWordVec.
Меня одного бесит, что они забыли про двойку или хотя бы to в названии метода?
И уже из этих векторов эмбедингов набутстрапил финальные эмбединги для каждого терма. Одним из параметров подбора было 'сколько предложений из описания термина бутстрапить'.

2. Взял признаки из ChemBert, которые тоже являются некоторым текстовым специализированным представлением для лекарств. Эти эмбединги были не очень стабильны и об их использование многие сломали копья. (и мы тоже) У автора пайплайн с этими эмбедингами завелся от добавления target-quantile-encoding для каждого из лекарств.

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

Модели:
1d-CNN/GRU/LSTM архитектуры на его sequence фичах. Особых находок в арихетктуре нет. Но есть в лоссах, их тут целый зоопарк:
LogCoshLoss + MSE + L1 + BCE

1. Если с последними тремя все понятно, то вот первый это что-то редкое и авторское (на картинке)
Автор объясняет его как MAE, но более гладкий и взятый вот отсюда.

2. BCELoss предсказывал направление изменения эксперсии гена, что можно засчитать за декомпозицию постобработки таргета. Подробнее вот тут.
3. Оптимизатором использовался ванильный Adam, ничего особенного.

Что можно унести себе:
1. LogCoshLoss как более гладкий вариант MAE
2. Оригинальные ходы по обогащению данных иногда хорошо заходят и в этом направлении нужно думать
3. Иногда вас шейкапает на 258 мест из грязи в князи с призовыми в $12к и победу на NIPs сореве.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14👍5🏆41
Канал растет, рынок тает и в лс приходят люди с вопросами о том, как искать работу.

А я особо и не знаю, она или находит меня сама, или я обращаюсь к своим друзьям, которые знают о моих интересах и опыте и сами меня куда-то запихивают. Я делаю точно так же, но если знаю, что есть запрос на конкретные скиллы и я сразу вспоминаю о каком-то подходящем человеке.
Но вот для 95% остальных случаев работу надо искать самостоятельно и Борис тут написал неплохую методичку:
Методичка: Поиск Работы в ML/DS

Дает чуть более глубокое понимание механик, чем мои предложения затехать резюме и выкинуть неизмеримые достижения :0
🔥9
Рубрика "изи контрибьюшн" продолжается.

В прошлый раз я добавил зависимости для torchscale, всего одну строчку и тем самым сделал мир немного лучше. В этот раз я решил пойти дальше и внес изменение всего в одном символе.
Вот вам микроистория: Я экспериментировал с CatBoost, пытаясь запустить его на GPU, и обнаружил, что в списке доступных лоссов для GPU отсутствует MAE, хотя есть Huber. Это показалось мне странным, ведь Huber фактически является IF между MAE и MSE. Такого быть не может, что Huber написали, а вот в MAE какая-то серьезная проблема. После теста на Kaggle оказалось, что все работает, даже на MultGPU сетапе. Значит, ошибка была в документации.
Исправил документацию, согласился на бесплатную работу на Яндексе (у них своя лицензия на контрибьюшны), и мой пулл-реквест уже в мастере.

Думаю изменение чуть важнее, чем кажется на первый взгляд. MAE - один из самых популярных лоссов, и CatBoost действительно оптимизирован для GPU, что делает его более удобным и быстрым в обучении. Он просто работает из коробки. Я столкнулся с этой странной проблемой с недоступностью MAE для GPU несколько раз в прошлом, просто не проверяя ее. Заходил, видел что недоступно и шел дальше, ковырять любимый LGBM. Ганс, мы что, фанаты майкрософт? А оказалось, дело было в документации.
Вообще у CatBoost много документации, но она не всегда точная, несмотря на мои дифирамбы этой библиотеке. Так что, если вдруг вы хотите внести свой вклад в историю (даже на 356 месте 355 уже мое), внимательно прочитайте несколько страниц документации и обращайте внимание на детали. Глаз за что-нибудь зацепится.

Маленькие контрибьюшны делают библиотеку на 0.1% лучше, но уже сейчас. А вот MR моего бывшего коллеги с FocalLoss лежал в ревью больше года.
👍2122🔥1