首页 > 编程知识 正文

torch九项目,rmsprop中文

时间:2023-05-05 15:44:46 阅读:164786 作者:4058

说明模型在各可学习参数p中计算偏导数,并更新对应的3358www.Sina.com/。 通常,http://www.Sina.com/http://www.Sina.com/没有直接作用于对应的http://www.Sina.com/,而是用3358 www.Sina.com /处理后得到新的3http://这意味着它用于与参数p一起更新偏导数

假定RMSProp的原理是以损失函数,即Loss尽可能小的方式学习x和y的值为目标。 编写损失函数的代码,制作的结果如下所示。 请注意,这不是u形槽。 有最小值的点。 与此点对应的x和y值是学习的目标。

importnumpyasnpfrommatplotlibimportpyplotaspltfrommpl _ toolkits.MP lot3dimportaxes3ddef func (y ) :returnx*x10*y* ydefpaint _ loss _ func (: x=NP.linspace (-50,50,100 ) #x的绘图范围为从-50到50,从改善区间取10的100 ) #y的绘图范围为y ) z=func(x,y ) fig=plt.figure ) (#figsize ) ) 10,10 ) ax=axes3d(fig ) PLT.xlabel ) x ) PLT.ylabel )

从解析上来看,很明显,当时Loss取的是最小值。 但是,这里是通过神经网络的反向传播寻求引导的方式,一步一步地优化参数,减小Loss。

将x和y的初始值分别设为。 此时,求出Loss函数。 x和y的坡度很明显,x尝试移动的距离小于y尝试移动的距离,但实际上x距离最佳值0更远,差为40,y稍微接近最佳值0,距离为20。 因此,SGD的结果并不理想。

RMSProp算法有效地解决了这个问题。 通过累计各变量梯度的平方r,并将各变量的梯度除以r,可以有效缓解变量之间的梯度差异。 下一个伪代码是计算过程。

3358 www.Sina.com/http://www.Sina.com/http://www.Sina.com/3358 www.Sina.com.Sina.com/http://ww.Sina.com http://www.Sina.com/下图为10次训练,x和y移动轨迹,其中红色对应SGD,蓝色对应RMSProp。 观察与SGD对应的红色轨迹,由于y的倾斜度大,y方向的移动过多,从坡的一端走到了另一端,但x的移动非常慢。 但是,通过RMSProp,有效地消除了因坡度不同导致的抖动。

培训过程的代码如下。

defgrad(x, y ) : # )根据上面的代码,发现x和y的梯度分别为2x和20y return 2 * x,20 * ydeftrain _ SGD (: cur _ x=40 cur _ y=20lr=0 #这里只训练了10次grad_x,grad_y=grad(cur_x,cur_y )与神经网络的反向传播等价,求出各参数的梯度cur_x -=lr * )

grad_x cur_y -= lr * grad_y track_x.append(cur_x) track_y.append(cur_y) #print(track_x) #print(track_y) return track_x, track_ydef train_RMSProp(): cur_x = 40 cur_y = 20 lr = 3 r_x, r_y = 0, 0 #伪代码中的r alpha = 0.9 eps = 1e-06 track_x = [cur_x] track_y = [cur_y] for i in range(10): grad_x, grad_y = grad(cur_x, cur_y) r_x = alpha * r_x + (1 - alpha) * (grad_x * grad_x) r_y = alpha * r_y + (1 - alpha) * (grad_y * grad_y) cur_x -= (grad_x / (np.sqrt(r_x) + eps)) * lr cur_y -= (grad_y / (np.sqrt(r_y) + eps)) * lr track_x.append(cur_x) track_y.append(cur_y) #print(track_x) #print(track_y) return track_x, track_ydef paint_tracks(track_x1, track_y1, track_x2, track_y2): x = np.linspace(-50, 50, 100) y = np.linspace(-50, 50, 100) X, Y = np.meshgrid(x, y) Z = func(X, Y) fig = plt.figure(figsize=(10, 10)) ax = Axes3D(fig) plt.xlabel('x') plt.ylabel('y') #ax.plot(track_x, track_y, func(np.array(track_x), np.array(track_y)), 'r--') tx1, ty1 = track_x1[0], track_y1[0] for i in range(1, len(track_x1)): tx2, ty2 = track_x1[i], track_y1[i] tx = np.linspace(tx1, tx2, 100) ty = np.linspace(ty1, ty2, 100) ax.plot(tx, ty, func(tx, ty), 'r-') tx1, ty1 = tx2, ty2 ax.scatter(track_x1, track_y1, func(np.array(track_x1), np.array(track_y1)), s=50, c='r') tx1, ty1 = track_x2[0], track_y2[0] for i in range(1, len(track_x2)): tx2, ty2 = track_x2[i], track_y2[i] tx = np.linspace(tx1, tx2, 100) ty = np.linspace(ty1, ty2, 100) ax.plot(tx, ty, func(tx, ty), 'b-') tx1, ty1 = tx2, ty2 ax.scatter(track_x2, track_y2, func(np.array(track_x2), np.array(track_y2)), s=50, c='b') #ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='rainbow') plt.show()track_x_sgd, track_y_sgd = train_SGD()#paint_track(track_x_sgd, track_y_sgd)track_x_rms, track_y_rms = train_RMSProp()paint_tracks(track_x_sgd, track_y_sgd, track_x_rms, track_y_rms) pytorch RMSProp参数

接下来看下pytorch中的RMSProp优化器,函数原型如下,其中最后三个参数和RMSProp并无直接关系。

torch.optim.RMSprop(params, lr=0.01, alpha=0.99, eps=1e-08, weight_decay=0, momentum=0, centered=False) params

模型里需要被更新的可学习参数,即上文的x和y。

lr

学习率。

alpha

平滑常数。

eps

,加在分母上防止除0

weight_decay

weight_decay的作用是用当前可学习参数p的值修改偏导数,即:,这里待更新的可学习参数p的偏导数就是。

weight_decay的作用是正则化,和RMSProp并无直接关系。

momentum

根据上文伪代码第8行,计算出后,如果,则继续后面的计算,即。

否则计算过程变成,其中初始为0,是x的梯度,是上述累计的x的梯度的平方。

momentum和RMSProp并无直接关系。

centered

如果centerd为False,则按照上述伪代码计算,即分母是。

否则计算过程变成,这里初始为0,然后分母依然是,但是不一样了。

centered和RMSProp并无直接关系,是为了让结果更平稳。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。