• 27/08/2021

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

Мини-пакетный градиентный спуск

Во-первых, это будет мини-пакетный градиентный спуск. Это очень помогает обучать нейронную сеть намного быстрее. Хотя векторизация используется для эффективного вычисления вычислений, она может не справиться с огромным размером выборки (например, от 5 000 000 до 500 000 000). Это займет много времени для огромного размера выборки, даже если мы применим векторизацию, и для каждой эпохи требуется одинокое время. Для решения этих проблем рекомендуется использовать мини-пакетный градиентный спуск. Взяв в качестве примера размер выборки 5 000 000, нам может потребоваться разделить ее на 5 000 наборов мини-партий, каждая из которых будет содержать 1000 выборок. Мы будем использовать X{t} для выражения множества t после расщепления. Затем нам нужно вычислить прямое и обратное распространение, как обычно, но нам может потребоваться 5000 раз с векторизацией для каждого набора выборок. Для обратного распространения нам нужно вычислить функцию стоимости градиента для каждого набора выборок отдельно, чтобы получить J {t}, и повторять это до тех пор, пока мы не сможем получить большую аппроксимацию стоимости. Чтобы построить кривую для функции стоимости с количеством итераций, мы обычно получаем гладкую кривую, и она идет вниз с минимизацией функции стоимости для пакетного градиентного спуска. Для мини-пакетного градиентного спуска мы можем получить график, сравнив стоимость и стоимость каждой мини-партии (# t), и мы можем получить график с гораздо более шумными и более высокими колебаниями. Это связано с тем, что функция стоимости для J{1} может быть ниже и выше, чем J{2} , J{…}. Поэтому вполне нормально, что мы получили флуктуирующую функцию стоимости для мини-пакетного градиентного спуска.

Итак, как определить размер мини-партии? Это зависит от размера выборки, которая у нас есть. Просто представьте, что размер мини-партии будет m для размера выборки m. Тогда это просто пакетный градиентный спуск. Это станет очень длинным на итерацию, потому что нужно пройти через всю выборку. Как насчет размера мини-партии = 1 (стохастический градиентный спуск)? Каждый образец станет отдельным мини-пакетом, и мы можем потерять преимущества векторизации. Следовательно, мы должны определить размер мини-пакета между пакетным градиентным спуском и стохастическим градиентным спуском. Размер мини-партии не должен быть слишком большим или слишком маленьким. Мы можем получить самый быстрый способ обучения, применив векторизацию, и добиться прогресса, не дожидаясь всего тренировочного набора. Предполагается, что мы все еще можем использовать пакетный градиентный спуск, если размер обучающей выборки составляет ‹ 2000. Если размер тренировочного набора > 2000, мы можем применить аромат мини-пакетного градиента. Кроме того, мы можем определить размер мини-партии со степенью 2 (2⁶ — 64, 2⁷ — 128, 2⁸ — 256, 2⁹ — 512,…). Это двоичное значение, и оно помещается в память нашего компьютера. Кроме того, мы должны убедиться, что мини-пакет помещается в память CPU/GPU.

Экспоненциально взвешенные средние

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

Он начнется с V0 = 0 и попытается рассчитать его с вашими данными. Значение бета очень важно, так как оно определяет период времени для приблизительного среднего значения с помощью 1 / (1-β). Например, если мы установим бета как 0,9. Он показывает приблизительное среднее значение за последние 10 дней. Нам нужно учитывать значение бета, и это может помочь объединить данные разброса в аппроксимированную линию. Если мы установим более высокое значение бета, мы можем усреднять наши данные за большее количество дней. Кроме того, мы можем получить гораздо более гладкую линию для аппроксимации. Если мы установим низкое значение бета, мы можем получить колеблющуюся линию аппроксимации, поскольку у нас может быть высокое отношение для текущего значения вместо предыдущего среднего. Он может обеспечить гораздо более короткое окно, гораздо более шумный, но он более восприимчив к выбросам, что означает, что он может быстрее адаптироваться к изменению температуры.

Итак, что он делает на самом деле? Возьмем бета = 0,9 в качестве примера. Мы попытаемся изменить размер выборки с t на 0, когда t = 100.

Мы просто перемещаем положение уравнения. Мы можем рассчитать по текущему значению и предыдущему среднему (V99) с коэффициентом 0,9. Тогда мы можем выразить уравнение, как показано ниже,

Мы пытаемся заменить V99 и так далее…

Мы остановимся здесь, и вся формула может быть выражена так в конечном итоге…

Разной для каждых предыдущих данных будет степень 0,9. Согласно уравнению 1 / (1-β), оно показывает приблизительное среднее значение за последние 10 дней как 0,9¹⁰ ~0,35, что близко к 1/e. Это означает, что на распад до 1/e (1 сверх базы естественных алгоритмов) уходит 10 дней. Он имеет такое же значение для бета = 0,98 и показывает, что для распада до 1/e потребуется 50 дней, потому что 0,9⁵⁰ ~ 0,35. В вычислениях мы можем вычислить это следующим образом:

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

Следовательно, это может помочь устранить смещение в начале, но на самом деле это не будет так очевидно, когда значение станет больше!

Градиентный спуск с импульсом

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

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

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

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

RMSprop (среднеквадратичное распространение)

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

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

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

Алгоритм оптимизации Адама (RMPprop + импульс)

Для предыдущих двух методов его можно комбинировать и использовать для ускорения обучения. Мы должны определить гиперпараметр — бета-1 для импульса и бета-2 для RMSprop. Мы можем вычислить его следующим образом:

На самом деле, мы просто комбинируем оба метода и коррекцию смещения, чтобы получить более точное значение. Также следует попробовать диапазон альфа. Для бета-1 (первый момент) и бета-2 (второй момент) вы можете использовать 0,9 и 0,999 по умолчанию, так как это мало что изменит, а эпсилон должен быть 10^-8, так как это не повлияет на производительность.

Затухание скорости обучения (снижение скорости обучения с течением времени)

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

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

Есть еще один способ снижения скорости обучения.

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

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

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