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

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 torchx = 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.rhkb.cn/news/414152.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YGG深海传奇,创造财富无限可能!

随著区块链技术的创新与游戏产业的深度融合&#xff0c;GameFi赛道迅速崛起&#xff0c;成为全球投资者与玩家瞩目的新兴领域。 成立于2020年的Yield Guild Games(YGG)&#xff0c;作为全球区块链游戏领域的先锋公会之一&#xff0c;也加入到向去中心化经济模式的转型浪潮当中。…

E. Sheep Eat Wolves

https://codeforces.com/gym/104869/problem/E 赛时队友想贪心&#xff0c;贪不了一点&#xff0c;我想了数学办法每次都送固定的发现送过去就不满足了 赛后补&#xff0c;暴力做O&#xff08;n4) 至少要几次才能把安全所有羊送到对岸去 考虑最短路,bfs,用数组存下所有状态 …

17:4层板层叠设置

层叠设置参考PCB专栏 设置平面内缩 GND内缩设置20mil0.508mm 电源层内缩设置要比GND内缩大&#xff0c;设置40mil1mm

米家商城主题 html 页面源码分享,可用于网页设计作业

使用技术&#xff1a; HTML, CSS , Javascript 项目亮点&#xff1a; 1. 仿照米家商城页面布局所做的页面样式结构 2. 首页放置了可自动切换的轮播图 3. 登录页有表单结构&#xff0c;并且有切换的动画效果 4. 包含实时的动态时间&#xff0c;使用 js 实现 5. 页面布局清…

Datawhale X 李宏毅苹果书AI夏令营深度学习详解入门Task02

本文了解深度学习详解中的线性模型 本文了解深度学习详解中的线性模型将围绕梯度下降优化、线性模型的局限性、改进模型以及深度学习模型等关键要点展开讨论。 一、梯度下降优化 梯度下降是深度学习中常用的优化算法&#xff0c;它通过不断调整模型的参数&#xff0c;使得损失函…

axios发送post请求实例

在body中的数据格式又有两种&#xff0c;一种是 json 数据格式&#xff0c;另一种是 字符串。具体要用哪种格式取决于后端入参的格式。 如果后端接收json数据类型&#xff0c;post 的 headers 需要设置 { ‘content-type’: ’application/json’ }&#xff0c;传给后端的数…

【王树森】BERT:预训练Transformer模型(个人向笔记)

前言 BERT&#xff1a;Bidirectional Encoder Representations from TransformerBERT是用来预训练Transformer模型的encoder的本节课只讲述主要思想BERT用两个主要思想来训练Transformer的encoder网络&#xff1a;①随机遮挡单词&#xff0c;让encoder根据上下文来预测被遮挡的…

Fine-Grained Egocentric Hand-Object(中文翻译)

精细化自我中心手-物体分割&#xff1a; 数据集、模型&#xff08;model&#xff09;与应用 灵芝张1, 盛昊周1, 西蒙斯滕特 $ {}^{2} $, 和健博石 $ {}^{1} $ 摘要。 自我中心视频提供了高保真度建模人类行为的细粒度信息。手和交互对象是理解观众行为和意图的一个关键方面。…

掌握 JavaScript 解构赋值的指南

JavaScript 的解构赋值是一种从数组 or 对象中提取值并将其赋给变量的语法。这种语法让我们从复杂的数据结构中提取数据变得简洁和易读。解构赋值可以用在数组、对象以及嵌套结构中。 解构是&#xff1a;使用 ES6 的一种语法规则&#xff0c;将一个对象或数组的某个属性提取到…

JavaSE-递归法解决二分查找、快速排序

704. 二分查找https://leetcode.cn/problems/binary-search/ package demo;public class BinarySearch {public static void main(String[] args) {BinarySearch brnew BinarySearch();System.out.println(br.search(new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9}, 8));}public int s…

[Tools: LoRA] Diffusers中Stable Diffusion的实现

