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

Последний авторский канал про мл, претендующий на искренность и позволяющий ставить клоунов
Download Telegram
#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
🤑🤑🤑

На выходных буду готовить вам серию постов по UBC, который закончился 3 января и в котором ничего не получилось нафармить. Но тем ценнее уроки из него
🔥292
#UBC

Разбираем на этой неделе Ovarian Cancer Subtype Classification and Outlier Detection
Даны 700 гб png-картинок медицинских изображений. Конкретно- срезы тканей человеческиэ яичников. Картинки двух типов: большие и очень большие.
Большие картинки- это 3kX3k, очень большие- от 20kX2k до 32kX32k.
Задача- мультиклассификация на 6 типов рака. Все картинки- это какой-то рак, но нужно понять, какой конкретно.

Картинки имеют некоторые особенности- например один и тот же образец тканей может быть нарезана на несколько слайсов и нам все их покажут. Пример прикладываю. Организаторы для нас заботливо рескейлнули данные для самых больших картинок, чтобы мы на пережимку не тратили драгоценныый компьют и не увеличивали карбоновый след. Их мы будем называть 'thumbnails'.
Так же картинки двух типов:
WSI и TMA.
WSI- это очень большие на черном фоне и именно на них может быть несколько срезов
TMA- это просто большие и они обычно на белом фоне.

Еще одна особенность: в тесте ~40% TMA и ~60%, а вот в трейне это ~5% к ~95%.
Как метрика качества- balanced accuracy.
Медицинская сорева, а вы думали будет просто?
👍932🔥1
Я безумно люблю самообразовываться по разным темам, это один из моих способов расширять кругозор. К тому же, у меня канал про модели.

Однажды подруга мне сказала, что ей не нравятся фотографии, которые ей снимают окружающие. Я подумал, что это вообще распостраненная проблема и наверное скилл снимать лучше среднего может мне пригодиться. Я пошел и прочитал книжку, которую до сих пор всем советую: Модель. Проблемы позирования. Надо бы кстати перечитать.
После прочтения перестаешь сомневаться, что с твоими фотками что-то не так и учишься делать неплохие снимки, а потом еще и отделять неприятие человеком своей внешности от качества съемки. Книга- фундаментальная база всех лайфхаков съемки от инстаграм-блогерш.

В рамках того же паттерна еще с 2020 года я был подписан на Start Career in DS, как хороший источник материалов вокруг дс и базы, которую могут спросить на собеседованиях/можно посоветовать чуть менее опытным коллегам или студентам. Канал- это скорее источник постоянного планомерного прикладного образования нарезанного мелкими кусочками. Как раз то, что нужно на старте. Качаться сюда -> Start Career in DS
🔥18🌭1
#UBC

10 место:
Пример хорошего не кагглерского решения. Примерно так же задачка бы и решалась в продакшне.

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

Предобработка тоже довольно стандартная:
Для того, чтобы увеличить схожесть WSI и TMA у последних белый фон заменили на черный.
Маски для WSI-трейна порезали на тайлы и подогнали к размерам thumbnails. Потом отсротировали тайлы по заполненности масок и взяли топ 16 для обучения.
Для TMA, которые в дефиците сделали чуть иначе: Resize -> случайный даунскейлинг и возвращение к изначальному размеру -> flip/rotation -> Channel shuffle/Gaussian Blur/Imagenet Normalization

Валидация:
Обычный StratKFold с 5 фолдами. Стратифицировали по TMA/WSI и целевому классу.

Модель:
Обучили MaxViT Tiny FPN (это такой efficientnet в мире VIT, где добавили больше Conv слоев, чтобы работало быстрее и скейлилось хорошо)
На бекбоне EfficientNetV2 конечно же.
Как оптимизатор AdamW, CosineScheduler и AMP стало быть, включаем FP16, чтобы 15 эпох проходили как можно быстрее.

Постобработка:
Для тест тайма использовали 3xTTA (Test time augmentation. Учим модель на аугментациях, а потом в тестайме одну картинку несколько раз прогоняем через модель с разными аугами и усредняем результаты).

И того 10 место и решение на 10% хуже по BalancedAccuracy, чем у top1.
🔥145👍53
#UBC

