#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 место смело ворвались в топ и всех порвали.
Давайте немного разбираться с Open Problems, где не удалось взять золото, но все равно все очень довольны.
Начнем с краткого описания соревы:
Компания-организатор занимается тем, что пытается оптимизировать проведение дорогостоящих экспериментов с препаратами на живых, но отделенных от самих созданий клетках
И того на вход у нас есть:
1. Химическая формула препарата (строка в формате SMILES)
Сейчас пойду завтракать и его есть
2. Тип клетки, которая будет воздействовать на препарат (просто название-категориалка)
Все, больше ничего нет. Есть только таргеты. Таргеты забавные:
Для каждого эксперимента замеряли экспрессию генов и прогнали ее через эконометрически-биоинформатическую модель-пакет из 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к неинтерпретируемых моделей (как мы)
Мужчина с седьмого места был прямолинеен и верил в лучшее:
Он взял статью о том, как учить эмбединги для препаратов и... выучил их.
Для трехмерной матрицы (экспрессия гена, позиция в клетке, тип клетки) градиентным спуском учится факторизация, а затем поверх этих эмедов уже учится взаимодействие гена в клетке с препаратом уже другой сетью.
Прием можно представить как нормализацию для каждого триплета взаимодействий, а затем доучивание того, как всю эту великолепную микровселенную меняет препарат.
Пошлем kudos человеку, который не стакал 10к неинтерпретируемых моделей (как мы)
👍22 3😍2🔥1👏1😁1🥴1
#openproblems
Муж с 6 места, наоборот, поступил в лучших традициях Александра Геннадьевича:
Разобрался с пакетом Limma на R:
1. Обучил Limma на трейне
2. Предсказал тест
3. Понял, что цифры на трейне не совсем сходятся
Понял, что Limma была обучена на трейне и тесте одновременно (так правильно, это же эконометрическая модель!), а он учился только на трейне.
4. Вспомнил два ключевых слова и одно секретное(среднее, дисперсия и таргет-лик) и домножил на коэффициенты параметры линейной модели, чтобы цифры сходились.
5. Посчитал обратное преобразование из получившейся модели
Таким образом он получил пайплайн восстановления оригинальных экспрессий генов и получил великолепное свойство для таргетов:
Теперь таргеты были не из островершинного распределния(что бы не говорили, бог хранит гдр-война Королева за то, что заставил меня помнить все каноничные названия на русском языке для этих штук) , а из вполне себе нормального. Но эта моделька хорошо перформила на private test, на лб она работала средне. Тем ценнее вера в себя и в свою схему валидации!
Поэтому на всякий противопожарный случай, автор сблендил решения еще и с моделью, учащейся на обычные таргеты.
Из интересных штук, которые можно себе унести в любые соревнования/продакшны: учился в обеих моделях на Smooth L1 loss и клянется, что это сильно помогло на лб и валидации, еще и стабильности добавило.
Муж с 6 места, наоборот, поступил в лучших традициях Александра Геннадьевича:
Разобрался с пакетом Limma на R:
1. Обучил Limma на трейне
2. Предсказал тест
3. Понял, что цифры на трейне не совсем сходятся
Понял, что Limma была обучена на трейне и тесте одновременно (так правильно, это же эконометрическая модель!), а он учился только на трейне.
4. Вспомнил два ключевых слова и одно секретное
5. Посчитал обратное преобразование из получившейся модели
Таким образом он получил пайплайн восстановления оригинальных экспрессий генов и получил великолепное свойство для таргетов:
Теперь таргеты были не из островершинного распределния
Поэтому на всякий противопожарный случай, автор сблендил решения еще и с моделью, учащейся на обычные таргеты.
Из интересных штук, которые можно себе унести в любые соревнования/продакшны: учился в обеих моделях на Smooth L1 loss и клянется, что это сильно помогло на лб и валидации, еще и стабильности добавило.
👍10❤8🔥3 2
#openproblems
Третье место (да, в местах 4-5 нет классных приколов, о которых хотелось бы рассказать):
Все пошло уже мощным и грамотным заливанием ресурсов:
1. Человек взял маленькую нейростеку и оптимизировал ее ширину/длину/место для батчнормов/место для дропаутов/место для леернормов c помощью оптуны
2. Из получившихся хороших сеток собрал ансамбль, для которого веса тоже оптимизровал оптуной.
3. Для этого ансамбля предсказал тест и взял результат как псевдолейблы🤍️ , для которых веса при обучении тоже оптимизировал (конечно оптуной).
Тут интересно: вес для всех псевдолейблов был глобальный, т.е. в обучение добавлялись вообще все предикты теста, но с одинаковым весом и никак не оценивалась 'уверенность' в предикте.
4. Затем собрал ансамбль назад и обучил его 20 раз, после чего взял медиану аутпута по каждому гену
Ставки на то, сколько терафлопс-часов потратил гений оптимизации- пишите в комменты
Третье место (да, в местах 4-5 нет классных приколов, о которых хотелось бы рассказать):
Все пошло уже мощным и грамотным заливанием ресурсов:
1. Человек взял маленькую нейростеку и оптимизировал ее ширину/длину/место для батчнормов/место для дропаутов/место для леернормов c помощью оптуны
2. Из получившихся хороших сеток собрал ансамбль, для которого веса тоже оптимизровал оптуной.
3. Для этого ансамбля предсказал тест и взял результат как псевдолейблы
Ставки на то, сколько терафлопс-часов потратил гений оптимизации- пишите в комменты
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21👍3 2🥰1
Хочу немного похвалить команду катбуста:
1. Чтобы завести multi-gpu тренировку, достаточно добавить две строчки в параметы модели
{...
"task_type": "GPU",
"devices":'0:1',
...}
2. Чтобы вы не улетали по лимиту памяти, катбуст сам определяет размер памяти каждой гпу и позволяет контролировать загрузку их памяти в процентах
Пост написан после 8 часов попыток правильно скомпиллить любимый LGBM для GPU в энвайроменте каггла
Вообще ребята сделали огромный прогресс с тех пор, как я устанавливал пакет под python3.6, запускал их примеры и получал ошибки исполнения в строках стиля
Хотя вся остальная часть пакета даже выглядела как третий пайтон. Приходилось лезть в сорсы обертки и уже ее фиксить.
1. Чтобы завести multi-gpu тренировку, достаточно добавить две строчки в параметы модели
"task_type": "GPU",
"devices":'0:1',
...}
2. Чтобы вы не улетали по лимиту памяти, катбуст сам определяет размер памяти каждой гпу и позволяет контролировать загрузку их памяти в процентах
Вообще ребята сделали огромный прогресс с тех пор, как я устанавливал пакет под python3.6, запускал их примеры и получал ошибки исполнения в строках стиля
print learning_rate
Хотя вся остальная часть пакета даже выглядела как третий пайтон. Приходилось лезть в сорсы обертки и уже ее фиксить.
catboost.ai
Performance settings |
thread_count. Command-line: -T, --thread-count. Denoscription. The number of threads to use during the training. Python package, Command-line. For CPU.
🔥18 3😁2❤1👍1
#openproblems
На втором месте у нас несколько удачных находок:
Оригинальная стратегия валидации:
Автор применил подход к валидации, где кластеризовал многомерные таргеты с использованием K-means. Для кросс-валидации он затем равномерно семплировал данные из получившихся кластеров. Таким образом, в каждом фолде кросс-валидации получались похожие глобальные, но различные локальные распределения таргетов.Мы также попытались использовать схожий метод, семплируя по типам клеток, что также добавило стабильности валидации. Размер валидационных фолдов был подобран вручную в пределах 10% - 20%, лучшим был размер 10%, что докидывало немного скора
Фичегенерация:
1. Добавлен mean-target-encoding для типов клеток и драгов, что заметно улучшило производительность моделей.
2. Применен TruncSVD для преобразования таргетов, и обнаружено, что некоторые семплы имеют значительную дисперсию для TruncSVD, что было использовано как отдельная фича.Подобный прием с включением Var таргетов в фичи я уже пар раз видел в топовых решениях, хотя определение правила для применения трюка остается открытым вопросом.
Модель:
Обучал собственный трансформер. Архитектура была относительно простой, включая два эмбединга для континуальных и категориальных признаков, два линейных слоя для них, LayerNorm, линейный слой на конкатенации и трансформерный энкодер с GELU, завершенный линейным слоем для вывода.Мы пробовали похожие архитектуры, но без энкодера от трансформера. Кстати другие места тоже говорили о том, что пробовали трансформеры и у них не завелось.
Для оптимизации использовался Lion. Он прям хорошо работает для трансформеров. Ну и Huber Loss для применял для смягчения воздействия выбросов и улучшения общего качества.
Из того, что можно утащить себе:
• Huber Loss
• Lion
• Попробуйте включить трансформерный энкодер в сеть
• Очень важно правильно подбирать размер валидации
На втором месте у нас несколько удачных находок:
Оригинальная стратегия валидации:
Автор применил подход к валидации, где кластеризовал многомерные таргеты с использованием K-means. Для кросс-валидации он затем равномерно семплировал данные из получившихся кластеров. Таким образом, в каждом фолде кросс-валидации получались похожие глобальные, но различные локальные распределения таргетов.
Фичегенерация:
1. Добавлен mean-target-encoding для типов клеток и драгов, что заметно улучшило производительность моделей.
2. Применен TruncSVD для преобразования таргетов, и обнаружено, что некоторые семплы имеют значительную дисперсию для TruncSVD, что было использовано как отдельная фича.
Модель:
Обучал собственный трансформер. Архитектура была относительно простой, включая два эмбединга для континуальных и категориальных признаков, два линейных слоя для них, LayerNorm, линейный слой на конкатенации и трансформерный энкодер с GELU, завершенный линейным слоем для вывода.
Для оптимизации использовался Lion. Он прям хорошо работает для трансформеров. Ну и Huber Loss для применял для смягчения воздействия выбросов и улучшения общего качества.
Из того, что можно утащить себе:
• Huber Loss
• Lion
• Попробуйте включить трансформерный энкодер в сеть
• Очень важно правильно подбирать размер валидации
❤10👍3🔥3 1
Какие из доступных на 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
В принципе есть две опции: 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%
3. Для работы в FP32 у P100 заявлены 9 tFLOPS производительности, в то время как у T4 8 tFLOPS. Помним, их две.
Для смешаной точности (для тренировки и для предикта) у P100 заявлены скромные 19 tFLOPS, в то время как у T4 совершенно безумные 65 tFLOPS. Разницу дают тензорные ядра, которых в более старой P100 нет.
В общем логика принятия решений для DL на каггле такая:
Ваша задача хорошо параллелится и фреймворк поддерживает мультидевайс тренировку- однозначно T4.
Используете что-нибудь экзотичное и не так хорошо параллелящееся
Насчет GPU-бустингов можно побенчмаркать, там сильно все зависит от реализации. Например LGBM под CUDA или хотя бы несколько гпу я в окружении Kaggle не справился скомпилировать (да, надо из сорсов) и единственный путь- гонять его на P100. А вот катбуст завелся с полпинка и очень шустро у удобно утилизрует две T4
🔥15🥰7 3❤1
#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 сореве.
Фичи:
В первую очередь он вспомнил о статье из Nature: BioWordVec, improving biomedical word embeddings with subword information and MeSH
Идея статьи: обучим на заголовках статей/терминов word2vec и в нем будет крыться некоторая близость терминов.
Помните, что как входные данные были доступны только название лекарств, их формулы и типы клеток? Победитель пошел на вики и спарсил для каждого препарата и каждого типа клеток их короткое описание. Там, где описания не находились по обычному названию- он шел и руками находил релевантные или сам дописывал тексты. А вот уже эти описания он прогнал через BioWordVec.
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
Nature
BioWordVec, improving biomedical word embeddings with subword information and MeSH
Scientific Data - BioWordVec, improving biomedical word embeddings with subword information and MeSH
🔥14👍5🏆4 1
Канал растет, рынок тает и в лс приходят люди с вопросами о том, как искать работу.
А я особо и не знаю, она или находит меня сама, или я обращаюсь к своим друзьям, которые знают о моих интересах и опыте и сами меня куда-то запихивают. Я делаю точно так же, но если знаю, что есть запрос на конкретные скиллы и я сразу вспоминаю о каком-то подходящем человеке.
Но вот для 95% остальных случаев работу надо искать самостоятельно и Борис тут написал неплохую методичку:
Методичка: Поиск Работы в ML/DS
Дает чуть более глубокое понимание механик, чем мои предложения затехать резюме и выкинуть неизмеримые достижения :0
А я особо и не знаю, она или находит меня сама, или я обращаюсь к своим друзьям, которые знают о моих интересах и опыте и сами меня куда-то запихивают. Я делаю точно так же, но если знаю, что есть запрос на конкретные скиллы и я сразу вспоминаю о каком-то подходящем человеке.
Но вот для 95% остальных случаев работу надо искать самостоятельно и Борис тут написал неплохую методичку:
Методичка: Поиск Работы в ML/DS
Дает чуть более глубокое понимание механик, чем мои предложения затехать резюме и выкинуть неизмеримые достижения :0
Telegram
Борис опять
life = curiosity + irreducible noise
Whois: https://news.1rj.ru/str/boris_again/3400
Лс: @btseytlin
Whois: https://news.1rj.ru/str/boris_again/3400
Лс: @btseytlin
🔥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 лежал в ревью больше года.
В прошлый раз я добавил зависимости для torchscale, всего одну строчку и тем самым сделал мир немного лучше. В этот раз я решил пойти дальше и внес изменение всего в одном символе.
Вот вам микроистория: Я экспериментировал с CatBoost, пытаясь запустить его на GPU, и обнаружил, что в списке доступных лоссов для GPU отсутствует MAE, хотя есть Huber. Это показалось мне странным, ведь Huber фактически является IF между MAE и MSE. Такого быть не может, что Huber написали, а вот в MAE какая-то серьезная проблема. После теста на Kaggle оказалось, что все работает, даже на MultGPU сетапе. Значит, ошибка была в документации.
Исправил документацию, согласился на бесплатную работу на Яндексе
Думаю изменение чуть важнее, чем кажется на первый взгляд. MAE - один из самых популярных лоссов, и CatBoost действительно оптимизирован для GPU, что делает его более удобным и быстрым в обучении. Он просто работает из коробки. Я столкнулся с этой странной проблемой с недоступностью MAE для GPU несколько раз в прошлом, просто не проверяя ее. Заходил, видел что недоступно и шел дальше, ковырять любимый LGBM.
Вообще у CatBoost много документации, но она не всегда точная, несмотря на мои дифирамбы этой библиотеке. Так что, если вдруг вы хотите внести свой вклад в историю (даже на 356 месте
Маленькие контрибьюшны делают библиотеку на 0.1% лучше, но уже сейчас. А вот MR моего бывшего коллеги с FocalLoss лежал в ревью больше года.
👍21❤2 2🔥1
#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.
Медицинская сорева, а вы думали будет просто?
Разбираем на этой неделе Ovarian Cancer Subtype Classification and Outlier Detection
Даны 700 гб png-картинок медицинских изображений. Конкретно- срезы тканей человеческиэ яичников. Картинки двух типов: большие и очень большие.
Большие картинки- это 3kX3k, очень большие- от 20kX2k до 32kX32k.
Задача- мультиклассификация на 6 типов рака. Все картинки- это какой-то рак, но нужно понять, какой конкретно.
Картинки имеют некоторые особенности- например один и тот же образец тканей может быть нарезана на несколько слайсов и нам все их покажут.
Так же картинки двух типов:
WSI и TMA.
WSI- это очень большие на черном фоне и именно на них может быть несколько срезов
TMA- это просто большие и они обычно на белом фоне.
Еще одна особенность: в тесте ~40% TMA и ~60%, а вот в трейне это ~5% к ~95%.
Как метрика качества- balanced accuracy.
👍9❤3 2🔥1
Я безумно люблю самообразовываться по разным темам, это один из моих способов расширять кругозор. К тому же, у меня канал про модели.
Однажды подруга мне сказала, что ей не нравятся фотографии, которые ей снимают окружающие. Я подумал, что это вообще распостраненная проблема и наверное скилл снимать лучше среднего может мне пригодиться. Я пошел и прочитал книжку, которую до сих пор всем советую: Модель. Проблемы позирования. Надо бы кстати перечитать.
После прочтения перестаешь сомневаться, что с твоими фотками что-то не так и учишься делать неплохие снимки, а потом еще и отделять неприятие человеком своей внешности от качества съемки. Книга- фундаментальная база всех лайфхаков съемки от инстаграм-блогерш.
В рамках того же паттерна еще с 2020 года я был подписан на Start Career in DS, как хороший источник материалов вокруг дс и базы, которую могут спросить на собеседованиях/можно посоветовать чуть менее опытным коллегам или студентам. Канал- это скорее источник постоянного планомерного прикладного образования нарезанного мелкими кусочками. Как раз то, что нужно на старте. Качаться сюда -> Start Career in DS
Однажды подруга мне сказала, что ей не нравятся фотографии, которые ей снимают окружающие. Я подумал, что это вообще распостраненная проблема и наверное скилл снимать лучше среднего может мне пригодиться. Я пошел и прочитал книжку, которую до сих пор всем советую: Модель. Проблемы позирования. Надо бы кстати перечитать.
После прочтения перестаешь сомневаться, что с твоими фотками что-то не так и учишься делать неплохие снимки, а потом еще и отделять неприятие человеком своей внешности от качества съемки. Книга- фундаментальная база всех лайфхаков съемки от инстаграм-блогерш.
В рамках того же паттерна еще с 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.
10 место:
Пример хорошего не кагглерского решения. Примерно так же задачка бы и решалась в продакшне.
Подтянули 5 внешних датасетов + тесовый сет, которому просто выдали самый частотный класс как таргеты. Самое забавное, что для двух из внешних датасетов авторы просто нащелкали скриншотов привьюшек с сайта.
Предобработка тоже довольно стандартная:
Для того, чтобы увеличить схожесть WSI и TMA у последних белый фон заменили на черный.
Маски для WSI-трейна порезали на тайлы и подогнали к размерам thumbnails. Потом отсротировали тайлы по заполненности масок и взяли топ 16 для обучения.
Для TMA, которые в дефиците сделали чуть иначе: Resize -> случайный даунскейлинг и возвращение к изначальному размеру -> flip/rotation -> Channel shuffle/Gaussian Blur/Imagenet Normalization
Валидация:
Обычный StratKFold с 5 фолдами. Стратифицировали по TMA/WSI и целевому классу.
Модель:
Обучили MaxViT Tiny FPN
На бекбоне EfficientNetV2 конечно же.
Как оптимизатор AdamW, CosineScheduler и AMP
Постобработка:
Для тест тайма использовали 3xTTA (Test time augmentation. Учим модель на аугментациях, а потом в тестайме одну картинку несколько раз прогоняем через модель с разными аугами и усредняем результаты).
И того 10 место и решение на 10% хуже по BalancedAccuracy, чем у top1.
🔥14❤5👍5 3
#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.
Про отпимизатор не пишут
В комменты призываются все эксперты в современном компьютерном зрении, которые смогу объяснить, насколько распостранены такие нелобовые методы тренировки
9 место
Тут авторы совем не использовали внешних данных, но использовали интересную схема тренировки.
Препроцессинг:
Для начала, решили сделать отдельный if для определния wsi/tma в рантайме и не сильно полагаться на авторскую разметку. Просто они не знали, что для ускорения можно использовать простой советский
Если классифицированнваякартинка WSI- уменьшаем ее в 3 раза. Нарезаем на тайлы.
Во время тренировки фильтруем тайлы:
Используем все тайлы, если отношение фона/изображения больше 0.5
Если 0.65, то первые 50 тайлов.
Если 0.75, то первые 20 тайлов
Тренировка:
Далее идут три этапа тренировки:
Этап 1: Обычная тренировка, учим классы из трейна через BCE, верим в лучшее.
Этап 2: С помощью модельки с первого этапа генерируем что?
Этап 3: Берем веса с этапа 2 и используем
Для меня выглядит как костыльный вариант LabelSmoothing/OnlineLabelSmoothing, но ведь работает же.
Модель: Работали с бекбонами efficientnetb4 и efficientnet_v2s для maxvit_tiny.
В комменты призываются все эксперты в современном компьютерном зрении, которые смогу объяснить, насколько распостранены такие нелобовые методы тренировки
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7❤3 3👍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 головой
Про оптимизатор/валидацию новоиспеченный грандмастер не пишет, потому что с получения статуса такие вещи становятся очевидны.
Восьмое место: История как мощный китайский почти мастер нафармил последнюю медальку на грандмастера
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🔥3❤2
Автор прошлого решения, Forcewithme уже попадал пару раз в мои разборы, но тут он добрался до грандмастера. У него довольно личная история:
Он три года подряд плотно решал каггл и мечтал о заветной золотой плашке. Шутка ли: 5 золотых, 13 серебряных и 4 бронзы. И вот остался его последни семестр, работа уже найдена, есть куча медалей, но сологолда нет. Уже пора семью заводить, работать работу и ездить на Volkswagen Golf, время прошло и он не успел. Но попытка за попыткой соло взять золото не удавалось:
Соло бронза в GoDaddy
Соло бронза в знаменитом по одному киприоту PetFinder
Соло серебро в ImageMatching с шейкдауном на 46 место с 20
Соло серебро Google Contrails
И вот наконец это соло золото!
Он три года подряд плотно решал каггл и мечтал о заветной золотой плашке. Шутка ли: 5 золотых, 13 серебряных и 4 бронзы. И вот остался его последни семестр, работа уже найдена, есть куча медалей, но сологолда нет. Уже пора семью заводить, работать работу и ездить на Volkswagen Golf, время прошло и он не успел. Но попытка за попыткой соло взять золото не удавалось:
Соло бронза в GoDaddy
Соло бронза в знаменитом по одному киприоту PetFinder
Соло серебро в ImageMatching с шейкдауном на 46 место с 20
Соло серебро Google Contrails
И вот наконец это соло золото!
Kaggle
ForcewithMe
Goal of ~~life~~ student year: **Kaggle Grandmaster**
Achieved GrandMaster on 2024.01.05.
In the following life: **Family**, **Career**, **Competition**.
-----------------------
Goal of competitions in 2024:
1. prize for any competition 🏆✔
2. a gold in…
Achieved GrandMaster on 2024.01.05.
In the following life: **Family**, **Career**, **Competition**.
-----------------------
Goal of competitions in 2024:
1. prize for any competition 🏆✔
2. a gold in…
🏆20👍11
Что вообще за MIL?
Это такой сетап задачи, когда у вас объект такой большой, что с ним неудобно работать. Можно конечно зарескейлить, но раки они бывают такие маленькие, что без лупы не разглядишь. Поэтому WSI картинки такие огромные. Мы ее режем на патчи и может так оказаться, что только на одном патче у нас рак, а все остальные здоровые. А лейбл у нас выдан конечно на всю картинку.
Для таких штук обычно извлекают сначала признаки каким-то одним экстрактором, а потом уже для этих фичей применяют аггрегацию.
Например можно просто взять MaxPooling и результат пихать в МЛП-классификатор. А можно пойти хитрее и применять attantion например. Вот в DFTD-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' и кекнул с результата
Шестое место: мы просто победили
Сначала не хотел брать этих ребят в разбор, но потом подумал, что стоит показывать не только Wunderwaffe.
Парни вспомнили хорошую статью по классификации снимков. Парни ее применили. Парни получили 3 место на паблике и 6 на прайвете.
1. Нарезаем картинки на патчи. Берем из них 1000 патчей. Если патчей не хватает- дублируем случайные до тех пор, пока не наберется тысяча.
2. Используем веса модели из статьи в разрешении 1000x768
3. Для MIL используем модельку из другой статьи. Запомните этот Chowder, мы о нем еще вспомним в грядущем посте. Если посмотреть картинки в статье, там даже на наши данные все похоже!
4. Ансамблим 7 разных обобщающих моделей из прошлого этапа и детектируем 'other' по средней энтропии (-sum(p*log(p))
5. Подбираем для other порог отсечения
Что могло бы улучшить, но как-то было лень заводить:
Можно было патчи выбирать не случайно, а с помощью небольшого (всего 5 млн параметров) трансформера
👍11😁4