【PyTorch】深度学习实践之 梯度下降Gradient Descent


梯度下降算法

在这里插入图片描述
通过计算梯度就可以知道 w 的移动方向,应该让 w 向右走而不是向左走,也可以知道什么时候会到达最低点(梯度为0的地方)。此处引入一个学习率α,可以控制走的快慢,一般训练学习率α不能太大也不能太小,太小的话,可能导致迟迟走不到最低点,太大的话,会导致错过最低点!

代码:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D

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 gradient(xs, ys):
    grad = 0
    for x, y in zip(xs, ys):
        grad += 2 * x * (x * w - y)
    return grad / len(xs)


epoch_list = []
loss_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 # 0.01是学习率
    print('Epoch:', epoch, 'w=', w, 'loss=', cost_val)
    epoch_list.append(epoch)
    loss_list.append(cost_val)
print('Predict (after training)', 4, forward(4))

plt.plot(epoch_list, loss_list)
plt.ylabel('loss')
plt.xlabel('epoch')
plt.show()

结果:

在这里插入图片描述

随机梯度下降SGD

随机梯度下降就是随机选择一个样本计算loss

代码:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D

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(x, y):
    y_pred = forward(x)
    return (y_pred - y) ** 2
 
# 定义梯度函数
def gradient(x, y):
    return 2 * x * (x * w - y)

epoch_list = []
loss_list = []
print('Predict (before training)', 4, forward(4))
for epoch in range(100):
    for x, y in zip(x_data, y_data):
        grad = gradient(x, y) #单个样本梯度
        w -= 0.01 * grad #权重更新
        print("\tgrad:", x, y, grad)
        l = loss(x, y)
    print("progress", epoch, "w=", w, "loss=", l)
    print("\n")
    epoch_list.append(epoch)
    loss_list.append(l)

print('Predict (after training)', 4, forward(4))

plt.plot(epoch_list, loss_list)
plt.ylabel('loss')
plt.xlabel('epoch')
plt.show()

结果:

在这里插入图片描述

二者区别

  • cost是所有样本算出来的损失,loss是随机的一个样本损失,引入了一个随机噪声,随机噪声可能会把我们向前推动,那么将来我们在更新的过程中,就有可能跨越鞍点,从而向最优值前进,而普通梯度下降可能只会停留在局部最优点停滞不前
  • 随机梯度下降只需要求出一个样本均值 ,而普通梯度下降是计算所有数据
  • 普通的是需要把计算所得的均值进行相加,随机梯度下降是对每一个样本来求梯度,然后进行更新
  • 随机梯度算法更新的次数大于普通梯度算法

鞍点

一个不是局部极值点的驻点称为鞍点。

鞍点这词来自于不定二次型x2-y2的二维图形,像马鞍:x-轴方向往上曲,在y-轴方向往下曲。
在这里插入图片描述


学习资料:

https://blog.csdn.net/qq_44833724/article/details/123262072


系列文章索引

教程指路:【《PyTorch深度学习实践》完结合集】 https://www.bilibili.com/video/BV1Y7411d7Ys?share_source=copy_web&vd_source=3d4224b4fa4af57813fe954f52f8fbe7

  1. 线性模型 Linear Model
  2. 梯度下降 Gradient Descent
  3. 反向传播 Back Propagation
  4. 用PyTorch实现线性回归 Linear Regression with Pytorch
  5. 逻辑斯蒂回归 Logistic Regression
  6. 多维度输入 Multiple Dimension Input
  7. 加载数据集Dataset and Dataloader
  8. 用Softmax和CrossEntroyLoss解决多分类问题(Minst数据集)
  9. CNN基础篇——卷积神经网络跑Minst数据集
  10. CNN高级篇——实现复杂网络
  11. RNN基础篇——实现RNN
  12. RNN高级篇—实现分类
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zoetu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值