Pytorch --梯度下降算法

梯度下降算法以及随机梯度下降算法

1.梯度下降算法:

梯度下降算法是一种常用的最优化算法,它的目的是找到一个函数的最小值点,或者说是使得函数值尽可能地小。梯度下降算法的基本思想是,从一个初始点开始,沿着函数的负梯度方向(即函数下降最快的方向)不断地更新点的位置,直到达到一个局部最小值或者满足一定的停止条件。

梯度是一个向量,它表示了函数在某一点处的方向导数最大的方向,也就是函数上升最快的方向。负梯度则表示了函数下降最快的方向。梯度的大小反映了函数变化的速率,梯度越大,说明函数变化越快,梯度越小,说明函数变化越缓慢。

2.梯度下降算法的优点:

  • 梯度下降算法相比于大规模数值矩阵的求解,效率更高,因为它只需要计算函数的梯度,而不需要计算函数的二阶导数或者逆矩阵等复杂的运算。
  • 梯度下降算法可以适用于多种类型的函数,不仅仅是凸函数,也可以是非凸函数。对于某些最小二乘法无法计算全局唯一最优解的情况,梯度下降算法仍然能够有效地进行最小值点或者解空间的寻找。
  • 梯度下降算法可以结合不同的优化器、学习率、损失函数、正则化等技巧来提高性能和稳定性,例如随机梯度下降、小批量梯度下降、Momentum、Nesterov Momentum、AdaGrad、RMSprop、Adam等。
  • 梯度下降算法在大规模数据集和复杂模型下表现良好,可以处理高维度和非线性的问题,是深度学习中最常用的优化方法之一。

d63e6cc534154bbfa80c8336a2283b76.png

公式:

7f35c361cdd14391a711809168351d97.png

 权重-=学习率*loss函数的导数

比如下面那道例子 y  =  x*w

loss:  (x*w - y)的平方 再求平均数

对它求导等于   2*x*(x*w - y)求平均数

4.梯度下降算法的例子

import matplotlib.pyplot as plt
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]
w = 1.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)
def loss(xs ,ys): # 随机梯度算法的loss
    y_pred = forward(xs)
    return (ys-y_pred)**2
def gradient(xs, ys):
    grad = 0
    for x, y in zip(xs, ys):
        grad += 2*x*(x*w-y)
    return grad / len(xs)
def gradient1(x, y):#随机梯度算法的gradien1
    return 2*x*(x*w - y)
loss_list =[]
w_list = []
ep_list = []
print('Predict (before training)', 4, forward(4))
for epoch in range(100):
    cost_val = cost(x_data, y_data)
    grad_val = gradient(x_data, y_data)
    w -= 0.01 * grad_val
    w_list.append(w)
    loss_list.append(cost_val)
    ep_list.append(epoch)
    print('Epoch:', epoch, 'w = ', w, 'loss = ', cost_val)
print('Predict (after training', 4, forward(4))



plt.plot(ep_list, loss_list)

plt.show()

5.随机梯度下降算法

您好,这是 Bing。我可以帮您了解随机梯度下降算法的概念和特点。😊

随机梯度下降算法(stochastic gradient descent,SGD)是一种常用的最优化算法,它的基本思想是每次迭代时,只使用一个或一小批样本来计算目标函数的梯度,并按照梯度的反方向更新参数。这样可以大大提高计算效率,尤其是在数据量很大或者目标函数很复杂的情况下

优点

  • 随机梯度下降算法可以适应动态变化的数据,因为它每次只使用一部分数据来更新参数,而不需要遍历所有数据。
  • 随机梯度下降算法可以跳出局部最优解,因为它每次使用的梯度是近似的,有一定的随机性,有可能在某些方向上有更大的下降空间。
  • 随机梯度下降算法可以处理高维度和非线性的问题,因为它不需要计算目标函数的二阶导数或者逆矩阵等复杂的运算。

缺点:

  • 随机梯度下降算法可能会收敛到次优解,因为它每次使用的梯度并不是准确的,有可能偏离了全局最优解的方向。
  • 随机梯度下降算法可能会震荡不稳定,因为它每次使用的梯度有一定的随机性,有可能在某些方向上有过大或过小的更新幅度。
  • 随机梯度下降算法需要合适地选择学习率和批量大小等超参数,因为它们会影响收敛速度和稳定性。

例子跟上面一样的例题

x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]

w = 1.0
def forward(x):
    return x * w
def loss(xs, ys):
    y_pred = forward(xs)
    return (ys-y_pred)*(ys-y_pred)
def gradient(x, y):
    return 2*x*(x*w - y)
loss_list = []
ep_list = []
for epoch in range(200):
    for x, y in zip(x_data, y_data):
        grad = gradient(x, y)
        w = w - 0.001 * grad
        l = loss(x, y)
        loss_list.append(l)
        print("\tgrad: ", x, y, grad,l)

    print("progress:", epoch, "w = ", w)
    ep_list.append(epoch)
print('Predict (after training', 4, forward(4))

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小户爱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值