【问题标题】:Cost value doesn't decrease when using gradient descent使用梯度下降时成本值不会降低
【发布时间】:2019-04-08 07:11:18
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,那么学习率超参数的选择有什么好的策略吗?
    • 主要是反复试验 AFAIK。绘制每个 epoch 的成本(不是每 10 个),并确保平滑下降(没有波动)。
    猜你喜欢
    • 2019-01-31
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多