9 место
Тут авторы совем не использовали внешних данных, но использовали интересную схема тренировки.

Препроцессинг:
Для начала, решили сделать отдельный if для определния wsi/tma в рантайме и не сильно полагаться на авторскую разметку. Просто они не знали, что для ускорения можно использовать простой советский polars

Если классифицированнваякартинка WSI- уменьшаем ее в 3 раза. Нарезаем на тайлы.

Во время тренировки фильтруем тайлы:
Используем все тайлы, если отношение фона/изображения больше 0.5
Если 0.65, то первые 50 тайлов.
Если 0.75, то первые 20 тайлов

Тренировка:
Далее идут три этапа тренировки:
Этап 1: Обычная тренировка, учим классы из трейна через BCE, верим в лучшее.
Этап 2: С помощью модельки с первого этапа генерируем что? Псевдолейблы!. Если такой лейбл выше 0.3, то округляем до единицы, иначе до нуля. И нашу сетку с первого этапа тренируем с нуля с лоссом: BCE(labels) + 0.3 * BCE(🤍️)
Этап 3: Берем веса с этапа 2 и используем 🤍️ для тренировки с уменьшеным lr. Теперь учимся на BCE(labels) + 0.15 * BCE(🤍️)

Для меня выглядит как костыльный вариант LabelSmoothing/OnlineLabelSmoothing, но ведь работает же.

Модель: Работали с бекбонами efficientnetb4 и efficientnet_v2s для maxvit_tiny.
Про отпимизатор не пишут

В комменты призываются все эксперты в современном компьютерном зрении, которые смогу объяснить, насколько распостранены такие нелобовые методы тренировки
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥733👍2🌭2
#UBC

Восьмое место: История как мощный китайский почти мастер нафармил последнюю медальку на грандмастера
TMA и WSI процессим совсем раздельно.

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

Во время инференса:
1. Ищем аркфейсом ближайший семпл из своего внешнего трейна и проставляем тот же класс.
2. Если близкий по косайну семпл не нашелся или предсказался мертвым- предсказываем 'тяжелым стаком' из EffNet в разршении 1280 и ConvNext в 1024.

Таким образом аркфейс покрывал 60% TMA в тесте и оставшиеся 40% уже прогонялись через тяжелые модельки. Учитывая размер данных- мощная экономия времени и как следствие возможность применять стак из 4 моделей для TMA.

Для WSI:
1. Берем фичэкстрактор arcface из части с TMA и извлекаем им фичи
2. Предсказываем класс 'другое' и если класс имеет большую вероятность- выносим его в отдельный список.
3. С помощью DFTD-MIL сгенерируем из нашей кучи 'других' WSI еще немного синтетических WSI.
4. На всем этом объеме учим DFTD-MIL.

Во время инференса:
1. Даунскейлим WSI до разрешения в 768
2. Извлекаем фичи фичэкстрактором для TMA из WSI-картинки
3. К фичам применяем DFTD-MIL и извлекаем фичи ансамблем EffNet и ConvNext
4. Предсказываем по ним DFTD-MIL головой

Про оптимизатор/валидацию новоиспеченный грандмастер не пишет, потому что с получения статуса такие вещи становятся очевидны.
👍11🔥32
Автор прошлого решения, Forcewithme уже попадал пару раз в мои разборы, но тут он добрался до грандмастера. У него довольно личная история:
Он три года подряд плотно решал каггл и мечтал о заветной золотой плашке. Шутка ли: 5 золотых, 13 серебряных и 4 бронзы. И вот остался его последни семестр, работа уже найдена, есть куча медалей, но сологолда нет. Уже пора семью заводить, работать работу и ездить на Volkswagen Golf, время прошло и он не успел. Но попытка за попыткой соло взять золото не удавалось:
Соло бронза в GoDaddy
Соло бронза в знаменитом по одному киприоту PetFinder
Соло серебро в ImageMatching с шейкдауном на 46 место с 20
Соло серебро Google Contrails
И вот наконец это соло золото!
🏆20👍11
Что вообще за MIL?
Это такой сетап задачи, когда у вас объект такой большой, что с ним неудобно работать. Можно конечно зарескейлить, но раки они бывают такие маленькие, что без лупы не разглядишь. Поэтому WSI картинки такие огромные. Мы ее режем на патчи и может так оказаться, что только на одном патче у нас рак, а все остальные здоровые. А лейбл у нас выдан конечно на всю картинку.
Для таких штук обычно извлекают сначала признаки каким-то одним экстрактором, а потом уже для этих фичей применяют аггрегацию.
Например можно просто взять MaxPooling и результат пихать в МЛП-классификатор. А можно пойти хитрее и применять attantion например. Вот в DFTD-MIL развивают этот подход и придумывают свой способ считать умную аггрегацию по картинкам.

