Современное глубокое обучение никогда не было таким простым

Недавно была опубликована Эта статья Диганта Мисра о новой функции активации для глубокого обучения, называемой активацией миш. Эта новая функция активации превосходит функции активации ReLU и swish при тестировании на CIFAR-100 с Squeeze Excite Net-18. Я настоятельно рекомендую пойти и прочитать статью, на которую я ссылался выше, если вам нужны подробности об исследовании и функции активации. Я не собираюсь углубляться в математику и исследования статьи, но функция выглядит так.

Если вы знакомы с функциями активации, вы можете подумать, что это очень похоже на активацию swish. Это потому, что миш был вдохновлен swish. Из первоначального прочтения статьи кажется, что mish потенциально может быть лучше, чем как swish, так и чрезвычайно популярные активации ReLU. Лучшая часть этой новой замечательной функции активации заключается в том, что вы можете реализовать ее с помощью двух строк кода.

Реализации

Пользовательская сеть

Во-первых, я собираюсь показать вам, как реализовать мишень в нейронной сети, которую вы создаете сами. Прежде чем строить нашу сеть, нам нужно написать функцию mish с помощью PyTorch. Как и было обещано, для этого требуется всего 2 строчки кода.

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

В передней части я установил функцию активации для всех линейных слоев на mish-активацию, которую мы написали выше. Теперь модель готова к обучению. Это довольно просто и легко реализовать! Я запустил эту модель на данных идентификации воздушного кактуса в Kaggle и увидел увеличение точности на 1,5% по сравнению с активацией ReLU после 10 эпох обучения. Я не буду на это жаловаться.

Трансферное обучение

Создание собственной нейронной сети - это круто, но вряд ли практично. Трансферное обучение имеет тенденцию быть гораздо более эффективным, когда дело доходит до получения результатов на высшем уровне в глубоком обучении. Итак, давайте посмотрим, как можно реализовать активацию мишени с помощью VGG-16. Вместо функции нам нужно написать класс для нашей активации mish, который наследуется от класса torch.nn.Module. Это должно выглядеть примерно так:

Прошу прощения, что я обещал 2 строчки кода, и теперь я меняю его на 5. Я надеюсь, что после того, как вы воспользуетесь этим и увидите, насколько это круто, вы меня простите. Теперь, когда наша функция активации записана как класс, мы можем подготовить ее и добавить в нашу модель VGG-16.

Мы меняем активации ReLU в классификационной части VGG-16 на mish-активации и заменяем последний слой на один для нашей задачи классификации. После удаления градиентов для всех слоев, кроме последних, мы готовы к тренировке! И с этими небольшими фрагментами кода вы реализовали современную функцию активации.

Несколько советов

Есть несколько вещей, упомянутых в статье миша, которые, я думаю, стоит отметить, если вы хотите реализовать это:

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

Если вам интересен мой полный код, я помещаю его на Kaggle здесь. Не стесняйтесь клонировать его и пробовать разные архитектуры или применять активацию мишени к сверточным слоям.