SGD означает стохастический градиентный спуск. Это алгоритм оптимизации, используемый для минимизации функции стоимости модели машинного обучения. Ключевое различие между SGD и пакетным градиентным спуском (BGD) заключается в том, что вместо использования всего набора данных для вычисления градиента на каждом шаге SGD случайным образом выбирает одну точку данных или небольшое подмножество точек данных (также называемое мини-пакетом) для вычисления. градиент.
В SGD функция стоимости вычисляется для одной точки данных, и параметры модели обновляются соответствующим образом. Процесс повторяется для всех точек данных в наборе данных или случайно выбранном мини-пакете. Это делает SGD намного быстрее, чем BGD, особенно для больших наборов данных, поскольку он вычисляет градиенты для подмножества точек данных, а не для всего набора данных.
Одним из ключевых преимуществ SGD является то, что он может помочь модели избежать застревания в локальном минимуме, что может произойти с BGD. С SGD параметры модели обновляются чаще, а расчет градиента включает случайную точку данных, что вносит больше случайности в процесс оптимизации, и оптимизатор может уйти от субоптимального локального минимума.
Однако, поскольку SGD обновляет параметры, используя только одну точку данных или небольшое подмножество точек данных, это может привести к более зашумленным обновлениям по сравнению с BGD. Это может замедлить сходимость и привести к колебаниям или нестабильности в процессе оптимизации. Чтобы смягчить эту проблему, скорость обучения в SGD часто снижается с течением времени, чтобы сгладить обновления.
В целом, SGD — это мощный алгоритм оптимизации, который широко используется в глубоком обучении, особенно для крупномасштабных наборов данных, благодаря его вычислительной эффективности и способности обрабатывать зашумленные данные. Однако для обеспечения конвергенции и стабильности требуется тщательная настройка скорости обучения и размера мини-пакета.
Сравнение времени между SGD и BGD
Если мы сравним SGD и BGD с одинаковым количеством эпох и предположим, что мы используем одно и то же оборудование и одинаковую скорость обучения, верно, что SGD (с размером мини-пакета 1) будет выполнять больше вычислений, чем BGD для каждого эпоха. Это связано с тем, что в SGD нам нужно вычислить градиент для каждой отдельной точки данных, а в BGD мы вычисляем градиент для всего набора данных.
Например, если у нас есть 10 000 точек данных и мы обучаем 10 эпох, то с SGD мы выполним 100 000 (10 000 x 10) вычислений, чтобы обновить параметры модели. Напротив, с BGD мы выполним только 10 расчетов (1 расчет на эпоху) для обновления параметров модели.
Основываясь на предыдущих объяснениях, если мы сравним SGD и BGD с одинаковым количеством эпох и предположим, что аппаратное обеспечение и скорость обучения одинаковы, то SGD может занять больше времени, чем BGD, для завершения процесса обучения. Это связано с тем, что SGD выполняет больше вычислений за эпоху, чем BGD, из-за того, что он чаще обновляет параметры модели, используя меньшие пакеты данных.
Однако важно отметить, что фактическое время работы алгоритмов зависит от многих факторов, таких как размер набора данных, сложность модели, детали реализации и выбор гиперпараметров. Поэтому в некоторых случаях возможно, что SGD может быть быстрее, чем BGD, даже при том же количестве эпох.
В целом выбор между SGD и BGD зависит от конкретной проблемы и компромисса между скоростью сходимости и вычислительной эффективностью. SGD часто предпочтительнее для больших наборов данных или сложных моделей из-за его способности чаще обновлять параметры модели и его масштабируемости для параллельных и распределенных вычислительных сред. BGD, с другой стороны, может быть предпочтительнее для небольших наборов данных или более простых моделей, где более важна вычислительная эффективность.
from sklearn.datasets import load_diabetes import numpy as np from sklearn.linear_model import LinearRegression from sklearn.metrics import r2_score from sklearn.model_selection import train_test_split import time X,y = load_diabetes(return_X_y=True) print(X.shape) print(y.shape) >>> (442, 10) >>> (442,) X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=2) reg = LinearRegression() reg.fit(X_train,y_train) LinearRegression() print(reg.coef_) print(reg.intercept_) >>> [ -9.16088483 -205.46225988 516.68462383 340.62734108 -895.54360867 561.21453306 153.88478595 126.73431596 861.12139955 52.41982836] >>> 151.88334520854633 y_pred = reg.predict(X_test) r2_score(y_test,y_pred) >>> 0.4399387660024645 class SGDRegressor: def __init__(self,learning_rate=0.01,epochs=100): self.coef_ = None self.intercept_ = None self.lr = learning_rate self.epochs = epochs def fit(self,X_train,y_train): # init your coefs self.intercept_ = 0 self.coef_ = np.ones(X_train.shape[1]) for i in range(self.epochs): for j in range(X_train.shape[0]): idx = np.random.randint(0,X_train.shape[0]) y_hat = np.dot(X_train[idx],self.coef_) + self.intercept_ intercept_der = -2 * (y_train[idx] - y_hat) self.intercept_ = self.intercept_ - (self.lr * intercept_der) coef_der = -2 * np.dot((y_train[idx] - y_hat),X_train[idx]) self.coef_ = self.coef_ - (self.lr * coef_der) print(self.intercept_,self.coef_) def predict(self,X_test): return np.dot(X_test,self.coef_) + self.intercept_ sgd = SGDRegressor(learning_rate=0.01,epochs=40) start = time.time() sgd.fit(X_train,y_train) print("The time taken is",time.time() - start) >>> 157.2641767094034 [ 58.34618831 -41.65635944 314.02875897 219.47021721 30.2641263 -8.98591625 -165.98040412 132.42543708 294.42536821 122.71528461] >>> The time taken is 0.17459607124328613 y_pred = sgd.predict(X_test) r2_score(y_test,y_pred) >>> 0.4205755931585481 from sklearn.linear_model import SGDRegressor reg = SGDRegressor(max_iter=100,learning_rate='constant',eta0=0.01) reg.fit(X_train,y_train) C:\Users\91842\anaconda3\lib\site-packages\sklearn\linear_model\_stochastic_gradient.py:1220: ConvergenceWarning: Maximum number of iteration reached before convergence. Consider increasing max_iter to improve the fit. warnings.warn("Maximum number of iteration reached before " SGDRegressor(learning_rate='constant', max_iter=100) y_pred = reg.predict(X_test) r2_score(y_test,y_pred) >>> 0.43059547063734904
Отображение конвергенции
Стохастический градиентный спускVSПакетный градиентный спуск
В (SGD) вы можете увидеть какое-то случайное поведение.
В случае SGD функция стоимости колеблется более случайным образом на протяжении итераций, поскольку алгоритм обновляет параметры модели на основе одного примера за раз. Это можно представить как более неравномерное схождение линии к оптимальным значениям параметров модели. Однако в конечном итоге колебания могут усредниться за несколько итераций, что приведет к сходимости к минимуму функции стоимости.
В случае BGD функция стоимости плавно и постепенно уменьшается на протяжении итераций, поскольку алгоритм выполняет шаги в направлении наибольшего градиента функции стоимости. Это можно представить как плавное и постепенное схождение линии к оптимальным значениям параметров модели.
Стохастический градиентный спуск (SGD) — популярный алгоритм оптимизации, используемый в машинном обучении для обучающих моделей. SGD особенно полезен при работе с большими наборами данных или сложными моделями, где вычисление градиента по всему набору данных может быть непрактичным или неэффективным.
Вот некоторые ситуации, когда SGD может быть хорошим выбором:
- Большие наборы данных. При работе с большими наборами данных вычисление градиента по всему набору данных может потребовать значительных вычислительных ресурсов. В таких случаях SGD можно использовать для обновления параметров модели с использованием мини-пакета точек данных, что может значительно сократить время вычислений.
- Задачи невыпуклой оптимизации. В задачах невыпуклой оптимизации может быть много локальных минимумов, что затрудняет поиск глобального минимума алгоритмами оптимизации. Использование SGD может помочь оптимизатору уйти от локальных оптимумов и быстрее сходиться к глобальному минимуму.
- Онлайн-обучение. При онлайн-обучении данные доступны в виде потока, и модель необходимо обновлять в режиме реального времени. В таких случаях SGD можно использовать для обновления параметров модели с использованием одной точки данных за раз, что делает его идеальным для сценариев онлайн-обучения.
- Регуляризация: SGD также можно использовать для реализации методов регуляризации, таких как регуляризация L1 и L2, которые могут помочь предотвратить переоснащение и повысить эффективность обобщения модели.
планировщик скорости обучения
График скорости обучения. Использование фиксированной скорости обучения может быть неоптимальным, поскольку оптимальная скорость обучения может меняться во время обучения. Решение. Используйте график скорости обучения, который постепенно снижает скорость обучения с течением времени, например, уменьшая скорость обучения в 2 раза после фиксированного количества эпох.
вот более подробное сравнение сходимости пакетного градиентного спуска (BGD), стохастического градиентного спуска (SGD) и мини-пакетного градиентного спуска (MBGD):
БГД:
- Вычисляет градиент функции стоимости по всему обучающему набору.
- Обновляет параметры модели один раз за итерацию.
- Сходится медленнее, но неуклонно к минимуму функции стоимости.
- Может быть более стабильным, чем SGD и MBGD, но для сходимости может потребоваться больше времени.
- Требует больше памяти и вычислительных ресурсов, чем SGD и MBGD.
«Понимание градиентного спуска: интуиция, математическая формулировка и вывод
Batch-gradient-descentmedium.com»
сингапурский доллар:
- Вычисляет градиент функции стоимости для одного обучающего примера.
- Обновляет параметры модели один раз для каждого примера.
- Сходится быстрее, но с большим количеством колебаний к минимуму функции стоимости.
- Может быть более чувствительным к выбору скорости обучения и случайности данных.
- Требует меньше памяти и вычислительных ресурсов, чем BGD.
МБГД:
- Вычисляет градиент функции стоимости для небольших случайных подмножеств обучающих данных (мини-пакетов).
- Обновляет параметры модели один раз за мини-пакет.
- Предлагает компромисс между скоростью SGD и стабильностью BGD.
- Сходится быстрее, чем BGD, и с меньшими колебаниями, чем SGD.
- Требует меньше памяти и вычислительных ресурсов, чем BGD, но больше, чем SGD.