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

自动求导实现与可视化

前言

micrograd为一个自动梯度引擎,其实现了反向传播算法,用于学习理解深度学习中的自动求导原理。自动求导无论再传统的机器学习中还是深度学习或是目前非常热门的大语言模型GPT中其都是非常重要基础部分。

反向传播算法可以高效计算出神经网络中损失函数关于训练权重的梯度,使得可通过快速迭代调整权重已得到损失函数最小值,从而求得最佳权重;反向传播为各类深度学习神经网络框架的数学基础无论是PyTorch还是Tensorflow等其都是必不可少的。

micrograd的核心实现在于engine.py中,Value类定义了反向传播自动求导的具体实现,由于此框架是学习用的,只实现了标量的运算并没有涉及到矩阵运算;

原理

如有函数: y = x * w + b

前向传播:通过带入数据求出y,在将所计算的值带入损失函数求得误差值。
X为数据,w为权重,b为偏置(学习率)
平均损失函数为:loss = (y_t-y) **2
通过前向传播计算完后得到了:预测值y,损失值:loss

反向传播

在正向传播遍历计算图求出每个节点的值后通过反向遍历整个图,计算出每个节点的偏导,其原理为微积分链式法则,只需要一个前向传播、一个反向传播就可以求得所有参数的导数,所以性能很高。
根据前向传播所得到的损失值loss,计算得出loss关于模型参数w、b的梯度,然后调整模型参数w、b。
参数调整为:参数减去(梯度*学习率)
需关注重点为参数的梯度如何取得,这就是偏导数、链式法则的应用。

zero_grad(w,b)
loss.backward()
step(w,brate)

反复迭代,再误差达到指定精度或epochs时停止;

具体实现

def __init__(self, data, _children=(), _op=''):self.data = dataself.grad = 0# internal variables used for autograd graph constructionself._backward = lambda: Noneself._prev = set(_children)self._op = _op # the op that produced this node, for graphviz / debugging / etc

Value初始化中最重要两个参数,data保存元素原始数据,grad保存当前元素梯度。
_backward() 方法保存反向传播的方法,用于计算反向传播得到梯度
_prev保存当前节点前置节点。通过遍历获取_prev节点,可得到完整的运算链路。

def __add__(self, other):other = other if isinstance(other, Value) else Value(other)#加法运算out = Value(self.data + other.data, (self, other), '+')#加法方向传播实现def _backward():self.grad += out.gradother.grad += out.gradout._backward = _backwardreturn out

在加法中元素其梯度为其结果的梯度。
某个元素可能涉及到多个运算链路,所以其梯度为不同链路所确定的梯度之和。所以此处为 += out.grad。

def __mul__(self, other):other = other if isinstance(other, Value) else Value(other)out = Value(self.data * other.data, (self, other), '*')def _backward():self.grad += other.data * out.gradother.grad += self.data * out.gradout._backward = _backwardreturn out
def __pow__(self, other):assert isinstance(other, (int, float)), "only supporting int/float powers for now"out = Value(self.data**other, (self,), f'**{other}')def _backward():self.grad += (other * self.data**(other-1)) * out.gradout._backward = _backwardreturn out
def backward(self):# topological order all of the children in the graphtopo = []visited = set()def build_topo(v):if v not in visited:visited.add(v)for child in v._prev:build_topo(child)topo.append(v)build_topo(self)# go one variable at a time and apply the chain rule to get its gradientself.grad = 1for v in reversed(topo):v._backward()     

乘法与次方实现也分别使用了链式法则与f’(x)=nx^{n-1}导数公式。
乘数的梯度为:被乘数乘以结果的梯度
被乘数的梯度为:乘数乘以结果的梯度

验证

a = Value(2,'a')
b = Value(3,'b')
c = a * b**2
#c =a  + b
c.backward()
draw_dot(c)∂c/∂a=9
∂c/∂b=12

最后的最后

感谢你们的阅读和喜欢,我收藏了很多技术干货,可以共享给喜欢我文章的朋友们,如果你肯花时间沉下心去学习,它们一定能帮到你。

因为这个行业不同于其他行业,知识体系实在是过于庞大,知识更新也非常快。作为一个普通人,无法全部学完,所以我们在提升技术的时候,首先需要明确一个目标,然后制定好完整的计划,同时找到好的学习方法,这样才能更快的提升自己。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

五、面试资料

我们学习AI大模型必然是想找到高薪的工作,下面这些面试题都是总结当前最新、最热、最高频的面试题,并且每道题都有详细的答案,面试前刷完这套面试题资料,小小offer,不在话下。
在这里插入图片描述

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

相关文章:

  • 算法训练营day56
  • MT2096 数列分段
  • 六种图算法的python实现
  • 前端的强缓存和协商缓存
  • Pixi.js学习 (六)数组
  • 前端面试题日常练-day60 【面试题】
  • 鸿蒙轻内核M核源码分析系列六 任务及任务调度(2)任务模块
  • UnityAPI学习之Animator的基本使用
  • UE4获取动画序列资产的动画时长
  • 【Linux】I/O多路复用
  • B站画质补完计划(3):智能修复让宝藏视频重焕新生
  • SpringBoot整合SpringDataRedis
  • 附件采集文件类型识别方案
  • UML交互图-协作图
  • Kotlin 协程:从基础概念到开发实践
  • 【个人向】《HTTP图解》阅后小结
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • eclipse的离线汉化
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • go语言学习初探(一)
  • Java|序列化异常StreamCorruptedException的解决方法
  • Java的Interrupt与线程中断
  • KMP算法及优化
  • Linux中的硬链接与软链接
  • python学习笔记 - ThreadLocal
  • Redis 懒删除(lazy free)简史
  • Terraform入门 - 3. 变更基础设施
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • Vue.js 移动端适配之 vw 解决方案
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 从重复到重用
  • 计算机常识 - 收藏集 - 掘金
  • 坑!为什么View.startAnimation不起作用?
  • 利用jquery编写加法运算验证码
  • 前端面试之闭包
  • 由插件封装引出的一丢丢思考
  • 原生 js 实现移动端 Touch 滑动反弹
  • AI算硅基生命吗,为什么?
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • #pragma预处理命令
  • ${factoryList }后面有空格不影响
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (06)Hive——正则表达式
  • (21)起落架/可伸缩相机支架
  • (php伪随机数生成)[GWCTF 2019]枯燥的抽奖
  • (六)c52学习之旅-独立按键
  • (四)React组件、useState、组件样式
  • (详细文档!)javaswing图书管理系统+mysql数据库
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • ***详解账号泄露:全球约1亿用户已泄露
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .Net FrameWork总结
  • .Net IE10 _doPostBack 未定义
  • .net 无限分类