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

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

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

Формула градиентного спуска в машинном обучении выглядит следующим образом:

где θ – вектор параметров, α – скорость обучения, J – функция потерь, а ∇ – оператор градиента.

Алгоритм градиентного спуска работает путем итеративного обновления параметров θ в направлении отрицательного градиента функции потерь J. Скорость обучения α контролирует размер предпринимаемых шагов. Более высокая скорость обучения приведет к более быстрой сходимости, но также может привести к превышению алгоритмом минимума. Меньшая скорость обучения приведет к более медленной сходимости, но с меньшей вероятностью выйдет за пределы минимума.

Реализация шага функции градиентного спуска в python приведена ниже:

#implementation of function for gradient descent
def GradientDescent(X_train, y_train, w, b, learning_rate):
    """performs on iteration of gradient descent from calculating the loss to updating the weights

    Args:
        X_train (_type_): numpy array containing training data
        y_train (_type_): one dimensional numpy array of training outputs
        w (_type_): updated weights - numpy array
        b (_type_): bias - integer
        learning_rate (_type_): a constant; to control the rate of updating the weights 

    Returns:
        w: updated weights
        b: updated bias
        loss: new loss calculated 
    """
    #calculating the hypothesis function calculating y_predicted
    y_pred = np.dot(X_train, w) + b
    y_pred = 1 / (1 + np.exp(-y_pred))

    #calculation of loss
    loss = (1/2) * np.sum(np.dot((y_train - y_pred).T, (y_train - y_pred))) / len(y_train -  y_pred)

    #calculating the differentiation to the loss 
    db=(np.sum(y_pred - y_train))/len(y_train)
    dw=(np.dot(X_train.T,(y_pred - y_train)))/len(y_train)

    #upating the weights and the bias
    w = w - learning_rate * dw
    b = b - learning_rate * db

    return w, b, loss 

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



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

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

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

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

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

Существует множество различных вариантов градиентного спуска, и выбор алгоритма зависит от конкретной оптимизируемой функции. Некоторые распространенные варианты градиентного спуска включают:

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