Наука о данных, Редакция, Программирование

Градиентный спуск для машинного обучения (ML) 101 с помощью учебника по Python

Учебное пособие по алгоритму градиентного спуска для машинного обучения (ML) с Python

Последнее обновление: 7 января 2021 г.

Автор (ы): Сания Парвиз, Роберто Ириондо

Код этого руководства доступен на Github, а его полная реализация - на Google Colab.

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

Оглавление

📚 Ознакомьтесь с нашим руководством по сверточным нейронным сетям. 📚

Что такое градиентный спуск?

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

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

Градиент - это вектор-функция, которая описывает наклон тангенса графика функции, указывающий на направление наиболее значительной скорости увеличения функции. Это производная, которая показывает наклон или наклон функции стоимости [6].

Например:

Предположим, что Джон находится на вершине горы и его цель - добраться до нижнего поля, но Джон слеп и не может видеть нижнюю строку. Как он решит эту проблему?

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

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

Для более глубокого понимания градиентного спуска необходимо подробно разбираться в приведенных ниже темах:

  • Функция стоимости
  • Минимизация функции стоимости
  • Минимумы и максимумы
  • Выпуклая функция
  • Градиенты
  • Условие остановки
  • Скорость обучения

Функция стоимости

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

Вот основные функции затрат, используемые в машинном обучении:

  • Среднеквадратичная ошибка (MSE)
  • Потеря журнала или кросс-энтропия
  • KL-Дивергенция

Уравнение среднеквадратичной ошибки (MSE):

Где:

Среднеквадратичная ошибка используется в алгоритме регрессии в машинном обучении.

Пример кода Python:

def sum_of_squares(v):
    val = sum(item ** 2 for item in v)

Уравнение логарифмической потери или кросс-энтропии:

В задаче классификации используется логарифмическая потеря функции стоимости или кросс-энтропия.

Связь между функцией затрат и градиентным спуском

Функция стоимости - это ситуация, которая минимизирована. Функция стоимости может быть суммой квадратов ошибок по обучающей выборке. Градиентный спуск - это метод нахождения минимума функции нескольких переменных [8], который может использоваться для минимизации функции стоимости. Таким образом, если функция стоимости является функцией переменных K, то градиент - это длина-K. вектор, представляющий направление, в котором стоимость растет наиболее быстро.

Например:

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

Итак, в линейном уравнении → y = mx + c, как правило, вычисляются значения параметров m и c. Ожидается минимальная ошибка или потеря, такая функция называется функцией стоимости или функцией потерь.

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

Градиенты

Наклон прямой показывает, насколько крута прямая [17].

Уравнение градиента:

Несколько моментов, связанных с градиентом:

  • Вверх положительный, а вниз отрицательный
  • Если начинать слева и направо, то это положительно.

Пусть e1, e2,. . . , ed 2 Rd - определенный набор единичных векторов, так что ei = (0, 0, ..., 0, 1, 0, ..., 0), где для ei 1 находится в i-й координате.

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

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

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

Уравнение градиентного спуска:

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

#Pseudocode
train(θ) = (1/2m) Σ( hθ(x(i)) - y^(i))^2
Repeat {
 θj = θj – (learning-rate/m) * Σ( hθ(x^(i)) - y^(i))xj^(i)
    For every j = 0 … n 
}

В этом случае:

xj ^ (i) - это j-я особенность i ^ th обучающего примера. Затем мы повторяем, пока не достигнем сходимости:

  1. Учитывая градиент, рассчитайте изменения параметров со скоростью обучения.
  2. Пересчитайте новый градиент с новым значением параметра.
  3. Повторите шаг 1.

Существует три распространенных типа градиентного спуска:

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

Реализация градиентного спуска в Python с помощью Numpy:

Импортируйте все необходимые пакеты:

import pandas as pdimport numpy as npimport matplotlib.pyplot as plt%matplotlib inline

Прочитать данные из CSV:

column_names = ['Population', 'Profit']df = pd.read_csv('/content/data.txt', header=None, names=column_names)df.head()

Получите значение X и Y:

