2、Momentum
动量梯度下降是一种常用的优化器,它消除了标准梯度下降引起的振荡,加速了收敛最优点。当它在水平方向上加速时,它在垂直方向上减速。在这种杰出行为的帮助下,它使我们在学习率的方向上迈出了一大步。此外,动量比标准梯度下降要稳定得多。
下面给出的方程式解释了更新规则-
v1,v2=0,0 gamma,lr=0.5,0.4 x1,x2=-4,-6 l1_gd_m,l2_gd_m=[],[] for i in range(20): l1_gd_m.append(x1) l2_gd_m.append(x2) v1=gamma*v1+(0.2*x1) v2=gamma*v2+(4*x2) x1=x1-lr*v1 x2=x2-lr*v2u
Gradient Descent vs Momentum
9
import matplotlib.pyplot as plt import numpy as np fig = plt.figure(figsize=(13,6)) left, bottom, width, height = 100, 0.1, 0.8, 0.8 ax = fig.add_axes([left, bottom, width, height]) start, stop, n_values = -8, 8, 100 x_vals = np.linspace(start, stop, n_values) y_vals = np.linspace(start, stop, n_values) X, Y = np.meshgrid(x_vals, y_vals) Z = np.sqrt(0.1*X**2 + 2*Y**2) plt.contourf(X,Y,Z,) plt.plot(l1_gd[:15],l2_gd[:15],color="red",marker="*",markeredgecolor="black",linewidth=3,label="Gradient Descent") plt.plot(l1_gd_m[:15],l2_gd_m[:15],color="yellow",marker="*",markeredgecolor="orange",linewidth=3,label="Gradient Descent (Momentum =0.5)") plt.figure(figsize=(15,10)) plt.figure(figsize=(15,10)) ax.set_title('Level Sets of the Function',size=20) ax.set_xlabel('x (cm)') ax.set_ylabel('y (cm)') ax.legend() plt.show()
3、Adagrad
自适应梯度下降算法(adaptive gradient descent)是一种学者梯度下降算法。其主要区别在于Adagrad根据网络中参数的重要性对每个权值利用不同的学习速率。换句话说,用较高的学习率训练不必要的参数,用较小的学习率训练重要参数,使其更稳定地收敛。在不允许失真的情况下,实现了算法的加速。更新公式类似于动量,这里每一步的动量是用之前的动量和梯度的平方来计算的。下面的公式显示了Adagrad中的更新规则。
Gt是一个对角矩阵组成的平方和过去的渐变和ϵ平滑项。此外,表示矩阵-向量积运算。
v1,v2=0,0 gamma,lr=0.9,0.4 x1,x2=-4,-6 l1_adagrad,l2_adagrad=[],[] for i in range(20): l1_adagrad.append(x1) l2_adagrad.append(x2) v1=v1+(0.2*x1)**2 v2=v2+(4*x2)**2 x1=x1-(lr/math.sqrt(v1+c))*0.2*x1 x2=x2-(lr/math.sqrt(v2+c))*4*x2
Momentum vs Adagrad
import matplotlib.pyplot as plt import numpy as np fig = plt.figure(figsize=(13,6)) left, bottom, width, height = 100, 0.1, 0.8, 0.8 ax = fig.add_axes([left, bottom, width, height]) start, stop, n_values = -8, 8, 100 x_vals = np.linspace(start, stop, n_values) y_vals = np.linspace(start, stop, n_values) X, Y = np.meshgrid(x_vals, y_vals) Z = np.sqrt(0.1*X**2 + 2*Y**2) plt.contourf(X,Y,Z,) plt.plot(l1_gd[:15],l2_gd[:15],color="red",marker="*",markeredgecolor="black",linewidth=3,label="Gradient Descent") plt.plot(l1_gd_m[:15],l2_gd_m[:15],color="yellow",marker="*",markeredgecolor="orange",linewidth=3,label="Gradient Descent (Momentum =0.5)") plt.plot(l1_adagrad[:15],l2_adagrad[:15],color="blue",marker="*",markeredgecolor="black",linewidth=3,label="Adagrad") plt.figure(figsize=(15,10)) plt.figure(figsize=(15,10)) ax.set_title('Level Sets of the Function',size=20) ax.set_xlabel('x (cm)') ax.set_ylabel('y (cm)') ax.legend() plt.show()
从上图中可以看出,Adagrad虽然运动平稳无振荡,但收敛能力不足。为了解决这个问题,Geoffrey Hinton引入了一个更有效的优化器RMSprop。