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

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

param = param - learning_rate * gradients

где param — параметр модели, learning_rate — гиперпараметр, управляющий размером шага, а gradients — средний градиент функции стоимости по всему обучающему набору.

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

param = param - learning_rate * gradients

где param — параметр модели, learning_rate — гиперпараметр, управляющий размером шага, а gradients — градиент функции стоимости для одного обучающего примера.

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

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

import numpy as np

# Gradient Descent
def gradient_descent(x, y, theta, alpha, num_iters):
    m = len(y)
    for i in range(num_iters):
        h = np.dot(x, theta)
        loss = h - y
        gradient = np.dot(x.T, loss) / m
        theta = theta - alpha * gradient
    return theta

# Stochastic Gradient Descent
def stochastic_gradient_descent(x, y, theta, alpha, num_iters):
    m = len(y)
    for i in range(num_iters):
        for j in range(m):
            h = np.dot(x[j], theta)
            loss = h - y[j]
            gradient = x[j].T * loss
            theta = theta - alpha * gradient
    return theta

В приведенном выше примере функция gradient_descent принимает входные данные x, целевые данные y, начальные параметры theta, скорость обучения alpha и количество итераций num_iters в качестве входных данных. Он применяет правило обновления для GD, используя весь обучающий набор для вычисления градиентов. С другой стороны, функция stochastic_gradient_descent также принимает те же входные данные, но вместо использования всего обучающего набора она использует один пример или небольшое подмножество обучающего набора для вычисления градиентов на каждой итерации.

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

Об авторе: меня зовут Дхирендра Кумар Чоудхари, специалист по данным в IHX Private Limited. если у вас есть какие-либо вопросы, пожалуйста, свяжитесь со мной по linkedin или по электронной почте [email protected]