сходимость стоимости градиентного спуска - PullRequest
0 голосов
/ 24 августа 2018

У меня есть небольшой скрипт, стоимость которого сходится к нулю для наборов данных xa и ya, но независимо от того, какие значения я использую для «итераций» и «learning_rate», лучшая стоимость, которую я могу получить, составляет 31,604 при использовании данных. устанавливает xb и yb.

У меня такой вопрос: стоить ли всегда стремиться к нулю? Если да, то что я делаю не так в отношении наборов данных xb и yb?

import numpy as np


def gradient_descent(x, y):
    m_curr = b_curr = 0
    iterations = 1250
    n = len(x)
    learning_rate = 0.08

    for i in range(iterations):
        y_predicted = (m_curr * x) + b_curr
        cost = (1/n) * sum([val**2 for val in (y - y_predicted)])
        m_der = -(2/n) * sum(x * (y - y_predicted))
        b_der = -(2/n) * sum(y - y_predicted)
        m_curr = m_curr - (learning_rate * m_der)
        b_curr = b_curr - (learning_rate * b_der)
        print('m {}, b {}, cost {}, iteration {}'.format(m_curr, b_curr, cost, i))


xa = np.array([1, 2, 3, 4, 5])
ya = np.array([5, 7, 9, 11, 13])

# xb = np.array([92, 56, 88, 70, 80, 49, 65, 35, 66, 67])
# yb = np.array([98, 68, 81, 80, 83, 52, 66, 30, 68, 73])

gradient_descent(xa, ya)

# gradient_descent(xb, yb)

С xa и ya (используя значения для итераций и learning_rate, как показано выше):

m 2.000000000000002, b 2.999999999999995, cost 1.0255191767873153e-29, iteration 1245
m 2.000000000000001, b 2.9999999999999947, cost 1.0255191767873153e-29, iteration 1246
m 2.000000000000002, b 2.999999999999995, cost 1.0255191767873153e-29, iteration 1247
m 2.000000000000001, b 2.9999999999999947, cost 1.0255191767873153e-29, iteration 1248
m 2.000000000000002, b 2.999999999999995, cost 1.0255191767873153e-29, iteration 1249

С xb и yb (итерации = 1000 и learning_rate = 0,00001):

m 1.0445229983270568, b 0.01691112775956422, cost 31.811378572605147, iteration 995
m 1.0445229675787642, b 0.01691330681124408, cost 31.81137809768319, iteration 996
m 1.044522936830507, b 0.016915485860422623, cost 31.811377622762304, iteration 997
m 1.044522906082285, b 0.016917664907099856, cost 31.811377147842503, iteration 998
m 1.0445228753340983, b 0.01691984395127578, cost 31.811376672923775, iteration 999

С xb и yb (итерации = 200000 и learning_rate = 0,00021):

m 1.017952329085966, b 1.8999054866690825, cost 31.604524796644444, iteration 199995
m 1.0179523238769337, b 1.8999058558198456, cost 31.60452479599536, iteration 199996
m 1.0179523186680224, b 1.89990622496171, cost 31.604524795346318, iteration 199997
m 1.017952313459241, b 1.899906594094676, cost 31.60452479469731, iteration 199998
m 1.017952308250581, b 1.8999069632187437, cost 31.604524794048356, iteration 199999

1 Ответ

0 голосов
/ 25 августа 2018

Рад, что это помогло вам понять.Консолидация комментария как ответа на этот вопрос.

Функция градиентного спуска всегда будет стремиться к локальным / глобальным минимумам.Это минимизирует ошибку / стоимость для успешного расчета выхода (Y) с предоставленными входными значениями (X) здесь.

Вы решаете уравнение y = mx + b.

В ваших данных xa, ya, он смог точно рассчитать с ошибкой ~ 0 (или) с балансом обоихстороны уравнения.Но в случае xb, yb его можно решить только с ошибкой ~ 31.

The cost is nothing but the mean error the gradient descent finds while balancing the equation. 
Manually try calculating both sides of the equation, it will become clear.

Кроме того, вы можете предсказать y по значениям x со средней ошибкой 0 для данных xa, ya ... И со средней ошибкой 31 для данных xb, yb.

...