使用梯度下降时成本值不会降低

Cost value doesn't decrease when using gradient descent

我有由三次函数创建的数据对 (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

如果我 运行 您的代码,例如lr=1e-4,成本降低。

检查你的渐变(只打印model(..., True)的结果),你会发现它们很大。由于您的学习率也不是太小,您可能会偏离最小值(请参阅任何 ML 教科书的示例图,如果您在每次迭代后打印参数,您也应该能够看到这一点)。