使用梯度下降时成本值不会降低
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
我计算的梯度有误吗?不知道为什么成本在爆炸。
如果我 运行 您的代码,例如lr=1e-4
,成本降低。
检查你的渐变(只打印model(..., True)
的结果),你会发现它们很大。由于您的学习率也不是太小,您可能会偏离最小值(请参阅任何 ML 教科书的示例图,如果您在每次迭代后打印参数,您也应该能够看到这一点)。
我有由三次函数创建的数据对 (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
我计算的梯度有误吗?不知道为什么成本在爆炸。
如果我 运行 您的代码,例如lr=1e-4
,成本降低。
检查你的渐变(只打印model(..., True)
的结果),你会发现它们很大。由于您的学习率也不是太小,您可能会偏离最小值(请参阅任何 ML 教科书的示例图,如果您在每次迭代后打印参数,您也应该能够看到这一点)。