С нуля: научим обучать нейросеть

искусственный интеллект глубокое обучение алгоритм Нейронные сети

От Науки о Данных

Автор: Виталий Бушаев

Сборник "Сердце машины"


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


Введение

Эта статья является частью опыта и идей автора о том, как «обучать» нейронные сети.Помимо рассмотрения основных концепций нейронных сетей, в этой статье также описывается градиентный спуск (GD) и некоторые его варианты. Кроме того, во второй части серии статей будут представлены наиболее популярные алгоритмы обучения, такие как:

  • Стохастический градиентный спуск импульса (SGD)
  • Алгоритм RMSprop
  • Алгоритм Адама (адаптивная оценка момента)
  • Генетический алгоритм

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

Автор этой статьи основывается на соревновании по идентификации кошек и собак, проведенном на kaggle несколько лет назад (woohoo.cardreform.com/from/dogs-vs-from…) в качестве примера, чтобы все объяснить. Задача, с которой мы сталкиваемся в этом конкурсе, состоит в том, чтобы по картинке определить, является ли животное на картинке кошкой или собакой.


II. Определение нейронных сетей

Искусственная нейронная сеть (ИНС) была вдохновлена ​​рабочим механизмом человеческого мозга. Хотя эта симуляция очень свободна, ИНС действительно имеют некоторые сходства со своими биологическими создателями. Они состоят из определенного количества нейронов. Итак, давайте взглянем на один нейрон.

один нейрон

Нейрон, о котором мы поговорим далее, представляет собой несколько иную версию простейшего нейрона, предложенного Фрэнком Розенблаттом в 1957 году, под названием «восприятие». Все модификации, которые я сделал, предназначены для упрощения, так как я не буду подробно рассказывать о нейронных сетях в этом посте. Я просто пытаюсь дать читателю интуитивное представление о том, как работают нейронные сети.

Что такое нейрон? Это математическая функция, которая принимает в качестве входных данных определенное количество числовых значений (столько, сколько вы хотите). У нейрона, который я изобразил выше, есть два входа. Мы обозначаем каждый вход как x_k, где k — индекс входа. Каждому входу x_k нейрон присваивает ему другое число w_k, а вектор, составленный из этих параметров w_k, называется вектором весов. Именно эти веса делают каждый нейрон уникальным. Во время тестирования веса не меняются, но во время обучения мы собираемся изменить эти веса, чтобы «настроить» нашу сеть. Я расскажу об этом в следующей статье. Как упоминалось ранее, нейрон — это математическая функция. Но что это за функция? Это линейная комбинация весов и входных данных, а также некоторая нелинейная функция, основанная на этой комбинации. Я продолжу объяснять дальше. Давайте посмотрим на первую часть линейной комбинации.

Линейная комбинация ввода и весов.

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

Выражение для блока линейного выпрямителя.

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

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

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

Простая нейронная сеть.

Нейронная сеть, определенная на изображении выше, имеет 5 нейронов. Как видите, эта нейронная сеть состоит из 3 полностью связанных слоев, сложенных друг в друга, т. е. каждый нейрон в каждом слое связан с каждым нейроном в следующем слое. Сколько слоев имеет ваша нейронная сеть, сколько нейронов в каждом слое и как нейроны связаны друг с другом, определяют архитектуру нейронной сети. Первый слой называется входным слоем и содержит два нейрона. Нейроны этого слоя — это не те нейроны, о которых я упоминал ранее, в том смысле, что они не выполняют никаких вычислений. Здесь они просто представляют входные данные для нейронной сети. А необходимость нелинейности в нейронных сетях проистекает из двух фактов: 1) наши нейроны связаны между собой; 2) функции, основанные на линейных функциях, по-прежнему линейны. Поэтому, если вы не применяете нелинейную функцию к каждому нейрону, нейронная сеть будет просто линейной функцией, поэтому она не более мощная, чем один нейрон. И последнее, на что следует обратить внимание: обычно мы хотим, чтобы нейронная сеть имела размер вывода от 0 до 1, поэтому мы относимся к ней вероятностно. Например, в случае различения кошек и собак мы можем рассматривать результаты, близкие к 0, как кошек, а результаты, близкие к 1, как собак. Для этого мы применим другую функцию активации к последнему нейрону. Мы будем использовать сигмовидную функцию активации. Все, что вам нужно знать об этой функции активации на данный момент, это то, что ее возвращаемое значение представляет собой число от 0 до 1, а это именно то, что нам нужно. После объяснения этого мы можем определить нейронную сеть, соответствующую приведенному выше рисунку.