df.insert(0, 'Theta0', 1)cols = df.shape[1]X = df.iloc[:,0:cols-1]Y = df.iloc[:,cols-1:cols]theta = np.matrix(np.array([0]*X.shape[1]))X = np.matrix(X.values)Y = np.matrix(Y.values)

Постройте данные:

df.plot(kind='scatter', x='Population', y='Profit', figsize=(12,8))

Метод расчета RSS:

def calculate_RSS(X, y, theta):  
    inner = np.power(((X * theta.T) - y), 2)
    return np.sum(inner) / (2 * len(X))

Метод расчета градиентного спуска:

def gradientDescent(X, Y, theta, alpha, iters):  
    t = np.matrix(np.zeros(theta.shape))
    parameters = int(theta.ravel().shape[1])
    cost = np.zeros(iters)
    
    for i in range(iters):
        error = (X * theta.T) - Y    for j in range(parameters):
         term = np.multiply(error, X[:,j])
         t[0,j] = theta[0,j] - ((alpha / len(X)) * np.sum(term))     theta = t
     cost[i] = calculate_RSS(X, Y, theta)     return theta, cost

Вычислить ошибку без применения градиентного спуска:

error = calculate_RSS(X, Y, theta)error

Вычислите ошибку, применив градиентный спуск:

g, cost = gradientDescent(X, Y, theta, 0.01, 1000)g

Вычислить ошибку после применения градиентного спуска:

error = calculate_RSS(X, Y, g)error

Построение данных:

x = np.linspace(df.Population.min(), df.Population.max(), 100)f = g[0, 0] + (g[0, 1] * x)fig, ax = plt.subplots(figsize=(12,8))ax.plot(x, f, 'r', label='Prediction')ax.scatter(df.Population, df.Profit, label='Traning Data')ax.legend(loc=2)ax.set_xlabel('Population')ax.set_ylabel('Profit')ax.set_title('Predicted Profit vs. Population Size')

Скорость обучения

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

Пример:

Существует градиент с величиной 4,2 и скоростью обучения 0,01, а затем алгоритм градиентного спуска. выберет следующую точку на расстоянии 0,042 от предыдущей.

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

Локальный максимум

Функция f (x) имеет локальный максимум в x = a, и если значение f (a) более значимо, чем все значения f (x) в небольшой окрестности x = a. Итак, в математическом уравнении, показанном ниже:

f (a) ›f (a-h) и f (a)› f (a + h). Где h ›0, тогда a называется точкой локального максимума.

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

Местный минимум

Функция f (x) имеет локальный минимум при x = a. Если значение функции при x = a меньше, чем значение функции в соседних точках x = a. Итак, в математическом уравнении, показанном ниже:

f (a) ‹f (ah) и f (a)‹ f (a + h). где h ›0 , то точка a называется точкой локального минимума.

Важность скорости обучения

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

Если скорость обучения установлена ​​на минимальное значение, то градиентный спуск в конечном итоге достигнет локального минимума, однако это может занять некоторое время [16].

В скорости обучения могут возникать два разных сценария:

  • Высокая скорость обучения
  • Малая скорость обучения

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

Показывает скорость обучения:

def step_gradient(b_current, m_current, points, learning_rate):
    b_gradient = 0
    m_gradient = 0
    n = float(len(points))
    
    for i in range(0, len(points)):
        x = points[i, 0]
        y = points[i, 1]
        b_gradient += -(2/n) * (y - ((m_current * x) + b_current))
        m_gradient += -(2/n) * x * (y - ((m_current * x) + b_current))
        
    latest_b = b_current - (learning_rate * b_gradient)
    latest_m = m_current - (learning_rate * m_gradient)
    return [latest_b, latest_m]

Конвергенция

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

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

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

Выпуклая функция

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

Математически выпуклая функция может быть определена как:

Выпуклая функция - это функция, значение которой в середине каждого интервала в ее области определения не превышает среднего арифметического значений на концах интервала [14].

Таким образом, погружаясь в математическое уравнение:

Имеется интервал [a, b], f (x) - функция, а x1 и x2 - две точки в интервале [a, b] и любая λ, где 0 ‹λ‹ 1. Так,

