Весы взрываются в полиномиальной регрессии с градиентным спуском - PullRequest
1 голос
/ 22 января 2020

Я только начинаю изучать машинное обучение и пытаюсь подогнать полином к данным, полученным с помощью синусоиды. Я знаю, как сделать это в закрытом виде, но я пытаюсь заставить его работать с градиентным спуском тоже. Тем не менее, мои веса взрываются до безумных высот, даже с очень большим штрафным сроком. Что я делаю неправильно? Вот код:

import numpy as np
import matplotlib.pyplot as plt
from math import pi

N = 10
D = 5

X = np.linspace(0,100, N)
Y = np.sin(0.1*X)*50
X = X.reshape(N, 1)


Xb = np.array([[1]*N]).T
for i in range(1, D):
    Xb = np.concatenate((Xb, X**i), axis=1)

#Randomly initializie the weights
w = np.random.randn(D)/np.sqrt(D)

#Solving in closed form works
#w = np.linalg.solve((Xb.T.dot(Xb)),Xb.T.dot(Y))
#Yhat = Xb.dot(w)

#Gradient descent
learning_rate = 0.0001
for i in range(500):
    Yhat = Xb.dot(w)
    delta = Yhat - Y
    w = w - learning_rate*(Xb.T.dot(delta) + 100*w)

print('Final w: ', w)
plt.scatter(X, Y)
plt.plot(X,Yhat)
plt.show()

Спасибо!

1 Ответ

0 голосов
/ 22 января 2020

При обновлении тета вы должны взять тета и вычесть его из веса обучения, умноженного на производную от тета , деленную на размер тренировочного набора. Вы также должны разделить ваш срок пенсии на установленный размер обучения. Но главная проблема в том, что ваша скорость обучения слишком велика. Для будущей отладки полезно напечатать стоимость, чтобы увидеть, работает ли градиентный спуск и слишком мала ли скорость обучения или нет.

Ниже приведен код для полинома 2-й степени, который был найден оптимальным тэты (как вы видите, скорость обучения действительно мала). Я также добавил функцию стоимости.

N = 2
D = 2

#Gradient descent
learning_rate = 0.000000000001
for i in range(200):
    Yhat = Xb.dot(w)
    delta = Yhat - Y
    print((1/N) * np.sum(np.dot(delta, np.transpose(delta))))

    w = w - learning_rate*(np.dot(delta, Xb)) * (1/N)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...