Простая линейная регрессия
Простое уравнение линейной регрессии с одним признаком определяется как:
𝑦=𝑏+𝑤∗𝑥+𝜖
Здесь 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]
Наш результат совпадает до нескольких знаков после запятой, что означает, что мы правильно реализовали наш алгоритм пакетного градиентного спуска.