L1 / L2, снижение веса, выпадение, нормализация партии, увеличение данных и ранняя остановка

Также доступно на испанском | También disponible en español

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

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

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

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

L2 регуляризация

Основная идея такого рода регуляризации - уменьшить значение параметров, что приводит к уменьшению дисперсии.

Этот метод вводит дополнительный член штрафа в исходной функции потерь (L), добавляя сумму квадратов параметров ( ω).

Плохая новость заключается в том, что этот новый термин может быть настолько большим, что сеть попытается минимизировать функцию потерь, сделав свои параметры очень близкими к нулю, что было бы совсем не удобно. Вот почему мы умножаем эту сумму на небольшую константу (λ), значение которой будет выбрано произвольно (0,1, 0,01,…).

Формула функции потерь:

И обновление весов на каждой итерации алгоритма градиентного спуска будет таким, что:

Увеличения значения λ будет достаточно, чтобы применить большую регуляризацию.

Это регуляризация, используемая в регрессии, известной как Ridge.

L1 регуляризация

Существует еще один метод, очень похожий на предыдущий, под названием L1 регуляризация, где параметры сети в штрафном члене не возводятся в квадрат, а вместо этого используется его абсолютное значение:

Этот вариант подталкивает параметры к меньшим значениям, даже полностью отменяя влияние некоторых входных характеристик на сетевой выход, что подразумевает автоматический выбор функции. Результатом является лучшее обобщение, но только до определенной степени (выбор λ в этом случае становится более значимым).

Это регуляризация, применяемая регрессией Лассо.

Снижение веса

Этот метод идентичен регуляризации L2, но применяется в другом месте: вместо того, чтобы вводить штраф в виде суммы в функции потерь, он добавляется как дополнительный член в формуле обновления весов:

Как мы можем заметить, это обновление практически такое же, как и в L2-регуляризации, за исключением того, что в этом случае константа λ не умножается на 2 (поэтому, если мы закодируем оба метода, в этом случае значение λ должно быть двойным, чтобы получить тот же результат, что и в L2).

Выбывать

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

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

После того, как мы настроили нашу модель, мы должны каким-то образом компенсировать тот факт, что часть сети была неактивна во время обучения. При прогнозировании каждый нейрон будет активен, и, следовательно, будет больше активаций (выходов слоя), вносящих вклад в выходной сигнал сети, увеличивая его диапазон. Одно простое решение - умножить все параметры на вероятность того, что они не будут отброшены.

Пакетная нормализация

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

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

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

После нормализации используются два дополнительных параметра: один bias как добавление, а другой константа, подобная bias, умножающая каждую активацию. Их цель - легко масштабировать входной диапазон до выходного диапазона, что значительно поможет нашей сети адаптировать свои параметры к входным данным и уменьшит колебания функции потерь. Как следствие, мы также можем увеличить скорость обучения (меньше риск застрять в локальном минимуме), и сходимость к глобальному минимуму будет выполняться быстрее.

Пакетная норма - это больше метод помощи в обучении, чем сама по себе стратегия регуляризации. Последнее фактически достигается за счет применения метода оптимизации, известного как Momentum, уже представленного в предыдущей статье. Благодаря этому значительно сокращается переоснащение.

Увеличение данных

Идея здесь состоит в том, чтобы применить различные преобразования к исходному набору данных, получая немного разные, но по существу идентичные выборки, что позволяет сети работать лучше во времени логического вывода.

Этот метод широко используется в области компьютерного зрения, потому что он работает очень хорошо (в других областях все еще необходимо использовать). В этом контексте одно входное изображение будет обрабатываться нейронной сетью столько раз, сколько эпох, которые мы запускаем, что позволяет сети запоминать часть изображения, если мы тренируемся слишком долго. Решение: применять случайные преобразования каждый раз, когда мы повторно вводим изображение в сеть.

Примеры этих преобразований:

  • Переворачивание изображения по горизонтали / вертикали
  • Поворот изображения на X градусов.
  • Обрезка, расширение, изменение размера…
  • Применение перспективных деформаций
  • Регулировка яркости, контрастности, насыщенности и т. Д.
  • Добавление шума, дефектов,…
  • Комбинация вышеперечисленного :)

Применяя увеличение данных, мы получим больше информации для обучения, без необходимости получать дополнительные образцы, а также без увеличения времени обучения. Более того, независимо от того, предназначена ли наша сеть для классификации изображений или обнаружения объектов, этот метод позволит модели достичь хороших результатов с изображениями, снятыми под разными углами или при разных условиях освещения (меньше переобучения, поэтому она будет лучше обобщать!).

Ранняя остановка

И, наконец, набор правил, который нужно применить, чтобы знать, когда пора прекратить тренировку, чтобы не было переобучения (или недообучения).

Наиболее распространенным подходом было бы обучение модели, отслеживая ее производительность и сохраняя ее параметры в конце каждой эпохи . Мы будем делать это до тех пор, пока не увидим, что ошибка валидации увеличивается постоянно (есть ухудшения из-за стохастической природы алгоритма). Мы сохраним полученную непосредственно перед этим модель.

Здесь необходимо помнить о важности выбора хорошего набора для валидации :)

Надеюсь, вам понравилось! Подпишитесь на #yottabytes, чтобы не пропустить подобные статьи :)