4、RMSprop
Rmsprop是由著名计算机科学家Geoffrey Hinton (Hinton et al., 2012)提出的另一种高效优化算法。该算法的工作原理与Adagrad相似,只是稍加修改。不像AdaGrad那样取梯度平方的累积和,我们取这些梯度的指数移动平均值。使用指数平均的原因是为了给最近更新的梯度权重大于最近更新的梯度。下面的方程式显示了Rmsprop的更新规则。
v1,v2=0,0 gamma,lr=0.9,0.4 x1,x2=-4,-6 l1,l2=[],[] for i in range(20): l1.append(x1) l2.append(x2) v1=gamma*v1+(1-gamma)*(0.2*x1)**2 v2=gamma*v2+(1-gamma)*(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 vs RMSprop
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.plot(l1[:15],l2[:15],color="g",marker="*",markeredgecolor="b",linewidth=3,label="RMSprop Algorithm") 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()
显而易见,当收敛到最优点时,梯度下降算法在垂直方向上产生巨大的振荡,RMSprop限制了垂直运动,加速了水平方向。此外,虽然动量减小了振荡,RMSprop提供了更可靠和更快的收敛。
5、Adam
自适应矩估计是另一种计算每个参数的自适应学习率的优化器。与其他优化器相比,它更加健壮和可靠,因为它基本上结合了动量和RMSprop(即。移动类似梯度的动量的平均值,并使用梯度的平方来调整学习速率,如RMSprop)。更精确地说,Adam算法执行如下-
v1,v2,s1,s2=0,0,0,0 gamma,beta,lr=0.9,0.999,0.4 x1,x2=-6,-6 l1_adam,l2_adam=[],[] for i in range(20): l1_adam.append(x1) l2_adam.append(x2) v1=gamma*v1+(1-gamma)*(0.2*x1) v2=gamma*v2+(1-gamma)*(4*x2) s1=beta*s1+(1-beta)*(0.2*x1)**2 s2=beta*s2+(1-beta)*(4*x2)**2 m_hat_v1= v1 / (1 - np.power(gamma, i+1)) m_hat_v2 = v2 / (1 - np.power(gamma, i+1)) s_hat_s1= s1 / (1 - np.power(beta, i+1)) s_hat_s2 = s2 / (1 - np.power(beta, i+1)) x1=x1-(lr)*(m_hat_v1/math.sqrt((s_hat_s1)+c)) x2=x2-(lr)*(m_hat_v2/math.sqrt((s_hat_s2)+c)) print(x1,x2) if abs(x1)<=0.1 and abs(x2)<0.1: break
在收敛期间的轨迹汇总
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.plot(l1[:15],l2[:15],color="g",marker="*",markeredgecolor="b",linewidth=3,label="RMSprop Algorithm") plt.plot(l1_adam[:20],l2_adam[:20],color="Brown",marker="*",markeredgecolor="pink",linewidth=3,label="Adam") 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()
正如在最后的图中所看到的,Adam优化器在直线路径上导致最快的收敛。在Adam的例子中,它通过累积之前梯度的总和来减弱振荡,并且由于梯度的平方项,它遵循一条直线,类似于RMSprop。这导致了一个明显的结论,即Adam是Momentum和RMSprop的结合版本。从上图中我们可以很容易地看出为什么Adam是deep learning中最流行的优化器。即使从离最优值(-6,-6)很远的地方开始,Adam也能以最小的迭代收敛得最快。