Реализация инструментов регуляризации в pyTorch

Я проводил некоторое исследование о разреженности в структуре нейронных сетей и наткнулся на статью « Групповая разреженная регуляризация для глубоких нейронных сетей ». В этом документе рассматривается сложная задача одновременной оптимизации (i) весов нейронной сети, (ii) количества нейронов для каждого скрытого слоя и (iii) подмножества активных входных функций (т. Е. Выбора функций ). По сути, они предложили интеграцию штрафов лассо в структуру регуляризации в нейронной сети. Существует множество публикаций и обширных исследований, посвященных определению и важности регуляризации . Например, эти сообщения [1] и [2] представляют собой быстрое введение в тему регуляризации.

Чтобы воспроизвести эксперименты в « Групповой разреженной регуляризации для глубоких нейронных сетей , я решил построить свой проект с помощью PyTorch который является хорошо известной структурой глубокого обучения. По мнению Medium, это 4-й лучший фреймворк для глубокого обучения. Он набирает все большую популярность на академическом уровне, поскольку его легко модулировать, чтобы тестировать новые идеи быстрее, чем у большинства его конкурентов.

Я понимаю, что не существует таких инструментов для какой-либо регуляризации, кроме L2-регуляризации. В pyTorch L2 реализован в параметре уменьшение веса в оптимизаторе в отличие от Lasagne (другой фреймворк глубокого обучения), который делает доступной регуляризацию L1 и L2 в их встроенной реализации. Вы можете найти множество предлагаемых решений, объясняющих, как реализовать регуляризацию L1 с использованием инфраструктуры pyTorch, но нет простого инструмента реализации, доступного для ваших экспериментов.

Чтобы компенсировать это отсутствие, я решил создать некий готовый к использованию объект регуляризации с использованием инфраструктуры pyTorch. Реализацию можно найти здесь. Я реализовал регуляризацию L1, классическую регуляризацию L2, регуляризацию ElasticNet (L1 + L2), регуляризацию GroupLasso и более строгий штраф SparseGroupLasso, введенный в Групповая разреженная регуляризация для глубокие нейронные сети.

Объект класса построен с использованием модели pyTorch в качестве параметра. Мы можем применить штраф за регуляризацию к конкретным весам параметра или ко всем весам каждого слоя в модели.

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

Как и в оригинальной статье, я протестировал реализацию на наборе данных Digits, который представляет проблему классификации изображений. Он состоит из 1797 серых изображений 8 × 8 рукописных цифр, собранных у нескольких десятков разных людей. Я использовал простую полносвязную нейронную сеть с двумя скрытыми слоями, имеющими соответственно 40 и 20 нейронов.

Глядя на результаты, мы видим, что L2-регуляризованная модель и регуляризованная модель убывания веса имеют одинаковые характеристики на тестовом наборе. Это довольно хорошо, и мы этого ожидали, поскольку Weight Decay - это реализация L2, уже предложенная pyTorch. Разреженные методы (L1-регуляризованные и GL-регуляризованные модели) тоже работают неплохо, но они не лучше, чем модель Упорядочение веса. Теперь мы можем посмотреть на реальную разреженность модели. Чтобы изучить это, мы установили, что веса ниже 10e-3 по абсолютной величине установлены на 0. А затем мы проанализировали весь% разреженности нейронов в каждой модели. Процент разреженности рассчитывается путем деления числа нейронов, все веса которых суммированы на 0, на размер каждого слоя. Как и ожидалось, L1-регуляризованная модель имеет более разреженную плотность, чем L2-регуляризованная модель. Но производительность в этом случае все равно выглядит великолепно. Иногда слишком большая разреженность тоже не на пользу модели.

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