Функция, определяющая нейронную сеть. Верхний индекс w представляет индекс нейрона, а нижний индекс представляет индекс входа.

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


III. Функция потерь

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

В приведенной выше формуле y представляет собой число, которое мы хотим получить от нейронной сети, y означает фактический результат, полученный с помощью выборки через нейронную сеть, а i — это индекс нашей обучающей выборки. Возьмем в качестве примера идентификацию кошек и собак. У нас есть набор данных, состоящий из изображений кошек и собак, если изображение собаки, соответствующая метка равна 1, если изображение кошки, соответствующая метка равна 0. Эта метка является соответствующим y, результатом, который мы хотим получить через нейронную сеть при передаче изображения в нейронную сеть. Чтобы вычислить функцию потерь, мы должны выполнить итерацию по каждому изображению в наборе данных, вычислить y для каждой выборки, а затем вычислить функцию потерь, как определено выше. Если функция потерь относительно велика, это означает, что производительность нашей нейронной сети не очень хорошая, и мы хотим, чтобы функция потерь была как можно меньше. Чтобы глубже понять связь между функциями потерь и нейронными сетями, мы можем переписать эту формулу, заменив y фактической функцией сети.


IV. Обучение

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

Проблема в том, что процесс обучения эквивалентен минимизации функции потерь. Зачем минимизировать потери, а не максимизировать их? Оказывается, потери — относительно простая функция для оптимизации.

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

Во-первых, мы должны помнить, что такое производная переменной. Возьмем в качестве примера более простую функцию f(x) = x. Если мы вспомним правила исчисления, которые мы изучили в средней школе, мы знаем, что производная этой функции равна 1 при каждом x. Так что же могут сказать нам производные? Производная описывает, как быстро изменяется значение функции, когда мы позволяем независимой переменной изменяться в положительном направлении бесконечно малыми шагами. Его можно записать в следующей математической форме:

Это означает, что изменение значения функции (левая часть уравнения) примерно равно произведению производной функции по некоторой соответствующей переменной x на приращение x. Возвращаясь к простейшему примеру, который мы только что привели, f(x) = x, производная везде равна 1, а это означает, что если мы изменим x на небольшой шаг ε в положительном направлении, изменение выхода функции будет равно к произведению 1 и ε, Просто самого ε. Проверить это правило проще. На самом деле это не приближение, это точно. Зачем? Потому что наша производная одинакова для каждого x. Но это не работает для подавляющего большинства функций. Давайте рассмотрим немного более сложную функцию f(x) = x^2.

Благодаря знанию исчисления мы можем узнать, что производная этой функции равна 2*x. Теперь, если мы начнем с некоторого x и переместимся на определенный шаг ε, легко увидеть, что соответствующее приращение функции не совсем равно вычислению в приведенной выше формуле.

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

Как мы можем использовать информацию, предоставленную производной, чтобы минимизировать некоторую функцию потерь? Или вернемся к функции f(x) = x^2. Очевидно, что эта функция принимает минимальное значение в точке x=0, но откуда об этом узнает компьютер? Предположим, мы начинаем со случайным начальным значением x, равным 2, а производная функции равна 4. Это означает, что если x изменяется в положительном направлении, приращение функции будет в 4 раза больше, чем приращение x, поэтому вместо этого значение функции будет увеличиваться. Вместо этого мы хотим минимизировать нашу функцию, поэтому мы можем изменить x в противоположном направлении, то есть в отрицательном направлении, и чтобы убедиться, что значение функции уменьшается, мы изменяем его только на небольшой шаг. Но сколько мы можем изменить за один шаг?Наша производная гарантирует только то, что значение функции будет уменьшаться, когда x бесконечно изменяется в отрицательном направлении. Поэтому мы хотим использовать некоторые гиперпараметры, чтобы контролировать, сколько мы можем изменить за раз. Эти гиперпараметры называются скоростями обучения, и мы поговорим о них позже. Давайте теперь посмотрим, что произойдет, если мы начнем с -2. Производная здесь равна -4, что означает, что если мы изменим x в положительную сторону, значение функции будет меньше, а это именно то, что нам нужно.

Обратите внимание на образец здесь? Когда x>0, значение нашей производной также больше 0, нам нужно измениться в отрицательном направлении, когда x

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

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

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

