从0开始深度学习(2)——自动微分

news2024/11/12 17:26:46

1 微积分

1.1 导数和微分

1.2 偏导数

1.3 梯度(gradient)

1.3.1 定义

对于一个多变量函数 f ( x 1 , x 2 , … , x n ) f\left(x_{1}, x_{2}, \ldots, x_{n}\right) f(x1,x2,,xn)其中点 a = ( a 1 , a 2 , … , a n ) \mathbf{a}=(a_1,a_2,\ldots,a_n) a=(a1,a2,,an) 处的梯度是一个向量,通常表示为 ∇ f ( a ) / grad ⁡ f ( a ) \nabla f(\mathbf{a})/\operatorname{grad}f(\mathbf{a}) f(a)/gradf(a)这个向量的各个分量是函数关于各个变量的偏导数,即: ∇ f ( a ) = ( ∂ f ∂ x 1 ( a ) , ∂ f ∂ x 2 ( a ) , … , ∂ f ∂ x n ( a ) ) \nabla f(\mathbf{a})=\left(\frac{\partial f}{\partial x_1}(\mathbf{a}),\frac{\partial f}{\partial x_2}(\mathbf{a}),\ldots,\frac{\partial f}{\partial x_n}(\mathbf{a})\right) f(a)=(x1f(a),x2f(a),,xnf(a))

1.3.2 梯度的意义

  1. 方向:梯度的方向指出了函数在该点处增长最快的方向。
  2. 大小:梯度的大小(或模长)表示了函数在该方向上的最大增长速率。
  3. 垂直性:梯度的方向与等值线(或等值面)垂直。

1.3.3 示例

假设我们有一个二维函数 f ( x , y ) = x 2 + y 2 f(x,y)=x^2+y^2 f(x,y)=x2+y2
计算梯度:
在这里插入图片描述
因此梯度为:
∇ f ( x , y ) = ( 2 x , 2 y ) \nabla f(x,y)=(2x,2y) f(x,y)=(2x,2y)
解释梯度:
在这里插入图片描述

1.3.4 应用

  1. 优化算法:在机器学习和深度学习中,梯度下降算法利用梯度的方向来寻找函数的局部最小值。
  2. 图像处理:梯度可以用来检测图像中的边缘。
  3. 物理学:梯度可以用来描述物理场的变化率,例如电势的梯度给出电场强度。

1.4 链式法则

2 自动微分

深度学习框架通过自动计算导数,即自动微分(automatic differentiation)来加快求导。 实际中,根据设计好的模型,系统会构建一个计算图(computational graph), 来跟踪计算是哪些数据通过哪些操作组合起来产生输出。 自动微分使系统能够随后反向传播梯度。 这里,反向传播(backpropagate)意味着跟踪整个计算图,填充关于每个参数的偏导数。

2.1 简单梯度计算示例

假设X是列向量[0,1,2,3],我们想对函数 y = 2 x ⊤ x y=2\mathbf{x}^{\top}\mathbf{x} y=2xx关于列向量X求导。首先,我们创建变量x并为其分配一个初始值。

2.1.1 手算

在这里插入图片描述
梯度为列向量[ 0., 4., 8., 12.]

2.1.2 代码计算

PS: 在计算前,需要一个地方来存储梯度,且不会在每次对一个参数求导时都分配新的内存,因为我们经常会成千上万次地更新相同的参数,每次都分配新的内存可能很快就会将内存耗尽

import torch

# 创建一个张量,并通过设置requires_grad属性来让PyTorch自动追踪所有涉及该张量的计算操作
# 即计算得到的梯度会保存到x.grad中
x = torch.arange(4.0,requires_grad=True)
print("x: ",x)
print("grad: ",x.grad)
y=2*torch.dot(x,x)
print("y: ",y)

# 调用反向传播函数来自动计算y关于x每个分量的梯度
y.backward()
# 打印梯度
print("grad: ",x.grad)

# result
'''
x:  tensor([0., 1., 2., 3.], requires_grad=True)
grad:  None
y:  tensor(28., grad_fn=<MulBackward0>)
grad:  tensor([ 0.,  4.,  8., 12.])
'''

2.2 非标量变量的反向传播

