【pytorch深度学习实践】笔记—03-1.梯度下降算法

本文涉及的产品
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,182元/月
简介: 【pytorch深度学习实践】笔记—03-1.梯度下降算法

梯度的引入与思考

【问题1】为什么要引入梯度下降,梯度下降是用来解决什么问题的?

【思考】回忆一下在笔记02中我们是如何找到的w?对,是穷举!

我们是在[0.0,4.0]区间,每隔0.1取一个值,穷举了所有w的可能取值,根据w-loss图像得出结论:loss最小时,w=2。

18a5c1f4d35d3bf143bdf48854ec4c08_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM4MDY4ODc2,size_16,color_FFFFFF,t_70#pic_center.png

在实际情况中,一方面我们很可能一开始就无法确定w的大致范围,进而导致没办法穷举w的值。另一方面,权重W也可能是多维的,一一穷举会很麻烦。所以我们就希望,可不可以让程序自己来寻找最合适的w值。


此时,就把求w值问题变成一个如何寻找w最小值问题。


【问题2】如何寻找最小w?

【思考】可通过下列步骤寻找w最小值:

①初始化w:先假定w取一个值,作为寻找的起始点。

②判断方向:根据梯度值,判断w应该往左走还是往右走可以找到w最小值(沿着梯度反方向,即为寻找最小值的方向)。

移动:移动的过程就是更新权重w的过程,每次朝着梯度反方向③小幅度移动。

④更新权重w:移动完成后,将当前w值作为最新权重值,更新公式如下图所示:

1.png


不断重复上述操作,当w快找到最小值点时,此时w-loss图像的梯度接近0(可以理解为曲线在接近w最小值点斜率接近0),此时cost对w的导数接近为0,在公式中w=w-α×0。此时得到的w即为所求的w。


【概念】梯度方向定义:函数上升的方向即为梯度的方向。

所以,梯度的反方向即为函数下降的方向(即:寻找LOSS最小值点的方向)


梯度下降寻找权重w最小值

1.导入数据集

PS:与之前代码相同

import matplotlib.pyplot as plt
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]

2.定义模型

PS:与之前代码相同

def forward(x):
    return x * w

3.定义损失函数

PS:与之前代码相同

# 定义损失函数MSE
# loss = (y_pred - y)²
# loss_sum = += loss (对每个x=1.0,2.0,3.0,求loss后求和)
# loss_sum / len(xs) 在对cost求均值
def cost(xs, ys):
    loss_sum = 0
    for x, y in zip(xs, ys):
        y_pred = forward(x)  # 计算预测值y
        loss_sum += (y_pred - y) ** 2
        return loss_sum / len(xs)


4.定义梯度算法

y_pred预测值公式如下:

1.png

cost(w)损失函数公式如下:

1.png

gradient梯度公式如下:

1.png


gradient梯度关于权重w、初始值Xn和Yn的公式如下(由上述公式根据复合函数求导法则推导而来):

1.png


# 定义梯度计算方法 求cost(w)对w的偏导数 梯度也需要求和后求均值
def gradient(xs, ys):
    grad = 0
    for x, y in zip(xs, ys):
        grad += 2 * x * (x * w - y)
    return grad / len(xs)

5.训练模型

for epoch in range(100):  # 默认步长为1,epoch从0-99训练100次
    cost_val = cost(x_data, y_data)  # 计算均方损失MSE
    grad_val = gradient(x_data, y_data)  # 计算梯度
    w -= 0.01 * grad_val  # 学习率lr等于0.01  # 使用梯度下降的方法更新权重
    print(' Epoch:', epoch, ' w=', w, ' loss=', cost_val)  # 每训练一次,打印一下权重w和损失loss的值

6.全部代码

import matplotlib.pyplot as plt
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]
# 定义的初始权重值
w = 1.0
# 定义模型y=wx
def forward(x):
    return x * w
# 定义损失函数MSE
# loss = (y_pred - y)²
# loss_sum = += loss (对每个x=1.0,2.0,3.0,求loss后求和)
# loss_sum / len(xs) 在对cost求均值
def cost(xs, ys):
    loss_sum = 0
    for x, y in zip(xs, ys):
        y_pred = forward(x)  # 计算预测值y
        loss_sum += (y_pred - y) ** 2
        return loss_sum / len(xs)
# 定义梯度计算方法 求cost(w)对w的偏导数 梯度也需要求和后求均值
def gradient(xs, ys):
    grad = 0
    for x, y in zip(xs, ys):
        grad += 2 * x * (x * w - y)
    return grad / len(xs)
# 最终绘制图像的x
epoch_list = []
cost_list = []
print('Predict (before training)', 4, forward(4))
for epoch in range(100):  # 默认步长为1,epoch从0-99训练100次
    cost_val = cost(x_data, y_data)  # 计算均方损失MSE
    grad_val = gradient(x_data, y_data)  # 计算梯度
    w -= 0.01 * grad_val  # 学习率lr等于0.01  # 使用梯度下降的方法更新权重
    print(' Epoch:', epoch, ' w=', w, ' loss=', cost_val)
    epoch_list.append(epoch)  # 收集当前是第几次训练
    cost_list.append(cost_val)  # 收集对应训练的损失值
print('Predict (after training)', 4, forward(4))
# 绘图
plt.plot(epoch_list, cost_list)
plt.ylabel('cost')
plt.xlabel('epoch')
plt.show()


7.展示pytorch绘制的图像(epoch-loss)

从图中可以发现,当训练epoch次数增加的时候,损失值会越来越小。

