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

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

Градиентный спуск

Это то, что Википедия говорит о градиентном спуске

Градиентный спуск - это итерационный оптимизационный алгоритм первого порядка для поиска минимума функции.

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

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

  1. Вычислить наклон (градиент), который является производной первого порядка функции в текущей точке.
  2. Перемещение в направлении, противоположном увеличению уклона от текущей точки на вычисленную величину

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

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

Есть разные способы, которыми этот человек (вес) может спускаться по склону. Давайте рассмотрим их по очереди.

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

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

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

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

Стохастический градиентный спуск

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

  1. Взять пример
  2. Загрузите это в нейронную сеть
  3. Рассчитайте градиент
  4. Используйте градиент, который мы вычислили на шаге 3, чтобы обновить веса.
  5. Повторите шаги 1–4 для всех примеров в наборе обучающих данных.

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

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

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

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

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

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

  1. Выберите мини-партию
  2. Загрузите это в нейронную сеть
  3. Рассчитайте средний градиент мини-партии
  4. Используйте средний градиент, который мы вычислили на шаге 3, чтобы обновить веса.
  5. Повторите шаги 1–4 для созданных нами мини-партий.

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

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

Заключение

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

Есть вопросы? Нужна помощь? Свяжитесь со мной!

Github

"Персональный сайт"

LinkedIn

Почта: [email protected]