- PVSM.RU - https://www.pvsm.ru -
Или как я оказался в команде победителей соревнования Machines Can See 2018 adversarial competition.
Суть любых состязательных атак на примере.
Так уж получилось, что мне довелось поучаствовать в соревновании Machines Can See 2018. Я присоединился к соревнованию я поздновато (примерно за неделю до окончания), но в конечном итоге оказался в команде из 4 человек, где вклад троих из нас (включая меня) был необходим для победы (убрать одну составляющую — и мы бы оказались в аутсайдерах).
Цель соревнования — изменять лица людей так, что сверточная нейросеть, предоставленная как черный ящик организаторами, не могла различить лицо-источник от лица-цели. Допустимое количество изменений было ограничено SSIM [1].
Оригинальная статья размещена тут [2].
Прим. Корявый перевод терминологии или его отсутствие продиктованы отсутствием устоявшейся терминологии в русском языке. Вы можете предложить свои варианты в комментариях.
Суть соревнования — изменить лицо на входе так, что черный ящик не смог бы различить два лица (по крайней мере, с точки зрения L2/ евклидова расстояния)
Что работает в состязательных атаках и что сработало в нашем случае:
Что не сработало в нашем случае:
Что мы не попробовали (не успели, не хватило усилий или поленились):
О соревновании в целом:
Ресурсы:
Честно говоря, меня привлекли новая интересная область, GTX 1080Ti Founders' Edition в призах, и относительно низкая конкуренция (что как бы вообще не сравнить с 4000 людей в каком-нибудь соревновании на Kaggle против всего ODS с 20 GPU на команду).
Как уже упоминалось выше, целью соревнования служил обман ЧЯ модели, чтобы последняя не смогла отличить двух разных людей (в смысле L2-нормы / евклидова расстояния). Ну и так как это был черный ящик, нам пришлось дистиллировать Student-сети на предоставленных данных и надеяться, что градиенты ЧЯ и БЯ будут достаточно похожи для осуществления атаки.
Если прочитать обзоры статей (например, вот [9] и вот [10], хотя такие статьи реально не говорят, что работает на практике) и скомпилировать то, чего достигли топовые команды, то можно кратко описать такие лучшие практики:
Честно говоря, мы еще были сбиты с толку тем, что два абсолютно разных end-to-end подхода, имплементированные независимо двумя разными людьми из команды, тупо не работали на ЧЯ. По сути такое могло означать, что в нашей интерпретации постановки задачи где-то в запряталась утечка данных, которую мы не заметили (или что руки кривые). Во многих современных computer vision задачах end-to-end решения (например, перенос стиля, deep watershed, генерация изображений, чистка от шума и артефактов и др.) получаются либо сильно лучше чем все что было до этого, либо вообще не работают. Meh.
1. Натренировать Student Net. 2. Применить БЯ атаку на Student Net. 3. Надеяться, что на Teacher Net атака тоже распространится
Как работает метод градиентов
Мы по сути добиваемся при помощи дистилляции того, что БЯ подражает ЧЯ. Потом считаются градиенты изображений на входе относительно вывода модели. Секрет, как обычно, заключается в эвристиках.
Целевой метрикой была средняя L2 норма (евклидово расстояние) между всеми 25 комбинациями изображений источников и таргетов (5*5 = 25).
Из-за ограничений платформы (CodaLab), вероятно, подсчет приватного скора (и слияние команд) осуществлялись вручную, что как бы такая себе история.
Я присоединился к команде, после того как натренировал Student сетки, лучше чем у всех остальных на лидерборде (насколько мне известно), и после небольшого обсуждения с Atmyre [11] (она помогла с правильно скомпилированным ЧЯ, так как сама столкнулась с тем же). Потом мы поделились нашими локальными скорами без шеринга подходов и кода и собственно за 2-3 дня до финишной прямой произошло следующее:
Еще раз хотел бы поблагодарить ее за бесценный совет и организационные навыки.
Состав команды:
github.com/atmyre [11] — исходя из действий, была капитаном команды изначально. Добавила genetic differential evolution атаку в финальном сабмите;
github.com/mortido [12] — лучшая имплементация FGVM атаки с великолепными эвристиками + натренировал 2 модели, используя код бейзлайна;
github.com/snakers4 [13] — помимо всяких тестов на сокращение количества вариантов в поиске решения, натренировал 3 Student модели с наилучшими метриками + предоставил вычислительные мощности + помогал в фазе финального сабмита и презентации результатов;
github.com/stalkermustang; [14]
В итоге мы все узнали много нового благодаря друг другу, и я рад, что мы попытали удачу в данном соревновании. Отсутствие хотя бы одного вклада из трех привело бы к поражению.
Мне удалось получить лучший скор при тренировке Student моделей, так как я использовал свой собственный код вместо кода бейзлайна.
Ключевые моменты / что сработало:
Что не сработало:
Наши лучшие модели — заметьте, что лучший скор — 3 * 1e-4. Судя по сложности моделей, можно примерно представить, что ЧЯ — это ResNet34. В моих тестах ResNet50+ показал себя хуже чем ResNet34.
MSE лоссы первого места
Мы собирали свой скор примерно так:
Топовое решение выглядело так (да, были шутки на тему того, что просто стакая резнет, можно угадать, что ЧЯ является резнетом):
Другие полезные подходы от других команд:
Полезные эвристики для FGVM:
Краткое саммари:
Пусть даже они и провалились, их стоит еще раз попробовать в будущем на новых задачах. См. детали в репозитории, а по сути мы попробовали следующее:
Непрерывная (end-to-end) модель
Последовательность действий в end-to-end модели
Еще я думаю, что мой лосс [16] просто прекрасен.
Автор: Alexander
Источник [26]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/python/282504
Ссылки в тексте:
[1] SSIM: https://ru.wikipedia.org/wiki/SSIM
[2] тут: https://spark-in.me/post/playing-with-mcs2018-adversarial-attacks
[3] статья: https://pablormier.github.io/2017/09/05/a-tutorial-on-differential-evolution-with-python/
[4] attack: https://arxiv.org/abs/1705.07263
[5] логиты: https://en.wikipedia.org/wiki/Logit
[6] Репозиторий: https://github.com/snakers4/msc-2018-final
[7] презентация: https://drive.google.com/file/d/1P-4AdCqw81nOK79vU_m7IsCVzogdeSNq/view
[8] Презентации: https://drive.google.com/file/d/1aIUSVFBHYabBRdolBRR-1RKhTMg-v-3f/view
[9] вот: https://arxiv.org/abs/1712.07107
[10] вот: https://arxiv.org/abs/1801.00553
[11] Atmyre: https://github.com/atmyre
[12] github.com/mortido: https://github.com/mortido
[13] github.com/snakers4: https://github.com/snakers4
[14] github.com/stalkermustang;: https://github.com/stalkermustang;
[15] Момент Нестерова: http://ruder.io/optimizing-gradient-descent/index.html#momentum
[16] лосс: https://github.com/snakers4/msc-2018-final/blob/master/av_cnns/models/AttackerLoss.py#L7-L92
[17] соревнования: https://competitions.codalab.org/competitions/19090#participate
[18] Серия статей : https://habr.com/post/331552/
[19] Wiki: https://en.wikipedia.org/wiki/Structural_similarity
[20] имплементация: https://github.com/Po-Hsun-Su/pytorch-ssim
[21] имплементация: https://docs.scipy.org/doc/scipy-0.17.0/reference/generated/scipy.optimize.differential_evolution.html
[22] Наша: https://drive.google.com/open?id=1P-4AdCqw81nOK79vU_m7IsCVzogdeSNq
[23] Все презентации: https://drive.google.com/open?id=1aIUSVFBHYabBRdolBRR-1RKhTMg-v-3f
[24] https://arxiv.org/pdf/1710.06081.pdf: https://arxiv.org/pdf/1710.06081.pdf
[25] https://arxiv.org/abs/1708.03999: https://arxiv.org/abs/1708.03999
[26] Источник: https://habr.com/post/413775/?utm_source=habrahabr&utm_medium=rss&utm_campaign=413775
Нажмите здесь для печати.