Соревнование Data Fusion Contest 2023
Соревнование Data Fusion Contest 2023

Я, как новичок, наблюдаю за всем происходящим вокруг, и замечаю, что тренд на IT-специальности огромный. Множество курсов заманивают обещаниями о работе с высокой зарплатой, но спустя полгода после окончания курсов вы понимаете, что на "рынке" полно таких же как вы без опыта, а всем нужны профессионалы. Знакомо?

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

В настоящее время проходят два соревнования по машинному обучению с крупным призовым фондом, однако на одном из них такая высокая конкуренция, что для достижения чего-либо нужно тратить на это 24 часа в сутки. Второе же соревнование, Data Fusion Contest 2023, не получило достаточного внимания, хотя формат соревнования непривычный. Это турнир по Adversarial ML между командами атакующих и защищающих ML-моделей на транзакционных данных и содержит две задачи:

???? В задаче Атака участники будут создавать атаки на нейросеть, обученную на данных транзакций. 

???? В задаче Защита — наоборот, учиться защищать свои модели от заранее оговоренного вида атак.

???? Призеров определят Турниры — лучшие команды обеих задач столкнутся друг с другом за призовой фонд в 2 000 000 рублей!  

Также участников ждет много мерча и подарков, онлайн-митапы с воркшопами и возможность круто прокачаться в новых DS/ML методах

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

Мое решение задачи Защиты.

Прочитав все вводные, форум и посмотрев митапы, я осознал как отправлять решение на задачу защита, его нужно отправлять в формате zip.

Организаторы предоставили свой бейзлайн защиты submit_defence.zip, который состоит из 4 файлов:

файлы для отправка к задаче защита
файлы для отправка к задаче защита

– metadata.json – какой образ взять и как запустить скрипт

metadata.json
metadata.json

– model.py – скрипт, который сделает предикт. На вход имя .csv файла для предикта и имя выходного .csv файла с результатом работы

– nn_bins.pickle nn_weights.ckpt – файлы, необходимые для работы бейзлайна

Мы пока не будем лезть в дебри и создавать новые веса и прочее. Мы залезем в параметры модели в файле model.py и будем менять параметры этой модели. Главное на начальном этапе - попасть в топ-10.

В классе TransactionsRnn я меняю коэффициент скорости обучения (Learning rate=5e-2) и Droupout (nn.Dropout2d(0.1)) и смотрю что будет.

class TransactionsRnn(pl.LightningModule):
    def __init__(self, rnn_units=128, top_classifier_units=64, lr=5e-2, out_features=2):
        super().__init__()
        self._transaction_cat_embeddings = nn.ModuleList(
            [
                self._create_embedding_projection(*embedding_projections[feature])
                for feature in embedding_projections.keys()
            ]
        )

        self._spatial_dropout = nn.Dropout2d(0.1)
        concat_embed = sum([embedding_projections[x][1] for x in embedding_projections.keys()])
        self._gru = nn.GRU(input_size=concat_embed, hidden_size=rnn_units, batch_first=True, bidirectional=True,)

        self._hidden_size = rnn_units

Меняю количество повторений на 50 и random_seed на 42.

def reliable_predict(source_file, bins_path, model_path, random_seed=42):
    REPETITIONS = 50  # Сколько повторений

Увеличю batch_size до 256.

def get_dataloader(dataset, device, batch_size=256, is_validation=False):
    def collate_loader(x):
        return tuple(x_.to(device) for x_ in default_collate(x))

    return DataLoader(dataset, batch_size=batch_size, collate_fn=collate_loader, shuffle=not is_validation,)
def predict(source_file, bins_path, model_path, random_seed=42):
    pl.seed_everything(random_seed)

Далее мы сохраняем изменения, отправляем решение в формате .zip и получаем первый сабмит после базовой версии. Таким образом, меняя параметры модели и/или модель, добавляя слои, мы находим оптимальное для нас решение и достигаем лучшего скора в лидерборде.

Метрика соревнования

Mean Harm ROC-AUC. Это среднее гармоническое ROC-AUC на исходных данных и на атакованных. Метрика сочетает в себе компромисс между повышением защищенности модели и потенциальным снижением ее качества.

Mean Harm ROC-AUC: 0,71016

Код представлен на githab

Комментарии (3)


  1. SanSanychSeva
    00.00.0000 00:00

    А это возможно: не имея опыта сразу после курсов успешно участвовать в соревнованиях? Зачем тогда нужен опыт?

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


    1. FruTb
      00.00.0000 00:00
      +1

      Участвовать не значит побеждать. А вот поработать с почти настоящими задачами - очень полезно.


      1. SanSanychSeva
        00.00.0000 00:00

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