В нейронной кондитерской.

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

Ключ к пониманию, с чего начать

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

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

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

Инициализация — с чего начинается путешествие

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

Вместо этого вы хотите сделать то, что ученые-компьютерщики называют нарушением симметрии (это не имеет ничего общего с тем, что физик понимает под этим термином). Идея заключается в том, что каждый нейрон должен быть изначально различен. Все веса матриц инициализируются обычно небольшим значением, отличным от нуля. Как мало, кажется, не имеет большого значения, поскольку это работа регулирующего органа по корректировке, но обычно он берет из нормального распределения. Следует только помнить, что малые начальные веса также означают малые начальные градиенты. Похоже, ведутся интенсивные споры о том, как нормализовать значения, взятые из нормального распределения. Проблема в том, что чем больше входов у нейрона, тем выше будет дисперсия его выходов, потому что будет больше случайно выбранных параметров. Если нейронная сеть не прямоугольная, значит, если не все слои имеют одинаковую ширину, следует нормализовать квадратным корнем из числа входов (хотя в этой статье при определенных обстоятельствах предлагается немного другая нормализация). Это гарантирует, что дисперсия всегда одинакова. Такая адаптивная инициализация также называется инициализацией Xavier. Очень простой для понимания расчет, объясняющий эту нормализацию, также можно найти здесь.

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

Больше, чем просто активированные линейные слои

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

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

Какое занятие выбрать?

Широкий выбор функций активации всегда вызывает много путаницы. Во-первых, хотя многие продолжают упоминать сигмоидную функцию, есть причина, по которой я не взял ее в качестве примера в Части 2: это просто не лучший выбор. Прежде всего, если выходные данные линейного слоя станут очень большими или маленькими, градиент упадет до нуля, поскольку сигмоид там в основном постоянен. Это означает, что он насыщается, или простыми словами: он застревает. Вдобавок ко всему, он даже не центрирован по нулю, поэтому вся предыдущая нормализация была бы бесполезной. Tanh — это версия сигмоиды с центром в нуле, и она может быть хорошим выбором для (немного необычной) окончательной функции активации после последнего линейного слоя, если нужно получить результат в диапазоне [-1,1].

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

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

Сколько слоев и какой ширины следует использовать?

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

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