Значение стоимости не уменьшается при использовании градиентного спуска - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть пары данных (x, y), которые созданы кубической функцией

y = g(x) = ax^3 − bx^2 − cx + d 

плюс немного случайного шума. Теперь я хочу подогнать модель (параметры a, b, c, d) к этим данным, используя градиентный спуск.

Моя реализация:

param={}
param["a"]=0.02
param["b"]=0.001
param["c"]=0.002
param["d"]=-0.04

def model(param,x,y,derivative=False):
    x2=np.power(x,2)
    x3=np.power(x,3)
    y_hat = param["a"]*x3+param["b"]*x2+param["c"]*x+param["d"]
    if derivative==False:
        return y_hat
    derv={} #of Cost function w.r.t parameters
    m = len(y_hat)
    derv["a"]=(2/m)*np.sum((y_hat-y)*x3)
    derv["b"]=(2/m)*np.sum((y_hat-y)*x2)
    derv["c"]=(2/m)*np.sum((y_hat-y)*x)
    derv["d"]=(2/m)*np.sum((y_hat-y))
    return derv

def cost(y_hat,y): 
    assert(len(y)==len(y_hat))
    return (np.sum(np.power(y_hat-y,2)))/len(y)

def optimizer(param,x,y,lr=0.01,epochs = 100):
    for i in range(epochs):
        y_hat = model(param,x,y)
        derv = model(param,x,y,derivative=True)
        param["a"]=param["a"]-lr*derv["a"]
        param["b"]=param["b"]-lr*derv["b"]
        param["c"]=param["c"]-lr*derv["c"]
        param["d"]=param["d"]-lr*derv["d"]
        if i%10==0:
            #print (y,y_hat)
            #print(param,derv)
            print(cost(y_hat,y))

X = np.array(x)
Y = np.array(y)
optimizer(param,X,Y,0.01,100)

При запуске стоимость увеличивается:

36.140028646153525
181.88127675295928
2045.7925570171055
24964.787906199843
306448.81623701524
3763271.7837247783
46215271.5069297
567552820.2134454
6969909237.010273
85594914704.25394

Я правильно рассчитал градиенты? Я не знаю, почему стоимость взрыва.

Вот данные: https://pastebin.com/raw/1VqKazUV.

1 Ответ

0 голосов
/ 05 ноября 2018

Если я запускаю ваш код, например, lr=1e-4, стоимость уменьшается.

Проверьте ваши градиенты (просто напечатайте результат model(..., True)), вы увидите, что они довольно большие. Поскольку ваша скорость обучения также не слишком мала, вы, вероятно, колеблетесь вдали от минимума (см. Любой учебник по ML, например, графики этого, вы также сможете увидеть это, если просто напечатаете свои параметры после каждой итерации).

...