在深度学习中,神经网络的最后一层可能会输出多个向量或矩阵,而不是单一的标量值。例如,在多标签分类任务中,输出层可能会产生一个向量,其中每个元素对应一个类别的预测概率。

假设有一个向量y,由向量x通过线性变换得到:
y = W x + b \mathbf{y}=\mathbf{Wx}+\mathbf{b} y=Wx+b
x是输入向量,W是权重矩阵,b是偏置向量,y是输出向量

假设:
在这里插入图片描述

import torch

# 定义变量
x = torch.tensor([1.0, 2.0], requires_grad=True)
W = torch.tensor([[2.0, 3.0], [4.0, 5.0]])
b = torch.tensor([1.0, 1.0])
target = torch.tensor([5.0, 10.0])  # 目标向量

# 计算输出向量 y
y = torch.mm(W, x.unsqueeze(-1)).squeeze() + b

# 定义损失函数
loss = (y - target).pow(2).sum()

# 计算梯度
loss.backward()

# 输出梯度
print("Gradient of x: ", x.grad)

2.3 分离计算

指的是使用.detach()方法来分离一个张量的计算历史,使其不再参与自动梯度计算。

例如,假设y是作为x的函数计算的,而z则是作为yx的函数计算的,我们想计算z关于x的梯度,但由于某种原因,希望将y视为一个常数, 并且只考虑到xy被计算后发挥的作用。

在这里插入图片描述

import torch

x = torch.tensor([1.0, 2.0], requires_grad=True)
y = 2 * x + 1
# 将 y 视为常数,分离计算
y_detached = y.detach()
# 计算 z
z = y_detached + x
# 计算梯度
z.backward(torch.tensor([1.0, 1.0]))
print("Gradient of x: ", x.grad)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2095342.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【栈经典问题剖析】上

1.1进制转换 1.1.2思路图解&#xff1a; 每次将得到的余数存入栈中&#xff0c;直到商为0时&#xff0c;停止入栈。依次将栈中元素出栈并进行打印操作&#xff08;注意负数的符号情况&#xff09; //进制转换&#xff1a;10进制整数转换成8进制整数 #include <stdio.h>…

Google的MapReduce和Hadoop的MapReduce基本原理

Google的MapReduce和Hadoop的MapReduce基本原理 MapReduce框架的执行过程可以概述为以下几个关键步骤&#xff1a; 输入分割&#xff1a;用户程序中的MapReduce库首先将输入文件分割成M个片段&#xff0c;每个片段通常大小在16MB到64MB之间&#xff0c;用户可以通过可选参数控制…

【leetcode413周赛】——前两题python

3274. 检查棋盘方格颜色是否相同 给你两个字符串 coordinate1 和 coordinate2&#xff0c;代表 8 x 8 国际象棋棋盘上的两个方格的坐标。 以下是棋盘的参考图。 如果这两个方格颜色相同&#xff0c;返回 true&#xff0c;否则返回 false。 坐标总是表示有效的棋盘方格。坐标…

【indirect 函数 ★二级下拉菜单】

Indirect 函数 &#x1f33c;indirect函数参数&#x1f33c;应用&#xff1a;&#x1f33c;跨表引用同一单元格&#x1f33c;二级下拉列表 &#x1f33c;indirect函数参数 返回⬅️【文本字符串所指定的引用】 INDIRECT(ref_text,[a1]) 其中【ref_text】是引用的文本 [a1] 是…

大数据之数据湖Apache Hudi

一、Hudi框架概述 Apahe Hudi (Hadoop Upserts delete and Incrementals) 是Uber主导开发的开源数据湖框架&#xff0c;为了解决大数据生态系统中需要插入更新及增量消费原语的摄取管道和ETL管道的低效问题&#xff0c;该项目在2016年开始开发&#xff0c;并于2017年开源&#…

Mysql基础练习题 1084.销售分析3 (力扣)

编写解决方案&#xff0c;报告 2019年春季 才售出的产品。即 仅 在 2019-01-01 &#xff08;含&#xff09;至 2019-03-31 &#xff08;含&#xff09;之间出售的商品 题目链接&#xff1a; https://leetcode.cn/problems/sales-analysis-iii/description/ 建表插入数据&…

学习指纹浏览器 处理美团mtgsig1.2 环境检测

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 有相关问题请第一时间头像私信联系我…

