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

时间:2018-11-04 21:32:58

标签: python optimization neural-network gradient-descent calculus

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

如果我使用例如lr=1e-4,成本降低。

检查您的渐变(只打印model(..., True)的结果),您会看到它们很大。由于学习率也不太低,因此您可能会偏离最小值(请参见任何ML教科书以了解其示例图,如果每次迭代后仅打印参数,您也应该能够看到它)。