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

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

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

Учитывая обучающую выборку, как выбрать или узнать параметры θ?

Кажется, один разумный метод - сделать h (x) близким к y, по крайней мере, для имеющихся у нас обучающих примеров. Чтобы формализовать это, мы определим функцию, которая измеряет для каждого значения θ, насколько близки h (x (i)) ’к соответствующим y (i)’ s. Определим функцию стоимости:

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

Мы хотим выбрать θ так, чтобы минимизировать J (θ). Для этого давайте воспользуемся алгоритмом поиска, который начинается с некоторого «начального предположения» для θ и многократно изменяет θ, чтобы сделать J (θ) меньше, пока, надеюсь, мы не сходимся к значению θ, которое минимизирует J (θ). В частности, давайте рассмотрим алгоритм градиентного спуска, который начинается с некоторого начального θ и многократно выполняет обновление:

Здесь α называется скоростью обучения. Это очень естественный алгоритм, который многократно делает шаг в направлении наискорейшего уменьшения J. Чтобы реализовать этот алгоритм, мы должны выяснить, что представляет собой член частной производной в правой части. Давайте сначала проработаем это для случая, когда у нас есть только один обучающий пример (x, y), чтобы мы могли пренебречь суммой в определении J. У нас есть:

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

Для одного примера обучения это дает правило обновления:

Это правило называется правилом обновления LMS (LMS означает «наименьшие средние квадраты») и также известно как правило обучения Уидроу-Хоффа. У этого правила есть несколько свойств, которые кажутся естественными и интуитивно понятными. Например, величина обновления пропорциональна члену ошибки (y (i) - hθ (x (i))); таким образом, например, если мы сталкиваемся с обучающим примером, на котором наш прогноз почти соответствует фактическому значению y (i), то мы обнаруживаем, что нет необходимости изменять параметры; Напротив, большее изменение параметров будет сделано, если наш прогноз hθ (x (i)) будет иметь большую ошибку (т.е.если он очень далеко от y (i)). Мы вывели правило LMS для случая, когда был только один обучающий пример. Есть два способа изменить этот метод для обучающей выборки из более чем одного примера. Первый - заменить его на следующий алгоритм.

Читатель может легко убедиться, что величина в суммировании в приведенном выше правиле обновления равна ∂J (θ) / ∂θj (для исходного определения J). Итак, это просто градиентный спуск по исходной функции стоимости J. Этот метод просматривает каждый пример во всем обучающем наборе на каждом шаге и называется пакетным градиентным спуском. Обратите внимание, что хотя градиентный спуск может быть подвержен локальным минимумам в целом, проблема оптимизации, которую мы разместили здесь для линейной регрессии, стала только глобальной, и никаких других локальных оптимумов; таким образом, градиентный спуск всегда сходится (при условии, что скорость обучения α не слишком велика) к глобальному минимуму. В самом деле, J - выпуклая квадратичная функция. Вот пример градиентного спуска, который выполняется для минимизации квадратичной функции.

Эллипсы, показанные выше, являются контурами квадратичной функции. Также показана траектория градиентного спуска, которая была инициализирована в (48,30). Знаки x на рисунке (соединенные прямыми линиями) отмечают последовательные значения θ, через которые прошел градиентный спуск. Если мы построим график hθ (x) как функцию от x (площади) вместе с данными обучения, мы получим следующий рисунок:

Если количество спален было включено в качестве одной из входных характеристик, мы получим θ0 = 89,60, θ1 = 0,1392, θ2 = −8,738. Вышеупомянутые результаты были получены при периодическом градиентном спуске. Есть альтернатива пакетному градиентному спуску, которая также очень хорошо работает. Рассмотрим следующий алгоритм:

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

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

Часто, стохастический градиентный спуск приближает θ к минимуму намного быстрее, чем пакетный градиентный спуск. (Обратите внимание, однако, что он может никогда не «сходиться» к минимуму, и параметры θ будут продолжать колебаться около минимума J (θ), но на практике большинство значений, близких к минимуму, будут достаточно хорошими приближениями к истинному минимуму. .2) По этим причинам, особенно когда обучающая выборка большая, стохастический градиентный спуск часто предпочтительнее пакетного градиентного спуска.

Код

def update_weights(m, b, X, Y, learning_rate):
    m_deriv = 0
    b_deriv = 0
    N = len(X)
    for i in range(N):
        # Calculate partial derivatives
        # -2x(y - (mx + b))
        m_deriv += -2*X[i] * (Y[i] - (m*X[i] + b))
        # -2(y - (mx + b))
        b_deriv += -2*(Y[i] - (m*X[i] + b))
    # We subtract because the derivatives point in direction of steepest ascent
    m -= (m_deriv / float(N)) * learning_rate
    b -= (b_deriv / float(N)) * learning_rate
    return m, b

Вывод

Если вы только начинаете заниматься машинным обучением и хотите учиться с нуля, я сделаю эту серию, которая будет длиться 5–6 минут о машинном обучении и некоторых побочных проектах в конце каждой главы, так что оставайтесь с нами и довольны обучение

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

Добро пожаловать на мою среднюю страницу

Github, LinkedIn, Захра Эльхамрауи, Upwork