Как вы можете видеть в моем предыдущем определении, формула для нашей функции потерь — это среднее значение суммы. Из принципа исчисления мы можем знать, что сумма дифференциалов есть дифференциал сумм. Итак, чтобы рассчитать градиент функции потерь, нам нужно перебрать каждую выборку в нашем наборе данных. Выполнение градиентного спуска на каждой итерации очень неэффективно, потому что каждая итерация алгоритма улучшает функцию потерь только небольшими шагами. Для решения этой проблемы существует еще один алгоритм мини-пакетного градиентного спуска. Способ алгоритма обновления весов не изменился, но мы не вычисляем точные градиенты. Вместо этого мы аппроксимируем градиент по мини-пакету набора данных и используем этот градиент для обновления весов. Мини-пакет не гарантирует изменения весов в лучшую сторону. На самом деле, обычно это не так. При использовании градиентного спуска выбор достаточно малой скорости обучения гарантирует, что ваша функция потерь будет уменьшаться с каждой итерацией. Но это не так при использовании Mini-batch. Ваша функция потерь со временем будет уменьшаться, но она будет колебаться и иметь больше «шума».

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

Крайним случаем мини-пакетного градиентного спуска является случай, когда размер пакета равен 1. Эта форма градиентного спуска называется стохастическим градиентным спуском (SGD). Обычно во многих источниках, когда люди говорят о стохастическом градиентном спуске, они на самом деле имеют в виду мини-пакетный стохастический градиентный спуск. Большинство сред глубокого обучения позволяют выбирать размер пакета для стохастического градиентного спуска.

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


VII. Обратное распространение (BP)

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

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

Хотя этот метод очень прост в реализации, он требует больших вычислительных ресурсов.

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


VI. Почему это работает?

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

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

2. Может быть непонятно, зачем есть функция, которая может отличать кошек и собак от картинки. Идея здесь такова: пока у вас есть набор данных с входными данными и метками, всегда будет функция, которая будет хорошо работать с данным набором данных. Проблема в том, что эта функция может быть довольно сложной. Здесь могут помочь нейронные сети. Существует «теорема универсальной аппроксимации», которая относится к тому факту, что нейронная сеть со скрытым слоем может аппроксимировать любую функцию, которую вы хотите, и она может быть настолько хороша, насколько вы этого хотите.


Алгоритм стохастического градиентного спуска импульса

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

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


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

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

Обратите внимание, что хотя точки кажутся очень близкими, их координаты x различны. То есть для каждой точки ее x-координата является уникальным идентификатором, так что это также индекс, определяющий каждую точку в последовательности S.

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

Momentum - данные экспоненциально взвешенного среднего

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

Ряд V — это желтая часть диаграммы рассеивания выше. Бета — это еще один гиперпараметр, который принимает значение от 0 до 1. В приведенном выше примере возьмите Beta = 0,9.0,9 является хорошим значением и часто используется для методов SGD с импульсом. Мы можем интуитивно понять Бета таким образом: мы берем приблизительное среднее значение 1/(1-бета) пунктов позже в последовательности. Давайте посмотрим, как выбор бета влияет на новую последовательность V.

Экспоненциально взвешенные средние результаты для различных значений бета.

Как видим, чем меньше значение Beta, тем больше флуктуация ряда V. Поскольку мы усредняем меньше примеров, результаты «ближе» к зашумленным данным. При более высоких значениях бета, например, когда бета = 0,98, мы получаем более округлую кривую, но кривая немного смещается вправо, потому что диапазон, по которому мы усредняем, становится больше (приблизительно для бета = 0,98 это 50). При Бета = 0,9 существует хороший баланс между этими двумя крайностями.

математический раздел

Эта часть не является обязательной для использования импульса в вашем проекте, поэтому ее можно пропустить. Но эта часть более интуитивно объясняет, как работает моментум.

Расширим определение экспоненциально взвешенного среднего трех последовательных элементов новой последовательности V.

V - новая последовательность. S - исходная последовательность.

Объединив его, мы получим:

Упростите его снова, чтобы получить:

Как видно из этого уравнения, Т-е значение новой последовательности зависит от всех предыдущих значений 1…t исходной последовательности S. Всем значениям из S присваивается определенный вес. Этот вес представляет собой вес, полученный путем умножения (t-i)-го значения последовательности S на (1-бета). Поскольку бета меньше 1, когда мы возводим бета в степень некоторого положительного числа, значение становится меньше. Таким образом, вес исходного значения последовательности S будет намного меньше, и, следовательно, скалярное произведение последовательности S на последовательность V будет меньше затронуто. В некотором смысле вес настолько мал, что мы почти можем сказать, что «забыли» значение, потому что эффект настолько мал, что едва заметен. Преимущество использования этого приближения заключается в том, что когда веса меньше 1/e, для больших значений бета требуется больше весов, меньших 1/e. Вот почему чем больше значение бета, тем больше точечных произведений мы должны усреднить. На графике ниже показано, как быстро веса становятся меньше при изменении начального значения последовательности S по сравнению с порогом = 1/e, где мы «забыли» начальное значение.

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

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


