Градиентный спуск в Python: реализация и варианты

Вот пример алгоритма градиентного спуска, реализованного на Python:

import numpy as np
def gradient_descent(X, y, learning_rate=0.01, num_iterations=100):
    m = len(y)  # number of training examples
    n = X.shape[1]  # number of features
    theta = np.zeros((n, 1))  # initialize parameters to zeros
    cost_history = []
    for iteration in range(num_iterations):
        # Calculate predictions
        predictions = np.dot(X, theta)
        # Calculate error
        error = predictions - y
        # Calculate gradients
        gradients = (1 / m) * np.dot(X.T, error)
        # Update parameters
        theta = theta - learning_rate * gradients
        # Calculate cost
        cost = (1 / (2 * m)) * np.sum(np.square(error))
        cost_history.append(cost)
    return theta, cost_history

В этом коде Xпредставляет матрицу признаков, yпредставляет целевой вектор, learning_rate— скорость обучения алгоритма и num_iterations— количество выполняемых итераций. Функция возвращает оптимизированные параметры thetaи историю значений стоимости cost_historyво время обучения.

Вот еще несколько вариантов и методов градиентного спуска, которые могут оказаться вам полезными:

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

  2. Мини-пакетный градиентный спуск: это компромисс между пакетным градиентным спуском и SGD. Вместо использования всего обучающего набора или одного примера мини-пакетный градиентный спуск использует небольшое случайно выбранное подмножество (мини-пакет) обучающего набора для расчета градиентов.

  3. Импульс: Импульс помогает ускорить градиентный спуск, накапливая часть предыдущих градиентов для определения следующего обновления. Это может помочь преодолеть локальные минимумы и ускорить сходимость.

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

  5. Адаптивная скорость обучения. Такие методы, как AdaGrad, RMSprop и Adam, адаптируют скорость обучения для каждого параметра на основе их исторических градиентов. Эти методы могут улучшить сходимость и обрабатывать объекты разного масштаба.