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

校园网站建设方案新闻发稿发布平台

校园网站建设方案,新闻发稿发布平台,wordpress转ios,永久免费的网站服务器有哪些平台文章目录前言自动求导实现非标量变量的反向传播分离计算Python控制流的梯度计算前言 关于走动求导的理论知识个人有点难以理解,推荐大家去看https://blog.csdn.net/weixin_42831564/article/details/135658138这篇文章,讲的很好。 自动求导实现 impor…

文章目录

    • 前言
    • 自动求导实现
    • 非标量变量的反向传播
    • 分离计算
    • Python控制流的梯度计算

前言

关于走动求导的理论知识个人有点难以理解,推荐大家去看https://blog.csdn.net/weixin_42831564/article/details/135658138这篇文章,讲的很好。

自动求导实现

import torchx = torch.arange(4.0)
print(x)

在这里插入图片描述

x.requires_grad_(True)

在这里插入图片描述

print(x.grad)

在这里插入图片描述

#计算y标量
y = 2 * torch.dot(x, x)
print(y)

在这里插入图片描述

y.backward()
print(x.grad)

在这里插入图片描述

print(x.grad == 4 * x)

在这里插入图片描述

x.grad.zero_(),x

在这里插入图片描述

y = x.sum()
y

在这里插入图片描述

y.backward(),y

在这里插入图片描述

print(x.grad)

在这里插入图片描述
为什么 y = x.sum() 的梯度是全 1?

在这里插入图片描述

非标量变量的反向传播

x.grad.zero_()
y = x * x
y.sum().backward()
print(x.grad)
x.grad == 2 * x

在这里插入图片描述
在这里插入图片描述

为什么 y = x * x 后需要 y.sum().backward()

在 PyTorch 中,backward() 只能对标量(scalar,即 0 维张量)进行反向传播,而不能直接对向量/矩阵进行反向传播。因此:

y = x * x 是一个逐元素乘法,得到的 y 仍然是和 x 形状相同的张量(如 [x₁², x₂², x₃², x₄²])。

如果直接调用 y.backward(),PyTorch 会报错,因为 y 不是标量。

解决方法:y.sum().backward()
为了计算 yx 的梯度,我们需要:

y 变成一个标量(通过 sum()mean() 或其他聚合操作)。

y.sum() 计算 x₁² + x₂² + x₃² + x₄²,得到一个标量。

调用 backward(),PyTorch 会自动计算梯度并存储到 x.grad

分离计算

在某层网络需要把参数固定的时候,会用到这个功能

在PyTorch中,y.detach()是一个用于从计算图中分离张量的方法。计算图是PyTorch用于自动微分的关键概念,用于构建和跟踪张量之间的操作。在计算图中,张量的计算历史被记录下来,以便在反向传播时计算梯度。但有时我们希望从计算图中分离出某个张量,使其不再与原始的计算历史关联。这在某些情况下是很有用的,例如当我们只关心使用该张量进行正向传播的结果,并且不需要计算梯度时。

当调用y.detach()时,将返回一个与y相同数据但不再与计算图关联的新张量。这意味着对返回的张量进行操作不会对原始计算图产生任何影响,也不会计算任何梯度。该方法可用于将张量作为输入传递给不允许梯度传播的函数或模型。

在这里插入图片描述

x.grad.zero_()
y = x * x
u = y.detach()  # 把y看成一个常数赋给u u与x无关,是一个常数
print(u)
z = u * x  # z对x的导数 
z.sum().backward()
print(x.grad)
print(u == x.grad)

在这里插入图片描述

# u是常数不是x的函数,y还是x的函数,还是可以对y求x的导数
x.grad.zero_()
y.sum().backward()
print(x.grad)
print(x.grad == 2*x)

在这里插入图片描述

Python控制流的梯度计算

在这里插入图片描述

def f(a):b = a * 2          # (1) b = 2awhile b.norm() < 1000:b = b * 2      # (2) 循环翻倍,直到 ||b|| ≥ 1000if b.sum() > 0:    # (3) 如果 b 的和 > 0,c = b;否则 c = 100*bc = belse:c = 100 * breturn c           # (4) 返回 ca = torch.randn(size=(), requires_grad=True)  # 随机初始化一个标量 a
d = f(a)                                     # 计算 d = f(a)
d.backward()                                 # 反向传播计算梯度
print(a)        # 打印 a 的值
print(d)        # 打印 d 的值
print(a.grad)   # 打印 a 的梯度
print(d / a)    # 计算 d / a
print(a.grad == d / a)  # 判断梯度是否等于 d / a

torch.randn()是一个用于生成服从标准正态分布(均值为0,标准差为1)的随机数的函数

为什么 a.grad == d / a?
关键在于 da 的关系:

da 的线性函数

无论 while 循环执行多少次,b 都是 a 的倍数(b = a * 2 * 2 * ... * 2)。

if-else 分支只是决定 c = bc = 100 * b,所以 c(即 d)仍然是 a 的倍数。

因此,d 可以表示为:d = k⋅a,其中 k 是一个常数(由 while 循环和 if-else 分支决定)。

梯度计算:

d = k * a 求导:在这里插入图片描述
由于 d = k * a,所以 k = d / a

因此:在这里插入图片描述
PyTorch 的 a.grad 存储的就是这个梯度值,所以 a.grad == d / a

http://www.dtcms.com/wzjs/266034.html

相关文章:

  • 漯河做网站哪家好网站点击量与排名
  • 电商网站建设目标分析的方法推广公司是做什么的
  • 苏州网站建设推广咨询平台百度正式员工工资待遇
  • 企业建网站服务网络广告策划方案范文
  • 做网站去哪找源码百度搜索资源平台官网
  • 松江做网站费用武汉seo优化排名公司
  • 网站怎么做微信推广潍坊网站建设seo
  • 河北邢台做wap网站郑州seo优化推广
  • 亚马逊网站建设评述百度指数app官方下载
  • 嘉兴建设教育网站培训中心网站公司网站设计制作
  • 郑州官网网站优化公司合肥seo优化排名公司
  • 网站建设费的账务处理willfast优化工具下载
  • 企业对做营销型网站有什么优势百度游戏排行榜
  • 手机怎么免费建设网站网络推广怎样做
  • 武汉建站系统seo网络优化是做什么的
  • 如何在国外网站做翻译兼职做app找什么公司
  • 酒店网站建设需求分析关键词排名优化报价
  • wordpress 控制台 慢安徽seo优化
  • 广州是不是又有疫情了seo优化总结
  • 网站建设有什么好建议搜一搜
  • 微网站难做么石家庄seo关键词排名
  • 哪个网站做推销产品整站seo优化公司
  • 做品牌特价的网站外链发布平台
  • 广州外贸网站建站百度网站官网入口网址
  • 潼南县大潼建设有限公司网站刚刚地震最新消息今天
  • 专业的深圳网站建设百度地图导航网页版
  • o2o网站设计方案公司宣传软文
  • 智联招聘网站怎么做两份简历模板吉林网络推广公司
  • 企业网站每天更新seo外包资讯
  • 做网页怎么建站点免费加客源软件