Я, как новичок, наблюдаю за всем происходящим вокруг, и замечаю, что тренд на IT-специальности огромный. Множество курсов заманивают обещаниями о работе с высокой зарплатой, но спустя полгода после окончания курсов вы понимаете, что на "рынке" полно таких же как вы без опыта, а всем нужны профессионалы. Знакомо?
Я вынужден был изменить свой путь к работе мечты, и я выбрал участие в соревнованиях, чемпионатах и хакатонах, которые приносят не только опыт и знакомства, но и денежные призы и другие бонусы.
В настоящее время проходят два соревнования по машинному обучению с крупным призовым фондом, однако на одном из них такая высокая конкуренция, что для достижения чего-либо нужно тратить на это 24 часа в сутки. Второе же соревнование, Data Fusion Contest 2023, не получило достаточного внимания, хотя формат соревнования непривычный. Это турнир по Adversarial ML между командами атакующих и защищающих ML-моделей на транзакционных данных и содержит две задачи:
???? В задаче Атака участники будут создавать атаки на нейросеть, обученную на данных транзакций.
???? В задаче Защита — наоборот, учиться защищать свои модели от заранее оговоренного вида атак.
???? Призеров определят Турниры — лучшие команды обеих задач столкнутся друг с другом за призовой фонд в 2 000 000 рублей!
Также участников ждет много мерча и подарков, онлайн-митапы с воркшопами и возможность круто прокачаться в новых DS/ML методах
Прочитав описание задач три раза, мне, как новичку, мало что стало понятно. Но низкая конкуренция, большой призовой фонд, множество подарков и любопытство заставляют меня разбираться в этих данных.
Мое решение задачи Защиты.
Прочитав все вводные, форум и посмотрев митапы, я осознал как отправлять решение на задачу защита, его нужно отправлять в формате zip.
Организаторы предоставили свой бейзлайн защиты submit_defence.zip, который состоит из 4 файлов:
– 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 на исходных данных и на атакованных. Метрика сочетает в себе компромисс между повышением защищенности модели и потенциальным снижением ее качества.
SanSanychSeva
А это возможно: не имея опыта сразу после курсов успешно участвовать в соревнованиях? Зачем тогда нужен опыт?
Я не против соревнований, но совет после курсов в качестве следующего шага в поиске работы начать побеждать в соревнованиях не кажется особо практичным. Наверное, за пару лет можно вырасти и на соревнованиях, но жить-то, пардон, эти два года на что?
FruTb
Участвовать не значит побеждать. А вот поработать с почти настоящими задачами - очень полезно.
SanSanychSeva
Кто ж спорит, что полезно! Но автор описывает это как способ найти работу, если нет опыта. Вопрос в том, сколько лет для такого способа понадобится - может, все-таки, через стажеры быстрее?