Это не канал с обзорами статей, честно честно!
12🔥2👍1😁1
#UBC

Шестое место: мы просто победили
Сначала не хотел брать этих ребят в разбор, но потом подумал, что стоит показывать не только Wunderwaffe.
Парни вспомнили хорошую статью по классификации снимков. Парни ее применили. Парни получили 3 место на паблике и 6 на прайвете.

1. Нарезаем картинки на патчи. Берем из них 1000 патчей. Если патчей не хватает- дублируем случайные до тех пор, пока не наберется тысяча.
2. Используем веса модели из статьи в разрешении 1000x768
3. Для MIL используем модельку из другой статьи. Запомните этот Chowder, мы о нем еще вспомним в грядущем посте. Если посмотреть картинки в статье, там даже на наши данные все похоже!
4. Ансамблим 7 разных обобщающих моделей из прошлого этапа и детектируем 'other' по средней энтропии (-sum(p*log(p))
5. Подбираем для other порог отсечения

Что могло бы улучшить, но как-то было лень заводить:
Можно было патчи выбирать не случайно, а с помощью небольшого (всего 5 млн параметров) трансформера

Картинка не является высказыванием, просто я искал 'Simple solution' и кекнул с результата
👍11😁4
#UBC 🚀

Место 5 🥳
Пайплайн этой модели оптимизирован для быстрой обработки крупных изображений. И совсем без MIL фреймворка. Пайплайн из двух больших кусков:
Глобальная сегментационная модель для предвыбора тайлов в WSI
1. Модель классификации тайлов (только для трейна) 🎨
2. Модель сегментации тайлов (только для трейна) 🖌️
3. Модель сегментации тайлов (для инференса) 🧩

Модель первая - это классификационная модель тайла с глобальным лейблом всей картинки. Основана на ConvNeXt. Обучена на порезанных на кусочки изображениях размером 1536x1536. Претренирована на внешних датасетах с лейблом 'other' для типов рака, которых нет в сореве.

Модель вторая - сегментирует раковые образования по маскам соревнования. Бекбон SEResNeXt и тренируется на данных соревнования.

Модель третья - более сложная. Генерирует лейблы следующим образом:
1. Первой моделью генерируем метки для всего тайла.
2. Прогоняет все изображения через вторую модель, сохраняя сгенерированные маски.
3. Блендит результаты двух моделей попиксельно для каждого тайла попиксельно: 0.5 * model1 + 0.5 * model2. Для классификации используется вероятность, вытянутая обратно в размерность маски для тайла. Пример такой маски на картинке
Для тренировки используется SEResNeXt101, обученный на сегментацию как UNet. Эта модель выбирает тайлы для классификации.

Глобальная классификационная модель для тайлов:
1. Берется случайный кроп 1536x1536.
2. Тренируется модель на глобальном таргете по всей картинке. Используется как базовая модель. Если уверенность ниже 0.3, тайл помечается как 'other', если выше 0.6 - используется предсказанный лейбл.
3. Тренируется модель уже на этих псевдолейблах, используя ConvNext.

Теперь обе глобальные модели используются для инференса:
0. Предсказывается хитмап сегментационной моделью для WSI. Выбираются топ-5 тайлов по уверенности.
1. Предсказываются эти 5 тайлов (или один ресайз TMA картинки) глобальной моделью классификации с TTA с помощью StainNorm для глобальной нормализации.
И вот вы уже на 5 месте! Поздравляем! 🎉

Что можно себе забрать:
1. Используйте StainNorm для работы со снимками с профессионального оборудования
2. Псевдолейблинг как способ сделат дешевый псевдоэттеншн для около-MIL задач.
7👍4