Является ли L1-регуляризация в Keras/Tensorflow * действительно * L1-регуляризацией?

Я использую L1-регуляризацию по моим параметрам нейронной сети в Keras с помощью keras.regularizers.l1(0.01), чтобы получить разреженную модель. Я нахожу, что, хотя многие из моих коэффициентов близки к нулю, некоторые из них фактически равны нулю.

Посмотрев на исходный код для регуляризации, он предполагает, что Keras просто добавляет норму L1 параметров к функции потерь.

Это было бы неправильно, потому что параметры почти наверняка никогда не перейдут к нулю (в пределах ошибки с плавающей запятой), как предполагалось, с регуляцией L1. Норма L1 не дифференцируема, если параметр равен нулю, поэтому необходимо использовать субградиентные методы, когда параметры установлены на ноль, если они близки к нулю в подпрограмме оптимизации. См. Оператор мягкого порога max(0, ..) здесь.

Делает ли Tensorflow/Keras это, или это нецелесообразно делать со стохастическим спусками градиента?

EDIT: также здесь - превосходное сообщение в блоге, объясняющее оператора мягкого порога для регуляции L1.

Ответ 1

Итак, несмотря на то, что @Joshua отвечает, есть еще три вещи, которые стоит упомянуть:

  • Нет проблем, связанных с градиентом в 0. keras автоматически устанавливает значение 1 аналогично случаю relu.
  • Помните, что значения, меньшие, чем 1e-6, фактически равны 0, поскольку это float32 точность.
  • Проблема отсутствия большинства значений, установленных на 0, может возникнуть из-за вычислительных причин из-за характера алгоритма, основанного на градиентном спуске (и установки высокого значения l1) из-за колебаний что может произойти из-за разрыва градиента. Чтобы понять, что для данного веса w = 0.005 ваша скорость обучения равна 0.01, а градиент основной потери равен 0 w.r.t. до w. Таким образом, ваш вес будет обновляться следующим образом:

    w = 0.005 - 1 * 0.01 = -0.05 (because gradient is equal to 1 as w > 0),
    

    и после второго обновления:

    w = -0.005 + 1 * 0.01 = 0.05 (because gradient is equal to -1 as w < 0).
    

    Как вы можете видеть, абсолютное значение w не уменьшилось, даже если вы применили регуляцию l1, и это произошло из-за характера алгоритма на основе градиента. Конечно, это упрощенная ситуация, но вы можете испытывать такое колебательное поведение очень часто при использовании регулятора нормализации l1.

Ответ 2

Keras правильно реализует регуляцию L1. В контексте нейронных сетей регуляризация L1 просто добавляет норму L1 параметров к функции потерь (см. CS231).

В то время как регуляция L1 поощряет разреженность, она не гарантирует, что выход будет разреженным. Обновление параметров из стохастического градиентного спуска по своей сути является шумным. Таким образом, вероятность того, что любой заданный параметр точно равна 0, исчезающе мала.

Однако многие параметры L1-регуляризованной сети часто близки к 0. Рудиментарный подход будет заключаться в пороговых малых значениях 0. Было проведено исследование для изучения более совершенных методов генерации разреженной нейронной сети. В в этой статье авторы одновременно обрезают и обучают нейронную сеть, чтобы достичь разрешений на 90-95% на ряде известных сетевых архитектур.

Ответ 3

Keras правильно реализует регуляризацию L1, но это не LASSO. Для LASSO понадобится функция мягкого порога, как правильно указано в исходном посте. Это было бы очень полезно с функцией, подобной keras.layers.ThresholdedReLU(theta = 1.0), но с f (x) = x для x> theta или f (x) = x для x <-theta, f ( х) = 0 в противном случае. Для LASSO тета будет равна скорости обучения, умноженной на коэффициент регуляризации функции L1.

Ответ 4

TL; DR: Формулировка в рамках глубокого обучения является правильной, но в настоящее время у нас нет мощного решателя/оптимизатора, чтобы решить его ТОЧНО с SGD или его вариантами. Но если вы используете проксимальные оптимизаторы, вы можете получить разреженное решение.


Ваше наблюдение верно.

  1. Почти все системы глубокого обучения (включая TF) реализуют регуляризацию L1, добавляя абсолютные значения параметров в функцию потерь. Это лагранжева форма регуляризации L1 и является ПРАВИЛЬНОЙ.
  2. Тем не менее, виноват СОЛЬВЕР/ОПТИМИЗАТОР. Даже для хорошо изученной задачи LASSO, где решение должно быть разреженным, а оператор мягкого порога дает нам разреженное решение, решатель спуска на субградиенте не может получить точное решение SPARSE. Этот ответ от Quora дает некоторое представление о свойствах сходимости субградиентного спуска, который говорит:

Субградиентный спуск имеет очень плохие свойства сходимости для негладких функций, таких как задача Лассо, поскольку он полностью игнорирует структуру проблемы (не различает подгонку наименьших квадратов и член регуляризации), просто рассматривая субградиенты всей цели, Интуитивно понятно, что небольшие шаги в направлении (суб) градиента обычно не приводят к точным координатам, равным нулю.

  1. Если вы используете проксимальные операторы, вы можете получить разреженное решение. Например, вы можете взглянуть на статью "Выбор разреженных структур на основе данных для глубоких нейронных сетей" (эта поставляется с кодом MXNET и легко воспроизводится!) Или "Стохастический проксимальный градиентный спуск с методами ускорения" (этот документ дает больше теоретического понимания). Я не совсем уверен, что встроенный проксимальный оптимизатор в TF (например, tf.train.ProximalAdagradOptimizer) может привести к разреженным решениям, но вы можете попробовать.

Другой простой способ - обнулить малые веса (то есть: абсолютное значение <1e-4) после тренировки или после каждого шага градиентного спуска, чтобы вызвать разреженность. Это просто удобный эвристический подход, а не теоретически строгий.