反向传播+代码实现

简介: 反向传播+代码实现

ad2b2a4be3c94baf8e194e3f2d7750b5.png


y=wx的反向传播代码实现


import torch
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]
#w是Tensor(张量类型),Tensor中包含data和grad,data和grad也是Tensor。
# grad初始为None,调用l.backward()方法后w.grad为Tensor,
# 故更新w.data时需使用w.grad.data。
# 如果w需要计算梯度,那构建的计算图中,跟w相关的tensor都默认需要计算梯度。
w=torch.Tensor([1.0])
#True:需要计算梯度
w.requires_grad=True
def forward(x):
    return x * w
# 构建计算图
def loss(x,y):
    y_pred=forward(x)
    return (y_pred-y)*(y_pred-y)
print("训练之前:",4,forward(4).item())
for epoch in range(100):
    for x,y in zip(x_data,y_data):
        l=loss(x,y)
        #自动将需要梯度的地方计算出来
        #存储到w中
        #l.backward()会把计算图中所有需要梯度(grad)的地方都会求出来,
        # 然后把梯度都存在对应的待求的参数中,最终计算图被释放。
        l.backward()
        print("grad:",x,y,w.grad.item())
        #grad是修改后的w权值
        #data是转化为标量 不能使用张量计算 会发生自动类型转换
        w.data=w.data-0.01*w.grad.data
        #要单个所以要释放,如果是连续的则不需要清零
        # w.data.zero_() 错
        w.grad.data.zero_()
    print("进程轮数:",epoch,l.item())
print("训练之后:",4,forward(4).item())


y=w1x+w2x+b的反向传播代码实现  


import torch
x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]
#学习率
learn_rate=0.01
#True:需要计算梯度
w1=torch.tensor([1.0])
w1.requires_grad=True
w2=torch.tensor([1.0])
w2.requires_grad=True
b=torch.tensor([1.0])
b.requires_grad=True
def forward(x):
    return w1*x+w2*x+b
def loss(x,y):
    y_test=forward(x)
    return (y_test-y)*(y_test-y)
print("训练之前:",4,forward(4).item())
for epoch in range(100):
    for x,y in zip(x_data,y_data):
        #损失函数原型
        l=loss(x,y)
        l.backward()
        #pytorch中,.item()方法 是得到一个元素张量里面的元素值
        print("grad:",x,y,w1.grad.item(),w2.grad.item(),b.grad.item())
        #orch.autograd包主要功能是完成网络反向传播时的链式求导
        #过程大致为:先通过输入的tensor数据类型的变量在神经网络的前向传播中生成一张计算图,
        #然后再根据这个计算图和输出结果准确计算出各个参数需要更新的梯度,并通过完成反向传播对参数进行梯度更新。
        #在实践中使用autograd包中的variable类进行封装,封装之后计算图中每一个节点就是一个variable对象
        #因此如果用X代表选中的节点,那么X.data 就是tensor数据对象,X.grad就是X的梯度对象,X.grad.data就是X的梯度数据值啦
        w1.data=w1.data-learn_rate*w1.grad.data
        w2.data=w2.data-learn_rate*w2.grad.data
        b.data=b.data-learn_rate*b.grad.data
        w1.grad.data.zero_()
        w2.grad.data.zero_()
        b.grad.data.zero_()
    print("轮数:",epoch,l.item())
print("训练之后:",4,forward(4).item())


目录
相关文章
|
10天前
|
人工智能 监控 算法
Transformer模型训练全解析:从数据到智能的炼金术
模型训练是让AI从数据中学习规律的过程,如同教婴儿学语言。预训练相当于通识教育,为模型打下通用知识基础;后续微调则针对具体任务。整个过程包含数据准备、前向传播、损失计算、反向更新等步骤,需克服过拟合、不稳定性等挑战,结合科学与艺术,最终使模型具备智能。
|
3月前
|
机器学习/深度学习 人工智能 算法
AI 基础知识从 0.6 到 0.7—— 彻底拆解深度神经网络训练的五大核心步骤
本文以一个经典的PyTorch手写数字识别代码示例为引子,深入剖析了简洁代码背后隐藏的深度神经网络(DNN)训练全过程。
768 56
|
1月前
|
存储 机器学习/深度学习 人工智能
大模型微调技术:LoRA原理与实践
本文深入解析大语言模型微调中的关键技术——低秩自适应(LoRA)。通过分析全参数微调的计算瓶颈,详细阐述LoRA的数学原理、实现机制和优势特点。文章包含完整的PyTorch实现代码、性能对比实验以及实际应用场景,为开发者提供高效微调大模型的实践指南。
1453 2
|
27天前
|
文字识别 测试技术 开发者
Qwen3-VL新成员 2B、32B来啦!更适合开发者体质
Qwen3-VL家族重磅推出2B与32B双版本,轻量高效与超强推理兼备,一模型通吃多模态与纯文本任务!
1568 11
|
8月前
|
机器学习/深度学习 物联网 PyTorch
小白避坑指南:国内用Colossal-AI微调DeepSeek 1.5B的完整踩坑记录(附镜像加速方案)
本文详细记录了使用Colossal-Ai对DeepSeek-Qwen模型进行微调的过程,包括模型下载、环境部署、数据集处理及代码实现等环节。重点介绍了LoRA低秩适配方法和Colossal-Ai分布式训练框架的使用技巧,解决了模型封装后函数调用冲突、梯度检查点配置等问题。通过命令行参数灵活调整训练配置,最终在两块A100 GPU上完成训练,单卡显存占用约11GB,利用率达85%。文章总结了常见问题及解决方法,为后续研究提供参考。
711 15
小白避坑指南:国内用Colossal-AI微调DeepSeek 1.5B的完整踩坑记录(附镜像加速方案)
|
11月前
|
机器学习/深度学习 人工智能 PyTorch
【AI系统】数据并行
数据并行是一种在分布式AI系统中广泛应用的技术,通过将数据集划分成多个子集并在不同计算节点上并行处理,以提高计算效率和速度。在大规模机器学习和深度学习训练中,数据并行可以显著加快模型训练速度,减少训练时间,提升模型性能。每个计算节点接收完整的模型副本,但处理不同的数据子集,从而分摊计算任务,提高处理速度和效率。数据并行按同步方式可分为同步数据并行和异步数据并行,按实现方式包括数据并行、分布式数据并行、完全分片的数据并行等。其中,分布式数据并行(DDP)是当前应用最广泛的并行算法之一,通过高效的梯度聚合和参数同步机制,确保模型一致性,适用于大型NPU集群和AI系统。
565 7
【AI系统】数据并行
|
机器学习/深度学习 5G
5G中的调制技术:从QPSK到256QAM,赋能高速率通信
5G中的调制技术:从QPSK到256QAM,赋能高速率通信
3223 5
|
存储 机器学习/深度学习 算法
Transformers 加速的一些常用技巧
Transformers架构因自注意力机制面临训练过程中的内存不足和GPU限制问题,主要源于大量参数、自注意力计算的高复杂度以及激活状态存储。为解决这些问题,常用策略包括:固定长度填充(使用注意力掩码处理填充部分)、动态填充(每批内序列长度相同)和等长匹配(按序列长度分组批量处理),以及自动混合精度(AMP)训练,通过float16降低内存使用和加速计算。尽管如此,大型模型仍可能需要高性能GPU支持。
389 3
|
机器学习/深度学习 人工智能 自然语言处理
【AI大模型】BERT模型:揭秘LLM主要类别架构(上)
【AI大模型】BERT模型:揭秘LLM主要类别架构(上)
1167 1