恭喜各位天命人!2024年国自然基金放榜了!优青654项、杰青433项,附个人查询攻略

公众号&#xff1a;生信漫谈&#xff0c;获取最新科研信息&#xff01; 恭喜各位天命人&#xff01;2024年国自然基金放榜了&#xff01;优青654项、杰青433项&#xff0c;附个人查询攻略https://mp.weixin.qq.com/s?__bizMzkwNjQyNTUwMw&mid2247487048&idx1&sn1…

Webfunny前端监控如何搭建高并发使用场景

Webfunny可以支持千万级别PV的日活量了。但是&#xff0c;我们默认的部署配置&#xff0c;是无法支持这么高的日活量的&#xff0c;需要我们做一些支持高并发的配置和操作&#xff0c;下面让我们一起看下如何让webfunny支持更高的并发量吧&#xff0c;下图为webfunny高并发架构…

数据集格式转化

数据集格式转换的要点是从对应的格式中解析出对应的class和bbox 整体说明&#xff1a; lables_voc_dir&#xff1a; 为存放所有xml的标注文件夹&#xff0c;labels_yolo_dir: 为转换后存放所有xml的标注文件夹images_dir : 为所有图像文件的文件夹。、 注意&#xff1a;代码…

C++手撕简易list

目录 节点的准备 list类 push_back stl容器的遍历和修改 begin end ! 重载* 效果展示&#xff1a; const迭代器 方法一&#xff1a; 方法二&#xff1a; ->的重载 insert push_front erase 展示效果 pop_back && pop_front 效果展示 clear&am…

【 html+css 绚丽Loading 】000030 灵文闪烁符

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽Loading&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495…

【C++】继承相关知识详细梳理

1.继承简介 什么是继承&#xff1a; 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。 继承呈现了面向对象程序设计的层…

python破解[5分钟解决拼多多商家后台字体加密]

可【QQ群】拿源码 进入经营总览想把数据存下来发现返回的json数据部分空白如下 这可怎么办 稳住应该是字体的问题&#xff0c;可能是多多自己实现了某种字体&#xff0c;我们去找他的js 发现如我们所想&#xff0c;进行跟踪&#xff0c;发现的确是在css端进行了字体替换&am…

报警规范管理

报警规则管理 想要获取报警数据&#xff0c;我们首先必须先制定报警规则&#xff0c;会根据不同的设备&#xff0c;不同的物模型来定义报警规则 需求分析 我们先来分析需求&#xff0c;打开原型图 数据来源&#xff1a; 逻辑规则&#xff1a; 1&#xff09;若多条报警规则是…

CSS-层叠上下文【看这一篇就够了!!!】

目录 前序 z-index设置定位元素层叠顺序 z-index值相同时&#xff0c;写在后面的覆盖写在前面的 z-index值越大&#xff0c;越在上面显示 z-index值为负数 CSS中的层叠上下文 什么是“层叠上下文” 层叠上下文的创建 根层叠上下文 定位元素的传统层叠上下文 层叠顺序…

15:发光二极管布局要求

1.指示灯一般放正面&#xff0c; 靠板边

【Android】Material Design编写更好的UI

Toolbar 对于控件ActionBar我们非常熟悉&#xff0c;就是我们常见的标题栏&#xff0c;但ActionBar只能位于活动的顶部&#xff0c;因此我们更建议使用Toolbar。在新建一个项目的时候都是默认显示ActionBar&#xff0c;我们要使用Toolbar就需要先将标题栏改为不显示 先来看看…

在Ubuntu上使用apt工具安装RabbitMQ

创建安装脚本 cd home/ madir scripts cd scripts 创建脚本前&#xff0c;需要确认Linux版本。不同的版本对应着不同的运行脚本。 lsb_release -a 查看Linux版本 可以看到&#xff0c;我的Ubuntu版本是22.04。 在这里找到对应的脚本复制。 创建脚本文件&#xff1a; ca…

详解树状数组(C/C++)

树状数组&#xff08;Binary Indexed Tree&#xff0c;简称BIT或Fenwick Tree&#xff09;是一种用于高效处理数据序列的算法数据结构。它能够支持两个主要操作&#xff1a;单点更新和区间求和&#xff0c;这两个操作的时间复杂度都能达到O(log n)&#xff0c;其中 n 是数据序列…