Год начался с успеха:
Нарешали со Стеном @Stan_goes_wild соревнование G2Net Detecting Continuous Gravitational Waves.
Стен большую часть решал сореву вообще с телефона, за что зарабатывает очки респекта.
Соревнование оказалось синтетическим: данные сгенерированы автоматически, а значит скорее всего нужен либо очень особенный ML, либо особо не нужен для того, чтобы получить топовое решения (так и оказалось).
Данные для тренировки было предложено сгенерировать самим, по описанному алгоритму. Гиперпараметры нужно было выбирать уже на усмотрение.
Для начала мы просто решили проникнуться данными и разметили весь тест руками. Заняло все примерно 10 часов на двоих, что вроде бы не слишком много. Это дало нам магическую постобработку, которая давала нам буст против любого публичного решения.
Нарешали со Стеном @Stan_goes_wild соревнование G2Net Detecting Continuous Gravitational Waves.
Стен большую часть решал сореву вообще с телефона, за что зарабатывает очки респекта.
Соревнование оказалось синтетическим: данные сгенерированы автоматически, а значит скорее всего нужен либо очень особенный ML, либо особо не нужен для того, чтобы получить топовое решения (так и оказалось).
Данные для тренировки было предложено сгенерировать самим, по описанному алгоритму. Гиперпараметры нужно было выбирать уже на усмотрение.
Для начала мы просто решили проникнуться данными и разметили весь тест руками. Заняло все примерно 10 часов на двоих, что вроде бы не слишком много. Это дало нам магическую постобработку, которая давала нам буст против любого публичного решения.
👍1🤔1
Через какое-то время вышел сильный паблик кернел, в котором все было сделано норм, прямо как я хотел. Действия были очевидными, просто лень было перебирать параметры и анализировать гистограммы. С ядром можно вот тут ознакомиться:
https://www.kaggle.com/code/vslaykovsky/g2net-pytorch-generated-realistic-noise
Ключевое, что нужно было поменять для получения лучшего скора:
Автор в даталодере в рантайме генерирует примеры, а размер датасета определяется отдельным параметром (по умолчанию равным размеру количества разных сгенерированных автором сигналов). Если просто, то алгоритм такой:
На каждый вызов примера:
1. Выбираем случайный сгенерированный шум
2. Бросаем монетку, если успех- выбираем сгенерированный сигнал и устанавливаем таргет в 1.
3. Складываем сгенерированный шум и сгенерированный сигнал с случайным весом. Сверху любезно добавляем гаусова шума, для вязкости.
Как можно заметить, что шум, что сигнал выбираются с повторениями. Стало быть дешевый способ улучшить качество- просто увеличить размер даталодера и сгенерировать больше вариантов, благо у нас n_signals x n_noises вариантов.
Вторая идея, которая сильно улучшила результаты:
А почему-бы не использовать псевдолейблинг? У нас есть огромный тест (который мы уже руками так-то разметили). На нем предсказаться, и использовать жесткие псевдолейблы для добавления в трейн.
1. Учим обычную модель
2. Предсказываем ей трейн
3. Берем 2.5% ответов, которые ближе к нулю и добавляем их в трейн с меткой 0 в шум.
4. Делаем то же самое с 2.5% самых близких к единице значений с меткой 1 и добавляем их в сигналы.
4. Тренируем на этом наборе еще одну модель и уже ей предсказываем для сабмита.
Такой трюк делать можно несколько раз, по кругу. На практике, несколько раз просто страшно. Есть хорошие шансы оверфитнуться и улететь из лб на прайвете. В итоге сабмит с двумя кругами уверенно попадал в серебро на прайвете (как мы узнали), но на паблике не давал особого прироста, так что я решил перестраховаться и ставить два сабмита: без псевдо и с одним раундом псевдо.
Третий трюк, чтобы дешево улучшить качество- просто считаем больше фолдов OOF предсказаний и радуемся жизни с одной тысячной прироста.
Следующий пост про то, чему научился в сореве и что не взлетело.
https://www.kaggle.com/code/vslaykovsky/g2net-pytorch-generated-realistic-noise
Ключевое, что нужно было поменять для получения лучшего скора:
Автор в даталодере в рантайме генерирует примеры, а размер датасета определяется отдельным параметром (по умолчанию равным размеру количества разных сгенерированных автором сигналов). Если просто, то алгоритм такой:
На каждый вызов примера:
1. Выбираем случайный сгенерированный шум
2. Бросаем монетку, если успех- выбираем сгенерированный сигнал и устанавливаем таргет в 1.
3. Складываем сгенерированный шум и сгенерированный сигнал с случайным весом. Сверху любезно добавляем гаусова шума, для вязкости.
Как можно заметить, что шум, что сигнал выбираются с повторениями. Стало быть дешевый способ улучшить качество- просто увеличить размер даталодера и сгенерировать больше вариантов, благо у нас n_signals x n_noises вариантов.
Вторая идея, которая сильно улучшила результаты:
А почему-бы не использовать псевдолейблинг? У нас есть огромный тест (который мы уже руками так-то разметили). На нем предсказаться, и использовать жесткие псевдолейблы для добавления в трейн.
1. Учим обычную модель
2. Предсказываем ей трейн
3. Берем 2.5% ответов, которые ближе к нулю и добавляем их в трейн с меткой 0 в шум.
4. Делаем то же самое с 2.5% самых близких к единице значений с меткой 1 и добавляем их в сигналы.
4. Тренируем на этом наборе еще одну модель и уже ей предсказываем для сабмита.
Такой трюк делать можно несколько раз, по кругу. На практике, несколько раз просто страшно. Есть хорошие шансы оверфитнуться и улететь из лб на прайвете. В итоге сабмит с двумя кругами уверенно попадал в серебро на прайвете (как мы узнали), но на паблике не давал особого прироста, так что я решил перестраховаться и ставить два сабмита: без псевдо и с одним раундом псевдо.
Третий трюк, чтобы дешево улучшить качество- просто считаем больше фолдов OOF предсказаний и радуемся жизни с одной тысячной прироста.
Следующий пост про то, чему научился в сореве и что не взлетело.
Kaggle
G2NET: Pytorch+Generated Realistic Noise
Explore and run machine learning code with Kaggle Notebooks | Using data from multiple data sources
🔥2
В процессе соервы научился:
1. Оптимизировать даталодеры. Это ускоряет тренировку в нашем случае в 2 раза, а значит экономит квоту кагла.
2. Использовать wandb. Оч удобно, прямо blessing для трекинга публичных экспериментовю. Для работы как-то страшновато использовать, хотя кому нужны мои графики?
3. Немного еще разобрался с Catalyst
Что не взлетело:
1. Пытался научить Byol и уже на нем дообучиться на классификацию. Получалось очень плохо, прям неприлично. В итоге забили
2. Пытались разметить датасет и собрать похожие семплы, а потом их кластерно уже сравнивать. Не взлетело
3. Пытался переписать пайплайн на каталист, сделал 1 в 1, но почему-то скор был хуже. Подозреваю, что что-то не так с lr.scheduller
Следующий пост про топ 3 решения
1. Оптимизировать даталодеры. Это ускоряет тренировку в нашем случае в 2 раза, а значит экономит квоту кагла.
2. Использовать wandb. Оч удобно, прямо blessing для трекинга публичных экспериментовю. Для работы как-то страшновато использовать, хотя кому нужны мои графики?
3. Немного еще разобрался с Catalyst
Что не взлетело:
1. Пытался научить Byol и уже на нем дообучиться на классификацию. Получалось очень плохо, прям неприлично. В итоге забили
2. Пытались разметить датасет и собрать похожие семплы, а потом их кластерно уже сравнивать. Не взлетело
3. Пытался переписать пайплайн на каталист, сделал 1 в 1, но почему-то скор был хуже. Подозреваю, что что-то не так с lr.scheduller
Следующий пост про топ 3 решения
🔥5
Пишу сейчас бойлерплейт для соревы RSNA Screening Mammography Breast Cancer Detection.
Задача: по четырем X-Ray снимкам груди (два для каждой) и метаинформации (табличка) определить, есть ли раковое новообразование.
Из метаинформации доступной во время инференса есть:
ID госпиталя
ID пациента
ID снимка
ID X-ray машины
Признак стороны груди: левая/правая
Возраст
Присутствует/отсутствует имплант
Оценка плотности ткани молочной железы
Кажется, что такую информацию можно использовать (выделенную уж точно). Пока что выглядит так, будто можно использовать для нормализации во время постобработки. Можно еще возраст подавать в метамодель/в голову сетки.
Поделитесь мыслями в комментах, какие бы вы идеи попробовали.
Пост про топ решения случится, он уже в автопаблише висит.
Задача: по четырем X-Ray снимкам груди (два для каждой) и метаинформации (табличка) определить, есть ли раковое новообразование.
Из метаинформации доступной во время инференса есть:
ID госпиталя
ID пациента
ID снимка
ID X-ray машины
Признак стороны груди: левая/правая
Возраст
Присутствует/отсутствует имплант
Оценка плотности ткани молочной железы
Кажется, что такую информацию можно использовать (выделенную уж точно). Пока что выглядит так, будто можно использовать для нормализации во время постобработки. Можно еще возраст подавать в метамодель/в голову сетки.
Поделитесь мыслями в комментах, какие бы вы идеи попробовали.
Пост про топ решения случится, он уже в автопаблише висит.
Первое место с #G2GravitationWaves:
Автор обломал зубы об одномерные сверточные сети (даже не выбил бронзу) и решил, что попробует какой-нибудь подход попроще:
1. Извлечь частоту и мощность из записи
2. Из этих значений вычесть сдвиг Доплера
3. Присвоить каждой записи веса пропорционально абсолютной амплитуде сигнала
4. Просуммировать получившуюся мощность с разными сдвигами и взять максимум такой суммы
Таким образом автор улучшает соотношение Signal/Noise и добивается максимального соответствия по распределению chisq. (мемно, что я пост пишу на лекции про этот метод)
Вообще автор там интересные рассуждения приводит, которые я не до конца понимаю. Приглашаю обсудить в комменты
Второе место:
Все так же, но проще. Авторы уже просто подбирают ближайший чистый сигнал и немного сглаживают смещенные шумы медианным фильтром:
1. Генерим случайный сигнал
2. Проверяем, насколько он хорошо фитится на каждый пример из теста
3. Проверяем, насколько квадрат суммы со сдвигами большой
Таким образом получаем статистику для каждого сигнала и берем от нее максимум. И на всем распределении получившихся максимумов по каждому сигналу уже отсекаем по порогу.
Третье место (наконец-то настоящий DL):
Парни быстро заметили, что шум имеет распределение chisq.
Так же они сгенерили 40к семплов шума + сигналов + гличей для трейна и валидации. (Для сравнения мы со @stan_goes_wild тренировались на 1к + 1к и не использовали гличи совсем)
Алгоритм генерации был такой:
1. Берем решение из теста
2. На основе его шума генериуем свой шум
3. Добавляем в этот шум сигнал
Еще они использовали забавные штуки с нормализацией:
Т.к. шум у нас chisq, то надо поклоночно сигнал возвести в квадрат, и тогда шум станет уже нормально распредленным. Осталось вычесть среднее и поделить на std.
Так же они использовали кастомную сетку:
1. В начале хорошо зашли денойзинг слои с большой шириной (3x31, 5x15, 5x31, 7x65)
2. Претрейнили энкодер в AE манере c dice loss
Одиночные модели давали примерно 0.78
Далее шел иерархический стекинг следующей конструкции:
Считаем статистику и определяем, является ли пример реальным или синтетическим -> Зоопарк моделей для синтетики (2)
.|
V
Зоопарк моделей для реальных данных (3)
(2)(3) -> Серию линейных моделей на подвыборках (4)
По серии линейных моделей берем среднее весов и уже такой штукой предсказываем финальный ответ. Такой стак давал 0.784 -> 0.801 против простого усреднения.
Под конец соревы ребята нашли лик:
Реальная часть датасета была сгенерирована случайной нарезкой одного длинного шума с детектора, к которому был добавлен белый шум и затем синтетический сигнал. Значит можно такой смещенный шум склеить назад. А так как у нас есть шум- то и сигнал можно выделить. Это дало прирост 0.801 -> 0.826 на прайвете.
Автор обломал зубы об одномерные сверточные сети (даже не выбил бронзу) и решил, что попробует какой-нибудь подход попроще:
1. Извлечь частоту и мощность из записи
2. Из этих значений вычесть сдвиг Доплера
3. Присвоить каждой записи веса пропорционально абсолютной амплитуде сигнала
4. Просуммировать получившуюся мощность с разными сдвигами и взять максимум такой суммы
Таким образом автор улучшает соотношение Signal/Noise и добивается максимального соответствия по распределению chisq. (мемно, что я пост пишу на лекции про этот метод)
Вообще автор там интересные рассуждения приводит, которые я не до конца понимаю. Приглашаю обсудить в комменты
Второе место:
Все так же, но проще. Авторы уже просто подбирают ближайший чистый сигнал и немного сглаживают смещенные шумы медианным фильтром:
1. Генерим случайный сигнал
2. Проверяем, насколько он хорошо фитится на каждый пример из теста
3. Проверяем, насколько квадрат суммы со сдвигами большой
Таким образом получаем статистику для каждого сигнала и берем от нее максимум. И на всем распределении получившихся максимумов по каждому сигналу уже отсекаем по порогу.
Третье место (наконец-то настоящий DL):
Парни быстро заметили, что шум имеет распределение chisq.
Так же они сгенерили 40к семплов шума + сигналов + гличей для трейна и валидации. (Для сравнения мы со @stan_goes_wild тренировались на 1к + 1к и не использовали гличи совсем)
Алгоритм генерации был такой:
1. Берем решение из теста
2. На основе его шума генериуем свой шум
3. Добавляем в этот шум сигнал
Еще они использовали забавные штуки с нормализацией:
Т.к. шум у нас chisq, то надо поклоночно сигнал возвести в квадрат, и тогда шум станет уже нормально распредленным. Осталось вычесть среднее и поделить на std.
Так же они использовали кастомную сетку:
1. В начале хорошо зашли денойзинг слои с большой шириной (3x31, 5x15, 5x31, 7x65)
2. Претрейнили энкодер в AE манере c dice loss
Одиночные модели давали примерно 0.78
Далее шел иерархический стекинг следующей конструкции:
Считаем статистику и определяем, является ли пример реальным или синтетическим -> Зоопарк моделей для синтетики (2)
.|
V
Зоопарк моделей для реальных данных (3)
(2)(3) -> Серию линейных моделей на подвыборках (4)
По серии линейных моделей берем среднее весов и уже такой штукой предсказываем финальный ответ. Такой стак давал 0.784 -> 0.801 против простого усреднения.
Под конец соревы ребята нашли лик:
Реальная часть датасета была сгенерирована случайной нарезкой одного длинного шума с детектора, к которому был добавлен белый шум и затем синтетический сигнал. Значит можно такой смещенный шум склеить назад. А так как у нас есть шум- то и сигнал можно выделить. Это дало прирост 0.801 -> 0.826 на прайвете.
Kaggle
G2Net Detecting Continuous Gravitational Waves
Help us detect long-lasting gravitational-wave signals!
🔥3🤯2
Forwarded from (sci)Berloga Всех Наук и Технологий
🚀 @SBERLOGACOMPETE webinar on data science:
👨🔬 Dmitrii Rudenko "G2 Gravitational waves Kaggle competition debrief"
⌚️ 20 January, Friday, 19.00 (Moscow Time)
Add to Google Calendar
Welcome to the G2 Kaggle competition debrief on Detecting Gravitational Waves! My name is Dmitrii Rudenko and I am excited to share with you the top solutions from this competition, as well as my own bronze medal-winning solution. As many of you may know, the task in this competition was to use computer vision techniques to detect gravitational waves in images. These waves are extremely faint and difficult to detect, making this a challenging problem for machine learning algorithms. However, through the use of innovative techniques and careful tuning of models, we were able to achieve impressive results. I look forward to discussing the details of these solutions with you and hearing your thoughts and insights on the topic. Let's get started!
Link to the competition: https://www.kaggle.com/competitions/g2net-detecting-continuous-gravitational-waves/overview
Zoom link will be available at
https://news.1rj.ru/str/sberlogabig shortly before the start.
Video records of the talks: https://www.youtube.com/c/SciBerloga - subscribe our channel !
👨🔬 Dmitrii Rudenko "G2 Gravitational waves Kaggle competition debrief"
⌚️ 20 January, Friday, 19.00 (Moscow Time)
Add to Google Calendar
Welcome to the G2 Kaggle competition debrief on Detecting Gravitational Waves! My name is Dmitrii Rudenko and I am excited to share with you the top solutions from this competition, as well as my own bronze medal-winning solution. As many of you may know, the task in this competition was to use computer vision techniques to detect gravitational waves in images. These waves are extremely faint and difficult to detect, making this a challenging problem for machine learning algorithms. However, through the use of innovative techniques and careful tuning of models, we were able to achieve impressive results. I look forward to discussing the details of these solutions with you and hearing your thoughts and insights on the topic. Let's get started!
Link to the competition: https://www.kaggle.com/competitions/g2net-detecting-continuous-gravitational-waves/overview
Zoom link will be available at
https://news.1rj.ru/str/sberlogabig shortly before the start.
Video records of the talks: https://www.youtube.com/c/SciBerloga - subscribe our channel !
Запись рассказа:
https://lcc.click/4yXDGd9
И слайды выступления, по которым можно потыкать и посмотреть описания топовых решений от самих победителей:
https://url-x.it/bcPR4gD
https://lcc.click/4yXDGd9
И слайды выступления, по которым можно потыкать и посмотреть описания топовых решений от самих победителей:
https://url-x.it/bcPR4gD