此时打印4 和forward(4),就会得到forward(4)的值接近于8。所以权重w=y/x=2

1.png

目录
相关文章
|
4月前
|
机器学习/深度学习 PyTorch API
PyTorch量化感知训练技术:模型压缩与高精度边缘部署实践
本文深入探讨神经网络模型量化技术,重点讲解训练后量化(PTQ)与量化感知训练(QAT)两种主流方法。PTQ通过校准数据集确定量化参数,快速实现模型压缩,但精度损失较大;QAT在训练中引入伪量化操作,使模型适应低精度环境,显著提升量化后性能。文章结合PyTorch实现细节,介绍Eager模式、FX图模式及PyTorch 2导出量化等工具,并分享大语言模型Int4/Int8混合精度实践。最后总结量化最佳策略,包括逐通道量化、混合精度设置及目标硬件适配,助力高效部署深度学习模型。
669 21
PyTorch量化感知训练技术:模型压缩与高精度边缘部署实践
|
12天前
|
机器学习/深度学习 存储 PyTorch
Neural ODE原理与PyTorch实现:深度学习模型的自适应深度调节
Neural ODE将神经网络与微分方程结合,用连续思维建模数据演化,突破传统离散层的限制,实现自适应深度与高效连续学习。
52 3
Neural ODE原理与PyTorch实现:深度学习模型的自适应深度调节
|
1月前
|
机器学习/深度学习 算法 数据可视化
近端策略优化算法PPO的核心概念和PyTorch实现详解
本文深入解析了近端策略优化(PPO)算法的核心原理,并基于PyTorch框架实现了完整的强化学习训练流程。通过Lunar Lander环境展示了算法的全过程,涵盖环境交互、优势函数计算、策略更新等关键模块。内容理论与实践结合,适合希望掌握PPO算法及其实现的读者。
282 2
近端策略优化算法PPO的核心概念和PyTorch实现详解
|
27天前
|
机器学习/深度学习 算法 PyTorch
【Pytorch框架搭建神经网络】基于DQN算法、优先级采样的DQN算法、DQN + 人工势场的避障控制研究(Python代码实现)
【Pytorch框架搭建神经网络】基于DQN算法、优先级采样的DQN算法、DQN + 人工势场的避障控制研究(Python代码实现)
|
20天前
|
机器学习/深度学习 算法 PyTorch
【DQN实现避障控制】使用Pytorch框架搭建神经网络,基于DQN算法、优先级采样的DQN算法、DQN + 人工势场实现避障控制研究(Matlab、Python实现)
【DQN实现避障控制】使用Pytorch框架搭建神经网络,基于DQN算法、优先级采样的DQN算法、DQN + 人工势场实现避障控制研究(Matlab、Python实现)
|
3月前
|
机器学习/深度学习 存储 PyTorch
PyTorch + MLFlow 实战:从零构建可追踪的深度学习模型训练系统
本文通过使用 Kaggle 数据集训练情感分析模型的实例,详细演示了如何将 PyTorch 与 MLFlow 进行深度集成,实现完整的实验跟踪、模型记录和结果可复现性管理。文章将系统性地介绍训练代码的核心组件,展示指标和工件的记录方法,并提供 MLFlow UI 的详细界面截图。
135 2
PyTorch + MLFlow 实战:从零构建可追踪的深度学习模型训练系统
|
7月前
|
机器学习/深度学习 数据采集 自然语言处理
深度学习实践技巧:提升模型性能的详尽指南
深度学习模型在图像分类、自然语言处理、时间序列分析等多个领域都表现出了卓越的性能,但在实际应用中,为了使模型达到最佳效果,常规的标准流程往往不足。本文提供了多种深度学习实践技巧,包括数据预处理、模型设计优化、训练策略和评价与调参等方面的详细操作和代码示例,希望能够为应用实战提供有效的指导和支持。
|
7月前
|
机器学习/深度学习 数据可视化 算法
PyTorch生态系统中的连续深度学习:使用Torchdyn实现连续时间神经网络
神经常微分方程(Neural ODEs)是深度学习领域的创新模型,将神经网络的离散变换扩展为连续时间动力系统。本文基于Torchdyn库介绍Neural ODE的实现与训练方法,涵盖数据集构建、模型构建、基于PyTorch Lightning的训练及实验结果可视化等内容。Torchdyn支持多种数值求解算法和高级特性,适用于生成模型、时间序列分析等领域。
366 77
PyTorch生态系统中的连续深度学习:使用Torchdyn实现连续时间神经网络
|
9月前
|
机器学习/深度学习 传感器 数据采集
深度学习在故障检测中的应用:从理论到实践
深度学习在故障检测中的应用:从理论到实践
692 6
|
6月前
|
机器学习/深度学习 自然语言处理 算法
PyTorch PINN实战:用深度学习求解微分方程
物理信息神经网络(PINN)是一种将深度学习与物理定律结合的创新方法,特别适用于微分方程求解。传统神经网络依赖大规模标记数据,而PINN通过将微分方程约束嵌入损失函数,显著提高数据效率。它能在流体动力学、量子力学等领域实现高效建模,弥补了传统数值方法在高维复杂问题上的不足。尽管计算成本较高且对超参数敏感,PINN仍展现出强大的泛化能力和鲁棒性,为科学计算提供了新路径。文章详细介绍了PINN的工作原理、技术优势及局限性,并通过Python代码演示了其在微分方程求解中的应用,验证了其与解析解的高度一致性。
995 5
PyTorch PINN实战:用深度学习求解微分方程

热门文章

最新文章

推荐镜像

更多