uk
Feedback
Запрети мне псевдолейблить

Запрети мне псевдолейблить

Відкрити в Telegram

Канал о пути к Kaggle competitions (теперь уже) GrandMaster и поте, которым обливаешься в процессе Последний авторский канал про мл, претендующий на искренность и позволяющий ставить клоунов Для контакта пишите в сообщения канала, они бесплатные

Показати більше
3 572
Підписники
+224 години
+477 днів
+18330 день
Архів дописів
3 место в #BirdClef2025 Данные: 1. Выкорчевали человеческий голос с помощью паблик кернела с каггла. 2. Взяли весь датасет 2025 года и к нему доложили 80% датасета 2023 года, добавив 112 новы классов. Оставшиеся 20% данных 2023 использовали для валидации. Локальная валидация не билась с ЛБ, но такая схема давала лучшую оценку сходимости модели. 3. Дополнительно вытянули еще данных из обоих открытых источнико, Xeno-Canto и INaturalist. 4. Запсевдолейбили всю неразмеченную часть, чтобы еще немного улучшить итоговые модели Модели: Обучили зоопарк моделей на двух видах спектрограмм. Вообще почти всегда есть смысл покрутить параметы построения спектрограмм для того, чтобы увеличить разнообразие и не потерять в качестве. Главное одну модель не учить на двух видах. Список моделей tf_efficientnet_b0_ns tf_efficientnetv2_b3 tf_efficientnetv2_s.in21k_ft_in1k mnasnet_100 spnasnet_100 Интересные приемы для обучения: 1. Семплировали случайные отрезки, а не честную нарезку по 5 сек. Говорят, так лучше училось 2. Добавляли человеческий голос для аугментации. На мой взгляд не сильно вяжется с удалением голоса из изначального датасета, но видимо использовали этот прием чтобы голос 'равномерно' размазать по всему датасету 3. Учились на FocalLoss 4. Использовали Model Soup. Это способ 'ужать' в одну модель несколько чекпоинтов. Усредняем веса например 20 resnet c одинаковой архитектурой и обученных на одних данных. Получаем почти ту же стабильность, что и усреднение 20 отдельных предикшнов этих моделей, но со скоростью инференса и весом одного resnet. Кстати, тут можно обычно докрутить и делать только GreedySoup: пробовать в ансамбль добавлять только те модели, которые делают предикты лучше. Но опять же, тут надо верить в свой CV, а в этом соревновании наверно никто не верил в свой CV. Для сабмита использовали Post-processing with power adjustment. Берем предикты, из них выбираем n самых 'уверенных' и усиливаем их, занижая скоры для прочих классов.

У вас каждый день дейли не потому, что дейли эффективны. У вас дейли потому, что в книжке »Scrum. Революционный метод управления проектами. Джефф Сазерленд« написано, что их можно делать. Скелетрон вернется с умными мыслями завтра

#соревнование Обзор международных соревнований в DS за прошлый год: на каких платформах, что используют победители, какие кон
#соревнование Обзор международных соревнований в DS за прошлый год: на каких платформах, что используют победители, какие конкурсы проходят и т.п. Такие отчёты каждый год выходят (но тут ни разу ссылок на них не давал). https://mlcontests.com/state-of-machine-learning-competitions-2024/

4 место в #BirdClef2025 Коротко, но ценно: иногда простота выигрывает. Поскольку на BirdCLEF нас оценивают именно по AUC, логично оптимизировать его напрямую. AUC-лосс устойчив к переобучению, но не поддерживает soft labels, как, например, кросс-энтропия.

class SoftAUCLoss(nn.Module):
    def __init__(self, margin=1.0, pos_weight=1.0, neg_weight=1.0):
        super().__init__()
        self.margin = margin
        self.pos_weight = pos_weight
        self.neg_weight = neg_weight

    def forward(self, preds, labels, sample_weights=None):
        # Разделяем положительные и отрицательные предсказания
        pos_mask = labels > 0.5
        neg_mask = labels < 0.5
        pos_preds, pos_labels = preds[pos_mask], labels[pos_mask]
        neg_preds, neg_labels = preds[neg_mask], labels[neg_mask]

        if pos_preds.numel() == 0 or neg_preds.numel() == 0:
            return torch.tensor(0., device=preds.device)

        # Веса отражают уверенность soft-label
        pos_w = self.pos_weight * (pos_labels - 0.5)
        neg_w = self.neg_weight * (0.5 - neg_labels)
        if sample_weights is not None:
            sw = sample_weights.unsqueeze(1).expand_as(labels)
            pos_w *= sw[pos_mask]
            neg_w *= sw[neg_mask]

        # Считаем pairwise-разности и лог-лосс
        diff = pos_preds.unsqueeze(1) - neg_preds.unsqueeze(0)
        loss_matrix = torch.log1p(torch.exp(-self.margin * diff))

        # Усредняем по всем парам с учётом весов
        return (loss_matrix * pos_w.unsqueeze(1) * neg_w.unsqueeze(0)).mean()
Что еще работало и не работало: Semi-supervised learning на неразмеченном датасете: Сначала обучил 10 моделей EfficientNet на размеченной части. Сгенерировал «псевдо-лейблы» для неразмеченных данных. Обучил следующий раунд моделей уже на объединённом наборе. Отказался от самодистилляции и сложных схем — не заводилось. Лотерея или мастерство? Автор поднялся с 11 места на 4-е на прайвете! Возможно, дело не только в удаче.

