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

(разница фактического значения и прогнозируемого значения)

По сути, он просто делает то, что мы делали вручную - меняет тета-значения или параметры, бит за битом, пока мы не найдем желаемый минимум.

Понять на примере

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

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

Больше о градиентном приличном, с функцией стоимости, GD также требует производной функции стоимости по одному весу, сделанному для всех весов (dJ / dw). Это значение dJ / dw зависит от вашего выбора функции стоимости. Наиболее распространенной является функция стоимости среднеквадратичной ошибки.

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

Типы алгоритмов градиентного спуска

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

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

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

  • В пакетном градиентном спуске, чтобы вычислить градиент функции стоимости, нам нужно просуммировать все обучающие примеры для каждого шага.
  • Если у нас есть 5 миллионов обучающих выборок, тогда алгоритм градиентного спуска должен суммировать 5 миллионов обучающих выборок для каждой эпохи. Чтобы переместиться на один шаг, мы должны вычислить каждый 5 миллионов раз!
  • В котором обновляется модель после оценки всех обучающих выборок.
  • Обновление модели и, в свою очередь, скорость обучения могут стать очень медленными для больших наборов данных.
  • Реализация кода Python.
def gradientDescent(X, y, theta, alpha, num_iters):
    """
       Performs gradient descent to learn theta
    """
    m = y.size  # number of training examples
    for i in range(num_iters):
        y_hat = np.dot(X, theta)
        theta = theta - alpha * (1.0/m) * np.dot(X.T, y_hat-y)
    return theta

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

  • В стохастическом градиентном спуске мы используем один пример или одну обучающую выборку на каждой итерации вместо использования всего набора данных для суммирования всех для каждого шага.
  • SGD широко используется для обучения больших наборов данных, быстрее вычисляется и может обучаться параллельно.
  • Перед расчетом необходимо случайным образом перемешать обучающие примеры.
  • Частые обновления сразу дают представление о производительности модели, а скорость улучшения часто называют алгоритмом машинного обучения онлайн.
  • Частые обновления могут привести к появлению зашумленного градиентного сигнала. Шумный процесс обучения вниз по градиенту ошибок.
  • Реализация кода Python.
def SGD(f, theta0, alpha, num_iters):
    """ 
       Arguments:
       f -- the function to optimize, it takes a single argument
            and yield two outputs, a cost and the gradient
            with respect to the arguments
       theta0 -- the initial point to start SGD from
       num_iters -- total iterations to run SGD for
       Return:
       theta -- the parameter value after SGD finishes
    """
    start_iter = 0
    theta= theta0
    for iter in xrange(start_iter + 1, num_iters + 1):
        _, grad = f(theta)
        theta = theta - (alpha * grad) # there is NO dot product!
    return theta

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

  • Он разбивает обучающий набор данных на небольшие пакеты, которые используются для вычисления ошибки модели и обновления коэффициентов модели.
  • Пакетные обновления обеспечивают более эффективный в вычислительном отношении процесс, чем стохастический градиентный спуск.
  • Информация об ошибках должна накапливаться в мини-пакетах обучающих примеров, таких как пакетный градиентный спуск.
  • Реализация кода Python.
minibatch_size = 50
n_experiment = 100

# Create placeholder to accumulate prediction accuracy
accs = np.zeros(n_experiment)

for k in range(n_experiment):
    # Reset model
    model = make_network()

    # Train the model
    model = sgd(model, X_train, y_train, minibatch_size)

    y_pred = np.zeros_like(y_test)

    for i, x in enumerate(X_test):
        # Predict the distribution of label
        _, prob = forward(x, model)
        # Get label by picking the most probable one
        y = np.argmax(prob)
        y_pred[i] = y

    # Compare the predictions with the true labels and take the percentage
    accs[k] = (y_pred == y_test).sum() / y_test.size

print('Mean accuracy: {}, std: {}'.format(accs.mean(), accs.std()))

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

  1. Https://machinelearningmaster.com/gentle-introduction-mini-batch-gradient-descent-configure-batch-size/
  2. Сирадж Раваль на Youtube Video
  3. Https://sebastianraschka.com/books.html
  4. Https://www.coursera.org/learn/machine-learning/lecture/rkTp3/cost-function