改进版梯度下降

发展历史

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**2def 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()
复制代码

缺点:由于分母是累加梯度的平方,到后面累加的比较大时,会导致梯度更新缓慢

RMSprop法

AdaGrad算法在迭代后期由于学习率过小,可能较难找到一个有用的解。为了解决这一问题,RMSprop算法对Adagrad算法做了一点小小的修改,RMSprop使用了加权平均的方法,由累积平方梯度变成平均平方梯度,解决了后期学习率太小的缺点.(类似于动量梯度下降)

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

可以看出分母不再是一味的增加,它会重点考虑距离他较近的梯度(指数衰减的效果),也就不会出现Adagrad到后期收敛缓慢的问题

举例:使