Пятое место #Birdclef2025 Мануальная обработка данных Это вообще та самая 'секретная техника', которую все ленятся делать. Да
Пятое место #Birdclef2025 Мануальная обработка данных Это вообще та самая 'секретная техника', которую все ленятся делать. Данные полезно ковырять/слушать смотреть руками Использовали Silero для того, чтобы найти записи с человеческим голосом, затем слушали их уже своими ушами и вырезали все фрагменты, где слышен человек. Вообще у Silero есть бот, так что я им пожалуй и озвучу этот раздел поста. Для классов с низкой частотностью (меньше 30 семплов в трейне) дополнительно послушали все записи и из каждой вычистили участки, где птиц не слышно. Для трейна брали только первые 30 сек записи, а для низкочастотных 60 сек. Там, где семплов было меньше 20 для класса- апсемплили, чтобы 'разудть' трейн. Модели Стакали кучу эффишентнетов. Благо они с легкостью влезали в ограничения по CPU • 4x tf_efficientnetv2_s • 3x tf_efficientnetv2_b3 • 4x tf_efficient_b3_ns • 2x tf_efficient_b0_ns Но важно что тренировали в три стейджа. В каждом FocalLoss, Adam, Cosine Annealing + warmup Первый стейдж: только основной набор данных, только основной таргет Второй стейдж: Основной таргет + псевдолейблы, только основные размеченные данные + двухэтапная самодистилляция Третий стейдж: Использовали все данные. Для каждого батча брали половину из размеченных данных, половину из неразмеченных. Для основного набора испольовали основные лейблы + псевдолейблы с второго этапа, для неразмеченных- только псевдолейблы Ну и еще дважды самодистилляция. Если вы шарите, то объясните плз в комментах почему самодистилл работает и почему его есть смысл больше двух раз делать? Там еще и перфоманс на самодистиллах растет. В комментах есть график того, какие резульатты получаются от уровня дистилла

Ну я пост про решение написал, вот вам тизер

BirdCLEF+ 2025 Очередная часть ежегодного соревнования от Cornell Lab of Ornithology. Дано: – 12 ГБ аудиозаписей птиц, насеко
BirdCLEF+ 2025 Очередная часть ежегодного соревнования от Cornell Lab of Ornithology. Дано: – 12 ГБ аудиозаписей птиц, насекомых, рептилий и т. д. – Источники (около–опенсорс): 1. xeno-canto.org 2. iNaturalist 3. Colombian Sound Archive (CSA) института Гумбольдта в Колумбии Первые два источника — чистый краудсорс, разметка «грязная»: 1. у части семплов встречаются продолжительные комментарии колубийского натуралиста на испанском; 2. муха залетает в микрофон и гудит 40 секунд из 50 секунд записи вообще-то птицы; 3. мой любимый фейл — запись птицы, где звук обрывается громким «бултых», а дальше — полная тишина на 90 сек. Видимо не все микрофоны пережили сборку датасета Разметка (для всех семплов): 1. Основной лейбл — целевая живность, которую нужно предсказывать. 2. Вторичный лейбл — какие ещё виды могут быть слышны. Конечно же не гарантирует то, что все виды на записи хотя бы отмечены 3. Координаты 4. Автор записи 5. Оценка качества (только для xeno-canto) 6. Источник данных (одна из трёх библиотек) Трейн/тест сплит: Общий пул разбит по записям, но обработан по-разному: В train — полные аудиофайлы. В test — нарезки записей по 5 с. Например, из записей длительностью 30 сек и 20 сек получится 10 тест-семплов: первые 6 — с основным лейблом первой записи; остальные 4 — с лейблом второй. Метрика: Macro-ROC-AUC — сортировка вероятностей внутри каждого класса и усреднение без учёта частоты встречаемости. Ну и конечно же ограничения на железо: 90 минут CPU-only Тут кстати тренд: 2025- 90 min CPU-only 2024- 120 min CPU-only 2023- 120 min CPU-only 2022- 9 hours с доступом к GPU 2021- 9 CPU часов или 3 GPU часа Как решать будете?

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

Теперь образ Рустама приследует меня всюду
Теперь образ Рустама приследует меня всюду

Ко мне снова пришли миньоны Рустама. В этот раз их видимо переалайнили: боты перестали хоть как-то отвечать на сообщения или как-то видоизменять скрипт. По ощущениям- там 50 разных фраз внутри и бот моделькой выбирает самый правдоподобный ответ. Скукота, но прогресс на лицо. Боты стали еще скучнее и больше похожими на классических спамеров. А вот блеклист видимо все еще не прикрутили, чтобы токены на меня и других хейтеров не тратить. Удивительно, насколько Рустам читал lean startup, но не понимал что пишут

Repost from Hacker News
X X^t can be faster (Score: 150+ in 8 hours) Link: https://readhacker.news/s/6uANa Comments: https://readhacker.news/c/6uANa

Сори что без оригинального контента пока

бедные карлики

Человечество: Изобретает LLM-driven поиск, чтобы не читать булшит от маркетологов и ллмки переписали все без воды и CEO-оптимизации Маркетологи: МЫ СОБРАЛИ ДЛЯ ВАС ПОЛТОРЫ ТЫСЯЧИ ПРОМТОВ КОТОРЫЕ ПОЗВОЛЯТ ВАМ ЛУЧШЕ ИСКАТЬ С ПОМОЩЬЮ AI

Approved: Если занять хорошее место на Forams Classification 2025, то позовут выступать на семинаре CVPR.
Approved: Если занять хорошее место на Forams Classification 2025, то позовут выступать на семинаре CVPR.

Repost from Hacker News
Python's new t-strings (Score: 154+ in 5 hours) Link: https://readhacker.news/s/6t8rs Comments: https://readhacker.news/c/6t8rs