实现底层原理 Diffusers中的Attention操作实现在AttnProcessor类&#xff08;diffusers.models.attention_processor.py&#xff09;&#xff0c;里面定义了单次Attention操作。添加LoRA&#xff0c;本质上是用LoRAAttnProcessor类替换AttnProcessor类。LoRAAttnProcessor中新…

浅谈如何入门微信小程序?

一. 何为微信小程序&#xff1f; 1. 微信小程序是一种全新的连接用户与服务的方式 2. 它可以在微信内被便捷地获取和传播&#xff0c;同时具有出色的使用体验 二. 如何开发小程序 1. 开发小程序的第一步&#xff1a; 你需要拥有一个小程序帐号&#xff0c;通过这个帐号你就…

vue如何引入element-ui

2.x用element-ui 3.x用element-plus https://blog.csdn.net/weixin_41207479/article/details/127066333 引入element-ui的三种方式

opencv之形态学

文章目录 1. 什么是形态学2. 形态学操作2.1 腐蚀2.2 膨胀2.3 通用形态学函数2.4 开运算2.5 闭运算2.6 形态学梯度运算2.7 礼帽运算2.8 黑帽运算 1. 什么是形态学 在图像处理领域&#xff0c;形态学是一种基于形状的图像分析技术&#xff0c;用于提取和处理图像的形态特征。这包…

前端与后端的身份认证

这里写目录标题 前端与后端的身份认证Web开发模式服务端渲染的Web开发模式前后端分离的Web开发模式根据场景选择开发模式 身份认证为什么需要身份认证不同开发模式下的身份认证 Session认证机制HTTP协议下的无状态性如何突破HTTP无状态的限制CookieCookie的几大特性&#xff1a…

Cadence高速板设计技巧(全志H3)[四]

HDMI常用的ESD器件&#xff1a; 可以看到一个器件可以做两路差分线的TVS防护&#xff1a; 按W键移动会把导线直接移走&#xff0c;这样显然是不行的&#xff1a; cadence中导线调节用的是快捷键e&#xff1a; 因此&#xff0c;虽然在某些场合下 eMMC 被称为 ROM&#xff0c;但…

Unity(2022.3.41LTS) - 地形

目录 一、地形的创建 二.页面详解 1.创建相邻的 Terrain 瓦片。 2.雕刻和绘制地形。 3.添加树。 4.添加细节&#xff0c;如草地、花朵和岩石。 5.更改所选 Terrain 的常规设置 三、地形编辑工具 四、地形的属性设置 五、地形的优化 六、地形的应用场景 一、地形的创…

C++八股文之语言基础篇

&#x1f916;个人主页&#xff1a;晚风相伴-CSDN博客 思维导图链接&#xff1a;C语言基础 持续更新中…… &#x1f496;如果觉得内容对你有帮助的话&#xff0c;还请给博主一键三连&#xff08;点赞&#x1f49c;、收藏&#x1f9e1;、关注&#x1f49a;&#xff09;吧 &…

vscode c++和cuda开发环境配置

文章目录 1. vscode 插件安装2. 开发环境配置2.1 bear 安装2.2 代码的编译2.2.1 编写Makefile文件2.2.2 bear make和make命令2.3 debug环境配置2.1 函数跳转设置2.1.1 ` c_cpp_properties.json` 设置2.1.2 settings.json设置2.2 调试环境配置2.2.1 tasks.json2.2.2 launch.json…

shell编程之条件语句(if)

目录 一、条件测试 1.1文件测试和整数测试 1.1.1 test命令 1.1.2 文件测试 1.2.3 整数值比较 1.2 字符串测试与逻辑测试 1.2.1 字符串比较 1.2.2 逻辑测试 二、if语句 2.1 if单分支语句 2.2 if双分支语句 2.3 if多分支语句 三、case分支语句 一、条件测试 1.1文件…