当前位置: 首页 > article >正文

PyTorch 自动微分原理:反向传播与计算图构建

PyTorch 自动微分原理反向传播与计算图构建1. 技术分析1.1 自动微分定义自动微分Automatic Differentiation是计算函数导数的技术PyTorch 通过计算图实现import torch x torch.tensor(2.0, requires_gradTrue) y x ** 2 y.backward() print(x.grad) # tensor(4.)1.2 计算图结构计算图 (Computational Graph) ├── 叶子节点 (Leaf Nodes) - 输入张量 ├── 中间节点 (Intermediate Nodes) - 操作结果 └── 根节点 (Root Node) - 输出张量1.3 反向传播流程前向传播 x ──(pow)── yx² ──(mul)── z2y 反向传播 dz/dx dz/dy * dy/dx 2 * 2x 4x2. 核心功能实现2.1 手动构建计算图class MyTensor: def __init__(self, value, grad_fnNone): self.value value self.grad_fn grad_fn self.grad 0.0 def backward(self, grad1.0): self.grad grad if self.grad_fn: self.grad_fn.backward(grad) class AddNode: def __init__(self, a, b): self.a a self.b b def backward(self, grad): self.a.backward(grad) self.b.backward(grad) class MulNode: def __init__(self, a, b): self.a a self.b b def backward(self, grad): self.a.backward(grad * self.b.value) self.b.backward(grad * self.a.value) def add(a, b): result MyTensor(a.value b.value, AddNode(a, b)) return result def mul(a, b): result MyTensor(a.value * b.value, MulNode(a, b)) return result2.2 PyTorch 自动微分实践import torch class LinearModel(torch.nn.Module): def __init__(self, input_dim, output_dim): super().__init__() self.weight torch.nn.Parameter(torch.randn(input_dim, output_dim)) self.bias torch.nn.Parameter(torch.randn(output_dim)) def forward(self, x): return x self.weight self.bias class GradientAccumulator: def __init__(self, model): self.model model self.accumulated_grads {} for name, param in model.named_parameters(): self.accumulated_grads[name] torch.zeros_like(param) def accumulate(self): for name, param in self.model.named_parameters(): if param.grad is not None: self.accumulated_grads[name] param.grad def apply(self, optimizer): for name, param in self.model.named_parameters(): param.grad self.accumulated_grads[name] optimizer.step() self.reset() def reset(self): for name in self.accumulated_grads: self.accumulated_grads[name].zero_() def compute_gradients(model, inputs, targets, loss_fn): outputs model(inputs) loss loss_fn(outputs, targets) loss.backward() gradients {} for name, param in model.named_parameters(): if param.grad is not None: gradients[name] param.grad.detach().clone() return gradients, loss.item()2.3 自定义反向传播class CustomReLU(torch.autograd.Function): staticmethod def forward(ctx, input): ctx.save_for_backward(input) return input.clamp(min0) staticmethod def backward(ctx, grad_output): input, ctx.saved_tensors grad_input grad_output.clone() grad_input[input 0] 0 return grad_input class CustomLinear(torch.autograd.Function): staticmethod def forward(ctx, input, weight, bias): ctx.save_for_backward(input, weight) output input weight bias return output staticmethod def backward(ctx, grad_output): input, weight ctx.saved_tensors grad_input grad_output weight.T grad_weight input.T grad_output grad_bias grad_output.sum(0) return grad_input, grad_weight, grad_bias class CustomModel(torch.nn.Module): def __init__(self): super().__init__() self.weight torch.nn.Parameter(torch.randn(10, 20)) self.bias torch.nn.Parameter(torch.randn(20)) def forward(self, x): x CustomReLU.apply(x) x CustomLinear.apply(x, self.weight, self.bias) return x2.4 计算图优化class GraphOptimizer: staticmethod def fuse_operations(model): fused_modules [] for name, module in model.named_modules(): if isinstance(module, torch.nn.Sequential): fused torch.nn.utils.fuse_conv_bn_weights(module) fused_modules.append(fused) return fused_modules staticmethod def eliminate_common_subexpressions(graph): subexpressions {} optimized_graph [] for node in graph: key str(node) if key not in subexpressions: subexpressions[key] node optimized_graph.append(node) return optimized_graph def optimize_model(model): model.eval() for module in model.modules(): if isinstance(module, torch.nn.Conv2d): torch.nn.utils.weight_norm(module) return model3. 性能对比3.1 自动微分开销操作前向传播反向传播总时间简单操作0.1ms0.3ms0.4ms复杂模型10ms30ms40ms大型模型100ms300ms400ms3.2 自定义 vs 内置操作操作类型前向速度反向速度内存占用内置操作快快低自定义操作中慢高混合操作中中中3.3 梯度累积对比累积步数内存占用训练速度梯度质量1高快好4低中好8很低慢较好16极低很慢一般4. 最佳实践4.1 梯度检查def check_gradients(model, inputs, targets, loss_fn, epsilon1e-6): model.zero_grad() outputs model(inputs) loss loss_fn(outputs, targets) loss.backward() for name, param in model.named_parameters(): if param.grad is None: continue analytical_grad param.grad.detach().clone() numerical_grad torch.zeros_like(param) for i in range(param.numel()): param_flat param.view(-1) param_flat[i] epsilon outputs_plus model(inputs) loss_plus loss_fn(outputs_plus, targets) param_flat[i] - 2 * epsilon outputs_minus model(inputs) loss_minus loss_fn(outputs_minus, targets) param_flat[i] epsilon numerical_grad.view(-1)[i] (loss_plus - loss_minus) / (2 * epsilon) max_error torch.abs(analytical_grad - numerical_grad).max() print(f{name}: max error {max_error})4.2 梯度裁剪def clip_gradients(model, max_norm1.0): torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm) def adaptive_grad_clip(model, clip_value1.0): for param in model.parameters(): if param.grad is not None: grad_norm param.grad.norm() if grad_norm clip_value: param.grad.data.mul_(clip_value / grad_norm)5. 总结PyTorch 自动微分是深度学习的核心计算图动态构建的计算图反向传播链式法则自动求导自定义操作支持自定义前向/反向传播梯度优化梯度累积、裁剪等技术对比数据如下反向传播开销约为前向传播的 2-3 倍自定义操作比内置操作慢约 50%梯度累积可降低内存占用 75%梯度检查可验证导数正确性

