Какова формула градиента для MSE по весам
Что проверяют
Умеете ли вы вывести градиент сами, в матричной форме и без ошибки в знаке, а не просто вспомнить формулу. Раз вопрос из блока с кодом, почти наверняка попросят записать градиентный спуск на NumPy без циклов. Следом спрашивают про нормальное уравнение и регуляризацию.
Как отвечать
Для линейной модели ŷ = Xw, где X матрица размера n×d, функция потерь:
L(w) = (1/n)·‖y − Xw‖²
По правилу цепочки производная квадрата даёт множитель 2, производная Xw по w даёт Xᵀ:
∇L = (2/n)·Xᵀ(Xw − y)
Поэлементно это (2/n)·Σ (ŷᵢ − yᵢ)·xᵢ. Если свободный член b отдельно, его производная равна (2/n)·Σ (ŷᵢ − yᵢ), но проще добавить в X столбец единиц.
Шаг спуска: w ← w − η·∇L, где η это скорость обучения. На NumPy: r = X @ w, затем r -= y и grad = 2 / n * X.T @ r, форма результата (d,), как у w.
Что стоит добавить:
- выпуклость: гессиан
(2/n)·XᵀXположительно полуопределён, поэтому любой локальный минимум глобальный; - нормальное уравнение: приравняв градиент к нулю, получаем
XᵀXw = Xᵀy. Решают его черезnp.linalg.lstsqилиnp.linalg.solve, а не явным обращением: при почти вырожденнойXᵀXобращение численно неустойчиво; - L2-регуляризация: к градиенту добавляется
2λw; - множитель 1/2: часто берут
(1/2n)·‖y − Xw‖², чтобы двойка сократилась. Минимум тот же, меняется только масштаб шага.
Где спотыкаются
Путают знак. Записи −(2/n)·Xᵀ(y − Xw) и (2/n)·Xᵀ(Xw − y) равны, но если взять остаток из одной, а знак из другой, код пойдёт вверх по функции потерь.
Ошибаются с формами в NumPy: y формы (n, 1) и предсказание формы (n,) при вычитании дают матрицу (n, n), и градиент тихо получается неверным. Держите векторы одной формы.
Забывают про 1/n или про масштаб признаков. Без усреднения шаг зависит от размера батча, а без стандартизации признаков спуск идёт зигзагом и сходится медленно.