pytorch学习--梯度下降算法

目标:寻找最优点

分治——容易出现缺漏,无法找到最低点

非凸函数中容易出现局部最优点。 鞍点同样会陷入停滞。

 

假设某个损失函数里,模型损失值 cost 与权重 w 有下图这样的关系。实际模型里,可能会有多个权重 w ,这里为了简单起见,举只有一个权重 w 的例子。权重 w 目前的位置是在小红点。此时如果求出A点的梯度 dL/dw ,便可以知道如果我们向右移动,可以使损失函数的值变得更小。 

通过计算梯度,我们就可以知道 w 的移动方向,应该让 w 向右走而不是向左走,也可以知道什么时候会到达最低点(梯度为0的地方)。

当dL/dw>0说明此时这一段函数为增函数,w应该向左移即减小,当dL/dw<0说明为减函数即右移增大,直到最小值,dL/dw=0。

a为学习率,计算步长。

绘制老师例题代码。

#引入库
from faulthandler import cancel_dump_traceback_later
from typing import ChainMap
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy.matlib
import numpy as np
import matplotlib.pyplot as plt 

w=1.0

x=[1.0,2.0,3.0]
y=[2.0,4.0,6.0]

#预测值
def forward(x):
    return x*w
#损失函数
def cost(xs,ys):
    cost=0
    for x,y in zip(xs,ys):
        y_pred =forward(x)
        cost+=(y_pred-y)**2
    return cost/len(xs)

#更新w
def gradient(xs,ys):
    grad=0
    for x,y in zip(xs,ys):
        grad+=2*x*(x*w-y) 
    return grad/len(xs)

Epoch=[]
cost_ok=[]
print("predict(before traioning)",4,forward(4))
for epoch in range(100):
    cost_try=cost(x,y)
    grad_try=gradient(x,y)
    w-=0.01*grad_try
    Epoch.append(epoch)
    cost_ok.append(cost_try)
    print("EPOCH:",epoch,"w=",w,"loss=",cost_try)
print("Predict(after training):",4,forward(4))

#制图
plt.plot(Epoch,cost_ok)
plt.xlabel("Epoch")
plt.ylabel("cost")
plt.show()

 

利用加权均值平滑曲线 ,如果发散可以尝试减小啊(学习率)

 利用随机梯度下降提高性能。

利用分组在性能和时间复杂度之间寻找平衡。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值