Простая линейная регрессия

Простое уравнение линейной регрессии с одним признаком определяется как:

𝑦=𝑏+𝑤∗𝑥+𝜖

Здесь w — коэффициент, b — член пересечения, а ϵ — шум.

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

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

Этапы реализации градиентного спуска
Шаг 1 – Вычислить потери
Шаг 2 – Вычислить градиент
Шаг 3 – Обновить параметры
Шаг 4 – повторить Шаг 1–3

Шаг 1: - Рассчитайте убыток

Для регрессионной задачи потери определяются среднеквадратичной ошибкой (MSE).

Шаг 2: - Вычислите градиент

Градиент — это вектор с частными производными функции для компонентов.

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

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

В нашем случае нас интересует, насколько меняются наши потери MSE, когда мы изменяем один из двух наших параметров.

Шаг 3: - Обновите параметры

Теперь мы обновим параметры, используя градиенты, чтобы минимизировать потери. Но градиент указывает направление наибольшего подъема, поэтому мы умножим его на -1.

Шаг 4: - Повторить

Теперь мы будем использовать обновленные параметры и снова начнем с шага 1. Мы повторим этот процесс для нескольких эпох. Это также известно как обучение модели.

Эпоха завершается, когда все точки данных используются для расчета потерь.

Варианты градиентного спуска

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

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

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

Теперь пришло время реализовать нашу модель линейной регрессии с использованием пакетного градиентного спуска.

Генерация синтетических данных

Используя приведенное выше уравнение, мы создадим некоторые синтетические данные с w = 2 и b = 1 и некоторым случайным шумом.

import numpy as np
np.random.seed(42)

x = np.random.randn(100,1)
y = 1 + 2*x + np.random.randn(100,1)

Инициализировать параметры (w и b) и гиперпараметр (скорость обучения)

Поэтому мы инициализируем обучаемые параметры w и b некоторыми случайными значениями и попытаемся найти правильное значение, минимизируя функцию потерь. Значение гиперпараметра, то есть скорость обучения, фиксировано.

w = np.random.randn(1)
b = np.random.randn(1)
lr = 0.001

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

def gradient_descent(x, y, w, b, lr):
    
    #compute the loss
    yhat =  b + w*x
    error = (y-yhat)
    loss  = (error*2).mean()
    
    #compute the gradients
    b_grad = -2*error.mean()
    w_grad = -2*(x*error).mean()
    
    #update the parameters
    b = b - lr * b_grad
    w = w - lr * w_grad
    return w,b

Обучение

 
for epoch in range(5000):
    w,b = gradient_descent(x, y, w, b, lr)
print(b,w)
[1.00716235] [1.85616176]

Давайте сравним наши результаты с линейной регрессией scikit-learn.

from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(x, y)
print(lr.intercept_, lr.coef_[0])
[1.00742783] [1.85674284]

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