Основные типы градиентного спуска

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

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

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

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

Ниже описана ситуация с пакетным градиентным спуском:

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

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

Стохастический градиентный спуск имеет следующие моменты:

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

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

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

Мини-пакетный градиентный спуск имеет следующие важные моменты:

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

Заключение

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

Что касается типов градиентного спуска, пакетный градиентный спуск (BGD) является наиболее распространенной формой градиентного спуска, используемой в машинном обучении [12]. Некоторые повседневные алгоритмы с коэффициентами, которые можно оптимизировать с помощью методов градиентного спуска, - это линейная регрессия и логистическая регрессия [11].

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

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Мнения, выраженные в этой статье, принадлежат автору (авторам) и не отражают точку зрения Университета Карнеги-Меллона или других компаний (прямо или косвенно), связанных с автором (авторами). Эти работы не претендуют на то, чтобы стать конечным продуктом, а скорее являются отражением современного мышления, а также катализатором для обсуждения и улучшения.

Все изображения принадлежат авторам, если не указано иное.

Опубликовано через Навстречу AI

Ресурсы

Репозиторий Github.

Внедрение Google colab.

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

[1] MATLAB mesh sic3D.svg, Wikimedia Commons, https://commons.wikimedia.org/wiki/File:MATLAB_mesh_sinc3D.svg

[2] 從 Градиентный спуск к оптимизатору, ITHome, https://ithelp.ithome.com.tw/articles/10218912

[3] Градиентный спуск, Wikimedia Commons, https://commons.wikimedia.org/wiki/File:Gradient_descent.gif

[4] Локальные и глобальные максимумы и минимумы, Википедия, лицензия GFDL 1.2, https://en.wikipedia.org/wiki/Maxima_and_minima#/media/File:Extrema_example_original.svg

[5] Выпуклая функция на интервале, Википедия, лицензия CC BY-SA 3.0, https://en.wikipedia.org/wiki/Convex_function#/media/File:ConvexFunction.svg

[6] Градиент и производная по направлению, Университет штата Орегон, http://sites.science.oregonstate.edu/math/home/programs/undergrad/CalculusQuestStudyGuides/vcalc/grad/grad.html

[7] Гемулла, Райнер и Найкамп, Эрик и Хаас, Питер и Сисманис, Яннис. (2011). Крупномасштабная матричная факторизация с распределенным стохастическим градиентным спуском. Труды Международной конференции ACM SIGKDD по открытию знаний и интеллектуальному анализу данных. 69–77. 10.1145 / 2020408.2020426.

[8] Минимизация функции затрат: градиентный спуск, Суан Кхан Нгуен, На пути к науке о данных, https://towardsdatascience.com/minimizing-the-cost-function-gradient-descent-a5dd6b5350e1

[9] Understanding Learning Rate in Machine Learning, Great Learning Team, https://www.mygreatlearning.com/blog/understanding-learning-rate-in-machine-learning/

[10] Градиентный спуск, Википедия, https://en.wikipedia.org/wiki/Gradient_descent

[11] Градиентный спуск для машинного обучения, Мастерство машинного обучения, https://machinelearningmastery.com/gradient-descent-for-machine-learning/

[12] Мастер алгоритмов машинного обучения, Джейсон Браунли, доктор философии, https://machinelearningmastery.com/master-machine-learning-algorithms/

[13] Нежное введение в мини-пакетный градиентный спуск и как настроить размер пакета, мастерство машинного обучения, https://machinelearningmastery.com/gentle-introduction-mini-batch-gradient-descent-configure-batch-size/

[14] Выпуклая функция, искусство решения проблем, https://artofproblemsolving.com/wiki/index.php/Convex_function

[15] Gradient Descent Unraveled, Манприт Сингх Минхас, https://towardsdatascience.com/gradient-descent-unraveled-3274c895d12d

[16] Градиентный спуск: введение в один из самых популярных алгоритмов машинного обучения, Никлас Донгес, https://builtin.com/data-science/gradient-descent

[17] Градиент (наклон) прямой линии, Math is Fun, https://www.mathsisfun.com/gradient.html