Первый градиентный спуск: как нормализовать X и Y? - PullRequest
0 голосов
/ 29 мая 2019

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

Может быть, это потому, что я не нормализовал свои X и Y, но я не знаю, как это сделать ... Я пробовал способ с sklearn StandardScaler, но получил ошибку. Я не знаю, что происходит не так.

Я использую Tensorflow 1.3.0 и jupyter.

Вот мой код:

    #from sklearn.preprocessing import StandardScaler
    #scaler=StandardScaler()

    n_epochs=1000
    learning_rate=0.01
    X=tf.constant(housing_data_plus_bias,dtype=tf.float32,name="X")
    #X_norm=scaler.fit_transform(X)
    Y=tf.constant(housing.target.reshape(-1,1),dtype=tf.float32,name="Y")
    theta=tf.Variable(tf.random_uniform([n+1,1],-1.0,1.0),name="theta")
    y_pred=tf.matmul(X,theta,name="predictions")  #eq 1.4
    error=y_pred - Y

    mse=tf.reduce_mean(tf.square(error),name="mse") #eq 1.5
    gradients= (2/(m*mse) ) * tf.matmul(tf.transpose(X),error) 
    training_op = tf.assign(theta,theta - learning_rate * gradients)

    init=tf.global_variables_initializer()

    with tf.Session() as sess:
        sess.run(init)
        print("   Y   ")
        print(Y.eval())
        print("   X   ")
        print(X.eval())
        for epoch in range(n_epochs):
            if epoch%100==0:
                print("Epoch",epoch,"MSE =",mse.eval())
            sess.run(training_op)

        best_theta=theta.eval()

и вот что я получаю:

Y   
[[4.526]
 [3.585]
 [3.521]
 ...
 [0.923]
 [0.847]
 [0.894]]
   X   
[[   1.           8.3252      41.        ...    2.5555556   37.88
  -122.23     ]
 [   1.           8.3014      21.        ...    2.1098418   37.86
  -122.22     ]
 [   1.           7.2574      52.        ...    2.80226     37.85
  -122.24     ]
 ...
 [   1.           1.7         17.        ...    2.3256352   39.43
  -121.22     ]
 [   1.           1.8672      18.        ...    2.1232092   39.43
  -121.32     ]
 [   1.           2.3886      16.        ...    2.616981    39.37
  -121.24     ]]
Epoch 0 MSE = 511820.7
Epoch 100 MSE = 775760.0
Epoch 200 MSE = 2181710.8
Epoch 300 MSE = 115924.266
Epoch 400 MSE = 7663049.0
Epoch 500 MSE = 2283198.2
Epoch 600 MSE = 586127.75
Epoch 700 MSE = 7143360.5
Epoch 800 MSE = 15567712.0
Epoch 900 MSE = 2333040.0

Но что не так? Я думал, что нормализация позволит только сходиться быстрее.

1 Ответ

0 голосов
/ 29 мая 2019

Судя по виду вашего кода, вы не используете оптимизатор для алгоритма градиентного спуска. Я предлагаю использовать оптимизатор и затем проверить MSE снова. Теоретически, это должно улучшиться. Вот пример одного оптимизатора Gradient Descent,

n_epochs=1000
learning_rate=0.01
optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate) # Play around with learning rates and check the accuracy
X=tf.constant(housing_data_plus_bias,dtype=tf.float32,name="X")
#X_norm=scaler.fit_transform(X)
Y=tf.constant(housing.target.reshape(-1,1),dtype=tf.float32,name="Y")
theta=tf.Variable(tf.random_uniform([n+1,1],-1.0,1.0),name="theta")
y_pred=tf.matmul(X,theta,name="predictions")  #eq 1.4
error=y_pred - Y

mse=tf.reduce_mean(tf.square(error),name="mse") #eq 1.5
training_op = optimizer.minimize(mse)

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

Вот ссылка на сайт блога, который подробно объясняет различные оптимизаторы и градиентный спуск, http://ruder.io/optimizing-gradient-descent/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...