相关文章:

PyTorch 自动微分原理:反向传播与计算图构建

PyTorch 自动微分原理:反向传播与计算图构建 1. 技术分析 1.1 自动微分定义 自动微分(Automatic Differentiation)是计算函数导数的技术,PyTorch 通过计算图实现: import torchx torch.tensor(2.0, requires_gradTrue…...

在多轮对话应用中体验Taotoken路由策略的稳定性

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在多轮对话应用中体验Taotoken路由策略的稳定性 在多轮对话应用,例如聊天机器人或需要保持长上下文的智能助手中&#…...

3PEAK思瑞浦 TPA3672-SO1R SOP8 运算放大器

特性 供电电压:3V至16V 偏移电压:在25C时最大2.5mV 低功耗:每通道1毫安 轨到轨输入和输出 带宽:4MHz 斜率:3.5伏/微秒 大输出电流:在Vs5V时,300mV压降下的输出 电流为50mA 零交叉 -优异的总谐波失真加噪声:0.0005% -共模抑制比:95dB(最小值)...

3PEAK思瑞浦 LM2902A-TS2R-S TSSOP14 运算放大器

特性 供电电压:3V至36V或士1.5V至18V 低供电电流:每通道100安培 输入共模电压范围包含地线 可作为比较器工作 轨到轨输出: 带宽:0.9MHz 斜率:0.5V/us 优异的EMI抑制性能:1GHz时71dB 偏移电压:土3mV最大值 工作温度范围:-40C至125C 通过AEC-Q100可靠性测试,适用于汽车…...

CANN/Ascend C AsyncGetTensorC函数

AsyncGetTensorC 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitcod…...

像素级实景映射,构建实景孪生底层新范式

副标题:自研硬核引擎矩阵,铸就镜像视界行业标杆内核前言数字经济深度赋能实体经济,数字孪生与视频孪生技术已成为智慧城市、工业管控、智慧安防等全域场景升级的核心支撑。当前行业多数方案仍沿用人工建模、静态渲染、视频贴图叠加的传统路径…...

Meeper:开源AI会议助手,基于Whisper与ChatGPT实现实时转录与智能摘要

1. 项目概述与核心价值 如果你和我一样,每天有一半的时间都泡在各种在线会议里,那你肯定也经历过这样的场景:会议开到一半,突然被同事问起刚才某个技术细节的讨论结果,大脑瞬间一片空白;或者为了写会议纪要…...

基于RAG与本地向量数据库,为AI编程助手构建私有知识库

1. 项目概述:一个为开发者量身定制的本地知识库如果你是一名重度使用 Cursor 或 VS Code 这类 AI 驱动的代码编辑器的开发者,那么你一定遇到过这样的困境:当你在编辑器里向 AI 助手提问时,它给出的答案往往基于其训练时的通用知识…...

ClaudeCode:基于Claude 3的AI代码生成与重构命令行工具实战指南

1. 项目概述:ClaudeCode,一个面向开发者的AI代码生成与重构工具 最近在GitHub上看到一个挺有意思的项目,叫 designfailure/claudecode 。乍一看这个名字,可能会有点摸不着头脑, designfailure 是作者, …...

Spring Boot 缓存优化:从入门到精通

Spring Boot 缓存优化:从入门到精通 核心概念 缓存是提高应用性能的重要手段,Spring Boot 提供了强大的缓存支持。通过合理配置和使用缓存,可以显著减少数据库访问次数,提高响应速度。 Spring Boot 缓存抽象 Spring Boot 提供了统…...

嵌入式操作系统选型:7大错误与工业实践

1. 嵌入式操作系统选型的核心考量在工业自动化产线上,一个实时性不足的嵌入式系统可能导致机械臂动作延迟,最终造成价值数百万的生产线停机事故。这正是2018年某德国汽车零部件供应商遭遇的真实场景——他们选用的嵌入式Linux系统在负载激增时出现调度延…...

Taotoken平台用量看板如何帮助团队透明管理大模型调用成本

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken平台用量看板如何帮助团队透明管理大模型调用成本 对于持续使用多个大模型API进行开发的中小型技术团队而言,成…...

基于大语言模型的智能文档信息提取:从OCR到视觉问答的实践

1. 项目概述:当大语言模型“看懂”图片最近在折腾一些文档自动处理的活儿,发现一个挺有意思的痛点:很多场景下,我们拿到的信息源是图片,比如扫描的合同、手机拍的表格、或者网页截图。传统的OCR(光学字符识…...

利用Taotoken CLI工具一键配置多开发环境,提升团队协作效率

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 利用Taotoken CLI工具一键配置多开发环境,提升团队协作效率 在团队协作开发中,确保所有成员使用统一、正确…...

侧信道攻击揭秘:如何从硬件功耗逆向AI模型并生成对抗样本

1. 项目概述:当AI遇上硬件,安全边界在何处?最近几年,嵌入式AI设备,从智能门锁、摄像头到工业控制器,已经渗透到我们生活的方方面面。这些设备的核心,往往是一个经过训练的神经网络模型&#xff…...

【办公效率提升】 OpenClaw 必装技能清单(含有安装包)

OpenClaw 最实用 Skill 技能推荐|办公效率直接拉满(小白必开) OpenClaw(小龙虾)真正强大的地方,在于 Skill 技能扩展。开启对应技能后,AI 不再只是聊天,而是能真刀真枪帮你干活。下…...

自建图床服务:基于Flask实现私有图片托管与部署指南

1. 项目概述与核心价值最近在折腾个人项目或者写技术博客的时候,你是不是也经常遇到图片托管这个“老大难”问题?把图片一股脑儿扔到项目仓库里,不仅让仓库体积暴涨,拉取速度变慢,管理起来也是一团乱麻。用第三方图床吧…...

Android应用安全自动化分析:Leech-AIO-APP-EX工具链实战解析

1. 项目概述与核心价值最近在整理个人工具箱时,又翻出了这个老伙计——Leech-AIO-APP-EX。这名字听起来有点黑客范儿,但说白了,它就是一个面向移动应用(特别是Android)的“一体化信息提取与分析工具包”。我最早接触这…...

从零实现极简GPT:用Rust手写Transformer,深入理解大模型原理

1. 项目概述:从零构建一个极简GPT 如果你对当下大语言模型(LLM)的内部工作原理感到好奇,但又对那些动辄数百GB、依赖庞大框架的代码库望而却步,那么 femtoGPT 这个项目可能就是为你准备的。它是一个用纯 Rust 语言从…...

浏览器扩展开发实战:智能搜索框聚焦工具的实现原理与应用

1. 项目概述:一个提升网页搜索效率的浏览器扩展作为一名长期与浏览器和各类网页打交道的开发者,我深知效率工具的价值。每天,我们都要在无数个网站上进行搜索——从电商平台找商品,到技术文档查API,再到新闻网站看资讯…...

Taotoken CLI工具一键配置开发环境与团队密钥管理

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken CLI工具一键配置开发环境与团队密钥管理 在接入多个大模型服务时,开发者通常需要处理不同厂商的API密钥、端点…...

从提示词工程到AI应用开发:方法论、工具链与实战优化

1. 项目概述:当“Awesome”遇见“Prompt”,一个提示词库的诞生 如果你最近在折腾大语言模型,无论是ChatGPT、Claude还是国内的文心一言、通义千问,那你肯定对“提示词”这个词不陌生。简单来说,提示词就是你跟AI对话时…...

LlamaIndex实战指南:构建高效RAG系统,解锁私有数据与LLM的智能连接

1. 项目概述:LlamaIndex,一个为LLM应用构建数据管道的开源框架 如果你正在尝试将私有数据与大语言模型(LLM)结合,构建一个能“理解”你公司文档、个人知识库或业务数据的智能应用,那你大概率会遇到一个核心…...

AI赋能射电天文:BRAIN项目如何革新ALMA数据处理

1. 项目概述:当AI遇见宇宙的“收音机”如果你对天文感兴趣,可能见过哈勃或韦伯望远镜拍回的绚丽星空照片,那是光学望远镜的杰作。但宇宙还有另一种“面孔”,它由无线电波描绘,冰冷、抽象,却蕴含着恒星诞生、…...

庄子给普通人的生存启迪

庄子给普通人的生存启迪:只求生存,不奢望其它——一套最低功耗的生存操作系统 一、序言:当“活着”成为最高目标 在你之前分析过的所有人物中——高俅在权力寄生中赢了每一局却输了整个时代,宋江被“忠君”认知病毒锁死走向自我毁灭,黄巢、李自成因认知破产而将江山拱手…...

多线程交替打印

package org.example;public class Main {// 计数器private static int count 0;public static void main(String[] args) throws InterruptedException {// 线程 1Thread thread1 new Thread(() -> {while (count < 100) {// 尝试获取锁synchronized (Main.class) {//…...

PrompTrek:统一AI编程助手配置,实现一次编写、处处运行

1. 项目概述&#xff1a;告别AI编辑器配置的“巴别塔”如果你和我一样&#xff0c;日常开发需要在GitHub Copilot、Cursor、Continue、Claude Code这些AI编程助手之间来回切换&#xff0c;那你一定体会过那种“配置地狱”的痛苦。每个编辑器都有自己的一套提示词&#xff08;Pr…...

ClaudeSync:连接本地与云端AI项目的自动化同步工具

1. 项目概述&#xff1a;ClaudeSync&#xff0c;一个连接本地与云端AI项目的桥梁 如果你和我一样&#xff0c;日常开发中重度依赖像Claude.ai这样的AI助手来辅助代码审查、架构设计甚至直接生成代码片段&#xff0c;那你一定遇到过这样的痛点&#xff1a;在本地IDE里改完代码&…...

OpenClaw-Otto-Travel:基于无头浏览器的配置化Web自动化与数据采集框架

1. 项目概述与核心价值 最近在GitHub上看到一个挺有意思的项目&#xff0c;叫 ottotheagent/openclaw-otto-travel 。光看名字&#xff0c;你可能会有点摸不着头脑&#xff0c;这“奥托旅行”和“OpenClaw”到底是个啥&#xff1f;其实&#xff0c;这是一个典型的 开源自动化…...

从零构建高性能内存数据库:架构设计与核心实现

1. 项目概述&#xff1a;从“BETAER-08/amdb”看一个数据库项目的诞生最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“BETAER-08/amdb”。光看这个名字&#xff0c;可能有点摸不着头脑&#xff0c;但如果你对数据库、特别是内存数据库或者高性能存储引擎有点兴趣&#x…...