@NikitaDen

Почему не сходится градиентный спуск?

Добрый день! При реализации линейной регрессии возникла проблема: при градиентном спуске loss увеличивается причем на несколько порядков за раз. Loss - MSE, градиентный спуск - обычный. В качестве датасета выбрал California Housing dataset . При написании кода опирался на статью
Код класса
class LinearRegression():

  w = None
  alpha = None

  def __init__(self, lr, E=20):
    self.lr = lr
    self.w = np.zeros(X.shape[1] + 1)
    self.E = E

  def loss(self, X, y):
    return np.sum((y - X @ self.w) ** 2) / X.shape[0]

  def grad(self, X, y):
    print(self.w)
    grad_basic = np.transpose(X) @ (X @ self.w - y)    
    assert grad_basic.shape == (X.shape[1],) , "Градиенты должны быть столбцом из k_features + 1 элементов"
    return grad_basic / X.shape[0]

  def sgd(self, X, y, E=20):
    X = np.concatenate((np.ones((X.shape[0], 1)), X), axis = 1)
    print(X)
    self.loss_arr = [self.loss(X, y)]
    for _ in tqdm(range(E)):
      if abs(self.loss_arr[-1]) < 0.1:
        break
      self.w -= self.lr * self.grad(X, y)
      self.loss_arr.append(self.loss(X, y))

  def fit(self, X, y):
    self.sgd(X, y, self.E)

  def get_params(self):
    return self.w

  def get_loss(self):
    return self.loss_arr

  def predict(self, X):
    X = np.concatenate((np.ones((X.shape[0], 1)), X), axis = 1)
    return X.dot(self.w)

Вот так ведет себя loss:
5.610483198987253,
71185949512.90901,
1.9667789518677714e+21,
5.433978711941763e+31,
1.5013443485392878e+42...

Остальной код по загрузке датасета находится в ноутбуке
Подскажите, пожалуйста, где я совершил ошибку
  • Вопрос задан
  • 142 просмотра
Пригласить эксперта
Ответы на вопрос 1
@SeptiM
Попробуй градиент нормализовать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы