Основы, подводные камни при инициализации веса и передовые методы

Мотивация

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

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

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

Основы и обозначения

Рассмотрим нейронную сеть L-слоя, у которой есть L-1 скрытых слоев и 1 выходной слой. Параметры (веса и смещения) слоя l представлены как

Помимо весов и смещений, в процессе обучения вычисляются следующие промежуточные переменные.

Обучение нейронной сети состоит из 4 шагов:

  1. Инициализируйте веса и смещения.
  2. Прямое распространение: используя входные данные X, веса W и смещения b, для каждого слоя мы вычисляем Z и A. На последнем слое мы вычисляем f (A ^ (L-1)) , который может быть сигмовидная, softmax или линейная функция от A ^ (L-1), и это дает прогноз y_hat.
  3. Вычислите функцию потерь: это функция фактической метки y и прогнозируемой метки y_hat. Он фиксирует, насколько наши прогнозы далеки от фактической цели. Наша цель - минимизировать эту функцию потерь.
  4. Обратное распространение: на этом этапе мы вычисляем градиенты функции потерь f (y, y_hat) по отношению к A, W и b, называемые dA, dW и db. Используя эти градиенты, мы обновляем значения параметров с последнего слоя на первый.
  5. Повторите шаги 2–4 для n итераций / эпох, пока мы не почувствуем, что минимизировали функцию потерь без переобучения данных поезда (подробнее об этом позже!)

Вот краткий обзор шагов 2, 3 и 4 для сети с 2 слоями, то есть одним скрытым слоем. (Обратите внимание, что я не добавлял здесь термины смещения для простоты):

Инициализация весов W

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

1. Инициализация всех весов равными 0

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

2. Инициализация весов случайным образом

Случайная инициализация весов в соответствии со стандартным нормальным распределением (np.random.randn(size_l, size_l-1) в Python) при работе с (глубокой) сетью потенциально может привести к двум проблемам - исчезающим градиентам или взрывным градиентам.

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

Обновление веса незначительное и приводит к более медленной сходимости. Это замедляет оптимизацию функции потерь. В худшем случае это может полностью остановить дальнейшее обучение нейронной сети.

Более конкретно, в случае сигмоида (z) и tanh (z), если ваши веса велики, тогда градиент будет исчезающе малым, эффективно предотвращая изменение веса весов. Это потому, что abs (dW) будет очень незначительно увеличиваться или, возможно, становиться все меньше и меньше с каждой итерацией. С RELU (z) исчезающие градиенты, как правило, не проблема, поскольку градиент равен 0 для отрицательных (и нулевых) входов и 1 для положительных входов.

б) Взрывающиеся градиенты. Это полная противоположность исчезающим градиентам. Предположим, у вас есть неотрицательные и большие веса и маленькие активации A (как может иметь место для сигмоида (z)). Когда эти веса умножаются по слоям, они вызывают большое изменение стоимости. Таким образом, градиенты также будут большими. Это означает, что изменения W на W — ⍺ * dW, будут огромными, нисходящий момент будет увеличиваться.

Это может привести к колебаниям около минимумов или даже к многократному превышению оптимума, и модель никогда не научится!

Еще одно влияние взрывных градиентов состоит в том, что огромные значения градиентов могут вызвать переполнение чисел, что приведет к неправильным вычислениям или введению NaN. Это также может привести к потере значения NaN.

Лучшие практики

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

2. Для глубоких сетей мы можем использовать эвристику для инициализации весов в зависимости от нелинейной функции активации. Здесь вместо использования стандартного нормального распределения мы берем W из нормального распределения с дисперсией k / n, где k зависит от функции активации. Хотя эти эвристики не решают полностью проблему взрывающихся / исчезающих градиентов, они в значительной степени помогают смягчить ее. Наиболее распространены:

а) Для RELU (z) - мы умножаем случайно сгенерированные значения W на:

б) Для tanh (z) - эвристика называется инициализацией Ксавье. Он похож на предыдущий, за исключением того, что k равно 1 вместо 2.

In TensorFlow W = tf.get_variable('W', [dims], initializer) где initializer = tf.contrib.layers.xavier_initializer()

c) Еще одна часто используемая эвристика:

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

3. Градиентное отсечение - это еще один способ решения проблемы взрывающегося градиента. Мы устанавливаем пороговое значение, и если выбранная функция градиента больше этого порога, мы устанавливаем другое значение. Например, нормализуем градиенты, когда норма L2 превышает определенный порог –W = W * threshold / l2_norm(W) if l2_norm(W) > threshold

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

Заключение

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

использованная литература

  1. Https://www.coursera.org/learn/deep-neural-network/lecture/RwqYe/weight-initialization-for-deep-networks
  2. Нейронные сети: обучение с обратным распространением - Джереми Джордан
  3. Нежное введение в расширяющиеся градиенты в нейронных сетях, Джейсон Браунли
  4. Проблема исчезающего градиента
  5. Https://www.quora.com/Why-is-it-a-problem-to-have-exploding-gradients-in-a-neural-net-especial-in-an-RNN

Обо мне: я закончил MS Data Science в USF и получил степень бакалавра компьютерных наук. У меня 2 года опыта в создании алгоритмов прогнозирования и рекомендаций, а также в получении бизнес-информации для финансовых и розничных клиентов. Я очень рад возможности применить свои знания в области машинного обучения и глубокого обучения для решения реальных проблем.
Не пропустите другие мои блоги здесь!
LinkedIn: https: // www. linkedin.com/in/neerja-doshi/