改进版梯度下降

改进版梯度下降

发展历史

img

标准梯度下降法的缺陷

img

如果学习率选的不恰当会出现以上情况

因此有一些自动调学习率的方法。一般来说,随着迭代次数的增加,学习率应该越来越小,因为迭代次数增加后,得到的解应该比较靠近最优解,所以要缩小步长η,那么有什么公式吗?比如:

img

,但是这样做后,所有参数更新时仍都采用同一个学习率,即学习率不能适应所有的参数更新。

解决方案是:给不同的参数不同的学习率

Adagrad法

假设N元函数f(x),针对一个自变量研究Adagrad梯度下降的迭代过程,

img

可以看出,Adagrad算法中有自适应调整梯度的意味(adaptive gradient),学习率需要除以一个东西,这个东西就是前n次迭代过程中偏导数的平方和再加一个常量最后开根号

举例:使用Adagrad算法求y = x2的最小值点

导函数为g(x) = 2x

初始化x(0) = 4,学习率η=0.25,ε=0.1

第①次迭代:

img

第②次迭代:

img

第③次迭代:

img

求解的过程如下图所示

 

img

对应代码为:

from matplotlib import pyplot as plt import numpy as np from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() x = np.arange(-4, 4, 0.025) plt.plot(x,x**2) plt.title("y = x^2") def f(x): return x**2 def h(x): return 2*x η = 0.25 ε = 0.1 x = 4 iters = 0 sum_square_grad = 0 X = [] Y = [] while iters<12: iters+=1 X.append(x) Y.append(f(x)) sum_square_grad += h(x)**2 x = x - η/np.sqrt(sum_square_grad+ε)*h(x) print(iters,x) plt.plot(X,Y,"ro") ax = plt.subplot() for i in range(len(X)): ax.text(X[i], (X[i])**2, "({:.3f},{:.3f})".format(X[i], (X[i])**2), color='red') plt.show()

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyfsfd.html