Машинное обучение, Математика

Исчисление в машинном обучении

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

Введение

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

II. Оптимизация с использованием алгоритма градиентного спуска

II.1 Производные и градиенты

В одномерном измерении мы можем найти максимум и минимум функции, используя производные. Давайте рассмотрим простую квадратичную функцию f (x), как показано ниже.

Предположим, мы хотим найти минимум функции f (x). Используя метод градиентного спуска с некоторым начальным предположением, X обновляется в соответствии с этим уравнением:

где константа eta - это небольшая положительная константа, называемая скоростью обучения. Обратите внимание на следующее:

  • когда X_n ›X_min, f’ (X_n) ›0: это гарантирует, что X_n + 1 меньше X_n. Поэтому мы делаем шаги в левом направлении, чтобы свести к минимуму.
  • когда X_n ‹X_min, f’ (X_n) ‹0: это гарантирует, что X_n + 1 больше, чем X_n. Следовательно, мы предпринимаем шаги в правильном направлении, чтобы достичь X_min.

Приведенное выше наблюдение показывает, что не имеет значения, какова первоначальная догадка, алгоритм градиентного спуска всегда найдет минимум. Сколько шагов оптимизации потребуется для достижения X_min, зависит от того, насколько верным будет исходное предположение. Иногда, если первоначальное предположение или скорость обучения не были тщательно выбраны, алгоритм может полностью упустить минимум. Это часто называют «перерегулированием». Как правило, можно обеспечить сходимость, добавив критерий сходимости, например:

где эпсилон - небольшое положительное число.

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

Как и в одномерном случае, можно обеспечить сходимость, добавив критерий сходимости, например:

II.2 Практический пример: построение простой оценки регрессии

В этом подразделе мы описываем, как можно построить простую оценку Python для выполнения линейной регрессии с использованием метода градиентного спуска. Предположим, у нас есть одномерный набор данных, содержащий одну функцию (X) и результат (y), и предположим, что в наборе данных N наблюдений:

Линейная модель, соответствующая данным, представлена ​​как:

где w0 и w1 - веса, которые алгоритм получает во время обучения.

II.3 Алгоритм градиентного спуска

Если предположить, что ошибка в модели независима и нормально распределена, то функция правдоподобия задается как:

Чтобы максимизировать функцию правдоподобия, мы минимизируем сумму квадратов ошибок (SSE) по отношению к w0 и w1:

Целевая функция или наша функция SSE часто минимизируется с помощью алгоритма приближения градиентного спуска (GDA). В методе GDA веса обновляются в соответствии со следующей процедурой:

т.е. в направлении, противоположном градиенту. Здесь eta - небольшая положительная константа, называемая скоростью обучения. Это уравнение может быть записано в виде компонентов как:

II.4 Реализация Python

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
class GradientDescent(object):
    """Gradient descent optimizer.
    Parameters
    ------------
    eta : float
        Learning rate (between 0.0 and 1.0)
    n_iter : int
        Passes over the training dataset.
        
    Attributes
    -----------
    w_ : 1d-array
        Weights after fitting.
    errors_ : list
        Error in every epoch.
    """    def __init__(self, eta=0.01, n_iter=10):
        self.eta = eta
        self.n_iter = n_iter
        
    def fit(self, X, y):
        """Fit the data.
        
        Parameters
        ----------
        X : {array-like}, shape = [n_points]
        Independent variable or predictor.
        y : array-like, shape = [n_points]
        Outcome of prediction.
        Returns
        -------
        self : object
        """
        self.w_ = np.zeros(2)
        self.errors_ = []
        
        for i in range(self.n_iter):
            errors = 0
            for j in range(X.shape[0]):
                self.w_[1:] += self.eta*X[j]*(y[j] - self.w_[0] -                     self.w_[1]*X[j])
                self.w_[0] += self.eta*(y[j] - self.w_[0] - self.w_[1]*X[j])
                errors += 0.5*(y[j] - self.w_[0] - self.w_[1]*X[j])**2
            self.errors_.append(errors)
        return self    
def predict(self, X):
        """Return predicted y values"""
        return self.w_[0] + self.w_[1]*X

II.5 Применение базовой регрессионной модели

а) Создать набор данных

np.random.seed(1)
X=np.linspace(0,1,10)
y = 2*X + 1
y = y + np.random.normal(0,0.05,X.shape[0])

б) Подгонка и прогнозирование

gda = GradientDescent(eta=0.1, n_iter=100)
gda.fit(X,y)
y_hat=gda.predict(X)

c) Вывод графика

plt.figure()
plt.scatter(X,y, marker='x',c='r',alpha=0.5,label='data')
plt.plot(X,y_hat, marker='s',c='b',alpha=0.5,label='fit')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()

г) Рассчитайте значение R-квадрат

R_sq = 1-((y_hat - y)**2).sum()/((y-np.mean(y))**2).sum()
R_sq
0.991281901588877

III. Резюме и заключение

Таким образом, мы показали, как простая оценка линейной регрессии с использованием алгоритма GDA может быть построена и реализована на Python. За каждой моделью машинного обучения стоит алгоритм оптимизации, который в значительной степени опирается на вычисления. Если вы хотите увидеть, как алгоритм GDA используется в реальном алгоритме классификации машинного обучения, см. Следующий репозиторий Github.

Дополнительные ресурсы по науке о данных / машинному обучению

Сколько математики мне нужно в науке о данных?

Учебная программа по науке о данных

5 лучших степеней для входа в науку о данных

Теоретические основы науки о данных - мне нужно заботиться или просто сосредоточиться на практических навыках?

Планирование проекта машинного обучения

Как организовать свой проект по науке о данных

Инструменты повышения производительности для крупномасштабных проектов в области науки о данных

Портфолио Data Science более ценно, чем резюме

С вопросами и запросами пишите мне: [email protected]