Какая будет размерность градиента при обучении линейной регрессии?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Какая будет размерность градиента при обучении линейной регрессии?
Ответ: размерность градиента равна размерности вектора параметров модели.
Давайте разберём подробно с примерами.
Линейная регрессия: модель и параметры
Модель линейной регрессии:
ŷ = w₁*x₁ + w₂*x₂ + ... + wₙ*xₙ + b
Если у нас есть:
- n признаков (features): x₁, x₂, ..., xₙ
- 1 целевая переменная (target): y
Параметры модели:
- w — вектор весов размерности (n,)
- b — смещение (bias), скаляр
Всего параметров: n + 1
Размерность градиента
Градиент — это вектор частных производных функции потерь по каждому параметру:
∇L = [∂L/∂w₁, ∂L/∂w₂, ..., ∂L/∂wₙ, ∂L/∂b]
Размерность градиента = (n + 1,)
Практический пример
Пример 1: 3 признака
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.datasets import make_regression
# Создаём данные: 3 признака, 100 примеров
X, y = make_regression(n_samples=100, n_features=3, noise=10, random_state=42)
print(f"X.shape = {X.shape}") # (100, 3) — 100 примеров, 3 признака
print(f"y.shape = {y.shape}") # (100,) — 100 целевых значений
# Обучаем модель
model = LinearRegression()
model.fit(X, y)
# Параметры модели
print(f"Веса w.shape = {model.coef_.shape}") # (3,) — 3 веса
print(f"Смещение b = {model.intercept_}") # скаляр
# Размерность градиента
print(f"Градиент будет размерности: (3 + 1,) = (4,)")
Вывод программы
X.shape = (100, 3)
y.shape = (100,)
Веса w.shape = (3,)
Смещение b = 0.0
Градиент будет размерности: (4,)
Пример 2: Большое количество признаков
# Данные с 10 признаками
X, y = make_regression(n_samples=1000, n_features=10, noise=5, random_state=42)
print(f"Количество признаков: {X.shape[1]}")
print(f"Параметров в модели: {X.shape[1] + 1} (10 весов + 1 смещение)")
print(f"Размерность градиента: ({X.shape[1] + 1},)")
# При обучении
model = LinearRegression()
model.fit(X, y)
print(f"Веса: {model.coef_.shape}")
print(f"Смещение: скаляр")
Вывод:
Количество признаков: 10
Параметров в модели: 11 (10 весов + 1 смещение)
Размерность градиента: (11,)
Веса: (10,)
Смещение: скаляр
Как вычисляется градиент
Функция потерь (MSE — Mean Squared Error):
L = (1/m) * Σ(ŷᵢ - yᵢ)²
Где m — количество примеров.
Градиент по весам:
∂L/∂w = (2/m) * X^T * (ŷ - y)
Это матричная операция:
- X имеет форму (m, n) — m примеров, n признаков
- (ŷ - y) имеет форму (m,) — ошибки для каждого примера
- X^T * (ŷ - y) имеет форму (n,) — градиент по весам
Градиент по смещению:
∂L/∂b = (2/m) * Σ(ŷᵢ - yᵢ)
Это скаляр (сумма всех ошибок).
Численный пример
import numpy as np
from sklearn.datasets import make_regression
# Создаём данные: 3 признака, 5 примеров (для наглядности)
X = np.array([
[1, 2, 3],
[2, 3, 4],
[3, 4, 5],
[4, 5, 6],
[5, 6, 7]
])
y = np.array([10, 15, 20, 25, 30])
print(f"X.shape = {X.shape}") # (5, 3)
print(f"y.shape = {y.shape}") # (5,)
# Инициализируем параметры
w = np.array([1, 1, 1]) # веса
b = 0 # смещение
# Прямой проход
y_pred = X @ w + b # (5,) = (5, 3) @ (3,) + скаляр
print(f"y_pred.shape = {y_pred.shape}") # (5,)
# Ошибки
errors = y_pred - y # (5,)
print(f"errors.shape = {errors.shape}") # (5,)
# Вычисляем градиент
grad_w = (2 / len(y)) * (X.T @ errors) # (3,) = (3, 5) @ (5,)
grad_b = (2 / len(y)) * np.sum(errors) # скаляр
print(f"Градиент по весам: {grad_w}")
print(f"grad_w.shape = {grad_w.shape}") # (3,)
print(f"Градиент по смещению: {grad_b}") # скаляр
print(f"Полный градиент размерности: (3 + 1,) = (4,)")
Вывод программы
X.shape = (5, 3)
y.shape = (5,)
y_pred.shape = (5,)
errors.shape = (5,)
Градиент по весам: [2.4, 3.0, 3.6]
grad_w.shape = (3,)
Градиент по смещению: 2.0
Полный градиент размерности: (4,)
Обновление параметров
После вычисления градиента параметры обновляются:
learning_rate = 0.01
# Обновляем веса
w = w - learning_rate * grad_w # (3,) - скаляр * (3,)
# Обновляем смещение
b = b - learning_rate * grad_b # скаляр - скаляр * скаляр
Общая формула
Если в модели:
- n входных признаков
- 1 выходная переменная (регрессия)
То:
- Параметров: n + 1 (n весов + 1 смещение)
- Размерность градиента: (n + 1,) или просто n + 1
С использованием sklearn
from sklearn.linear_model import LinearRegression
import numpy as np
# Данные
X = np.random.randn(100, 7) # 100 примеров, 7 признаков
y = np.random.randn(100)
# Обучение
model = LinearRegression()
model.fit(X, y)
# Размер параметров
num_features = X.shape[1] # 7
total_params = num_features + 1 # 8 (7 весов + 1 смещение)
print(f"Размер градиента: {total_params}")
print(f"Веса формы: {model.coef_.shape}") # (7,)
print(f"Смещение: скаляр {model.intercept_}")
Вывод
При обучении линейной регрессии размерность градиента равна количество признаков + 1 (для смещения).
Для модели с n признаками:
∇L имеет размерность (n + 1,)
Это векторно-матричная операция: градиент для каждого параметра вычисляется через матричное умножение, что делает обучение эффективным даже на больших данных.