Метод импульса SGD

Мы определили метод получения «скользящего» среднего значения некоторого ряда, которое меняется вместе с данными. Как мы можем применить это к обучению нейронных сетей? Он усредняет наши градиенты. Я объясню, как это делается в Momentum ниже, и я продолжу объяснять, почему это может работать лучше.

Я дам два определения для определения метода SGD с импульсом, который представляет собой одно и то же уравнение, выраженное двумя разными способами. Во-первых, специализация Эндрю Нг по глубокому обучению на Coursera (www.deeplearning.ai/) в определении, представленном в курсе. Как он это объясняет, мы определяем импульс, который представляет собой скользящее среднее наших градиентов. Затем мы используем его для обновления весов сети. Следующее:

где L — функция потерь, символ треугольника — градиент по весу, а α — скорость обучения. Другой наиболее популярный способ выражения правила обновления импульса менее интуитивен и просто опускает термин (1 - бета).

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

Ускоренный градиент Нестерова

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

Импульс Нестерова можно определить как:

Как работает импульс

Здесь я объясню, почему импульсный метод в подавляющем большинстве случаев работает лучше, чем классический метод SGD.

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

Другая причина – овраг. Ущелье — это область, в которой кривая в одном измерении намного круче, чем в другом. В глубоком обучении площадь долины может быть аппроксимирована как локальный минимум, и этот признак не может быть получен методом SGD. SGD имеет тенденцию колебаться над узкими оврагами, потому что отрицательные градиенты будут спускаться по крутой стороне, а не спускаться по оврагу к оптимуму. Импульс помогает ускорить градиент в правильном направлении. Как показано ниже:

Слева — SGD без импульса, справа — SGD с импульсом (источник:У-у-у. Уилламетт. Квота/~го RR/класс…)


в заключении

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


Справочные ресурсы

  • fast.ai(fast.ai/): Он предлагает два отличных курса по глубокому обучению для программистов и один по вычислимой линейной алгебре. Это отличное место для начала кодирования нейронных сетей, и по мере изучения теории вы сможете реализовывать код как можно быстрее по мере углубления курса.
  • neuralnetworksanddeeplearning.com(neuralnetworksanddeeplearning.com/chap1.html): хорошая онлайн-книга по основам. О теории нейронных сетей. Автор отлично объясняет математику, которую вам нужно знать. Он также предоставляет и объясняет некоторый код для кодирования архитектур нейронных сетей с нуля без использования какой-либо среды глубокого обучения.
  • Курс глубокого обучения Эндрю Нг (woohoo.course RA.org/специальный чат…): курс на Coursera, тоже про изучение нейронных сетей. Начните с очень простых примеров нейронных сетей, проложите свой путь до сверточных нейронных сетей и многого другого.
  • 3Синий1Коричневый (Ву Ву YouTube.com/channel/UC Y…): На YouTube также есть несколько хороших видеороликов, которые помогут вам понять нейронные сети и линейную алгебру. Они демонстрируют отличную визуализацию и очень интуитивно понятный способ понимания математики и нейронных сетей.
  • Стэнфордский курс CS231 (cs231n.stanford.edu/): Это класс по сверточной нейронной сети для визуального распознавания, и он может многое узнать о глубоком обучении и, в частности, о сверточной нейронной сети.


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

[1] Нин Цянь, О термине импульса в алгоритмах обучения градиентного спуска, Нейронные сети: официальный журнал Международного общества нейронных сетей, 12(1):145–151, 1999

[2] Distill, Почему Momentum действительно работает (distill.universal/2017/момент…)

[3] deeplearning.ai

[4] Ruder(2016). An overview of gradient descent optimization algorithms. arXiv preprint arXiv:1609.04747

[5] Ruder (2017) Основные моменты оптимизации для глубокого обучения в 2017 г. (Такие как второй .IO/deep-ах пусть вам...)

[6] Конспект лекций Stanford CS231n (На данный момент 231 you.GitHub.IO/neural-net…)(На данный момент 231 you.GitHub.IO/neural-net…)

[7] пост. любовь (www.fast.ai/)


Оригинальная ссылка:

первая часть:к data science.com/how-do-major-he…

Часть II: Стохастический градиентный спуск с импульсом (quip.com/TJ7SA Испанец WZ…)

к data science.com/stochastic-…


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