y.sum().backward()为什么需要.sum()的思考
这是2.5小节的内容,在网上看了一些回答后仍然不是很清楚,深入思考后忽然想明白了,在此记录一下,希望对和我一样有疑惑的人有所帮助 : )
首先,需要明确两点:
- backward是对标量的操作,没办法对向量进行操作
- 梯度是偏导数的集合
在清楚这个之后,我们仍然沿用书中的例子。
1. 结果为标量
如果关于向量x的函数为y = torch.dot(x, x) ,也就是点积,这个函数最后得到的是一个标量。如果我们的输入是x = [1, 2, 3],那么y = x1*x1 + x2*x2 + x3*x3 = 1 + 2 + 9 = 12,它的梯度就是[2x1, 2x2, 2x3] = [1, 4, 6]。以上都是我们在高数中学到的,容易理解。
2. 结果为向量
但是当关于x的函数为y = x*x时,就会变的复杂起来。同样的输入x = [1, 2, 3],得到的函数值为y = [x1*x1, x2*x2, x3*x3] = [1, 4, 9],这是一个向量。我们仍然想要求函数的偏导,并且也很清楚对于每一个输入,它的偏导就是[2x1, 2x2, 2x3] = [1, 4, 6],只是backward并不支持对向量的操作。因此,我们进行.sum()操作,将所有的输出加起来,y = x1*x1 + x2*x2 + x3*x3,在求梯度时会发现,虽然相加了起来,但是除了关于x1本身的运算之外,其他的运算会被当做常数项在偏导数中被消去,因此最终就可以得到不同的输入时的偏导,也就是梯度。
3. 理解
上面是一个很简答的例子,在神经网络里有大量的张量运算,要比这个复杂很多。我们进行.sum()的本质在于:偏导是函数的一个性质,对函数成立,我们得到的向量实际上是运算的集合,对向量中的每一个元素而言,都有自己的运算过程,也就是属于自己的函数。将这些结果加起来,再求偏导,等效于对每一个元素对应的函数单独求导。
以上是我并不成熟的思考,没有经过数学上的推理求证,如果有误,十分欢迎各位指出,非常感谢!!让我们一起学习吧!
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
更新于2025-2-8:
在学习强化学习过程中看到了随机优化算法,这才是随机梯度下降的合理的证明,之前仅仅是个人的推测,想了解的可以看一下!
y.sum().backward()为什么需要.sum()的思考的更多相关文章
- Subarray Sum & Maximum Size Subarray Sum Equals K
Subarray Sum Given an integer array, find a subarray where the sum of numbers is zero. Your code sho ...
- 编写一个求和函数sum,使输入sum(2)(3)或输入sum(2,3),输出结果都为5
昨天的笔试题,做的一塌糊涂,题目考的都很基础而且很细,手写代码对我来说是硬伤啊.其中有一道是这个,然而看到题目的时候,根本没有想到arguments:然后现在就恶补一下. arguments:用在函数 ...
- leetcode 112. Path Sum 、 113. Path Sum II 、437. Path Sum III
112. Path Sum 自己的一个错误写法: class Solution { public: bool hasPathSum(TreeNode* root, int sum) { if(root ...
- Subarray Sum & Maximum Size Subarray Sum Equals K && Subarray Sum Equals K
Subarray Sum Given an integer array, find a subarray where the sum of numbers is zero. Your code sho ...
- [LeetCode] Range Sum Query - Immutable & Range Sum Query 2D - Immutable
Range Sum Query - Immutable Given an integer array nums, find the sum of the elements between indice ...
- ORACEL12c求和SUM(a+b)与SUM(a)+SUM(b)结果不一致问题
今天在oracle12c数据库遇到的问题,下面重现一下: 1.先创建一个临时表 temp.一个数据表bitest_sum; -- Create table create table PEC.BITES ...
- leetcode 39. Combination Sum 、40. Combination Sum II 、216. Combination Sum III
39. Combination Sum 依旧与subsets问题相似,每次选择这个数是否参加到求和中 因为是可以重复的,所以每次递归还是在i上,如果不能重复,就可以变成i+1 class Soluti ...
- 39. Combination Sum + 40. Combination Sum II + 216. Combination Sum III + 377. Combination Sum IV
▶ 给定一个数组 和一个目标值.从该数组中选出若干项(项数不定),使他们的和等于目标值. ▶ 36. 数组元素无重复 ● 代码,初版,19 ms .从底向上的动态规划,但是转移方程比较智障(将待求数分 ...
- leetcode 1.Two Sum 、167. Two Sum II - Input array is sorted 、15. 3Sum 、16. 3Sum Closest 、 18. 4Sum 、653. Two Sum IV - Input is a BST
1.two sum 用hash来存储数值和对应的位置索引,通过target-当前值来获得需要的值,然后再hash中寻找 错误代码1: Input:[3,2,4]6Output:[0,0]Expecte ...
- 29.Combination Sum(和为sum的组合)
Level: Medium 题目描述: Given a set of candidate numbers (candidates) (without duplicates) and a targe ...
随机推荐
- How to grow old
An individual human existence should be like a river-small at first,narrowly contained within its ba ...
- ASP.NET Core 全球化和本地化
留备后观... Globalization and localization in ASP.NET Core 体验 ASP.NET Core 中的多语言支持(Localization)
- Quartz.NET - 教程 2: 作业和触发器
译者注: 目录在这 Quartz.NET 3.x 教程 原文在这 Lesson 2: Jobs And Triggers Quartz API Quartz API 的主要接口和类如下: ISched ...
- 洛谷 - B4276 [蓝桥杯青少年组国赛 2023] 八进制回文平方数 - 题解
题目传送门 主要思路 首先,这道题范围在 \(10^9\),我们不可能直接从 \(1\) 循环到 \(N\).我们不难看出,这道题是求平方数的八进制是否回文,那些不是平方数的例如 \(2\) 呀,\( ...
- Linux终端居然也可以做文件浏览器?
大家好,我是良许. 在抖音上做直播已经整整 5 个月了,我很自豪我一路坚持到了现在[笑脸] 最近我在做直播的时候,也开始学习鱼皮大佬,直播写代码.当然我不懂 Java 后端,因此就写写自己擅长的 Sh ...
- 即时通信SSE和WebSocket对比
Server-Sent Events (SSE) 和 WebSocket 都是用于实现服务器与客户端实时通信的技术,但它们在设计目标.协议特性和适用场景上有显著区别.以下是两者的详细对比: 一.核心区 ...
- js判断iOS还是Android
/** * 运行设备引擎, 即iOS, Android还是H5 * 返回值注意大小写 * @return iOS, Android, H5 */ function engineType() { let ...
- uniapp阻止Modal模态框关闭
要阻止uniapp的Modal模态框关闭,没有找到相关api,但可以通过保存配置立即打开的方式变相实现阻止关闭: const option = { title: "输入礼品券名称" ...
- 如何使用Streamlit快速创建仪表盘?
上文有快速带大家了解streamlit,因为工作需要,这两天尝试构建了仪表盘,也就是咱们常说的Dashboard,本篇文章将教你如何使用 Streamlit 快速创建一个简单的仪表盘. 前言 Stre ...
- Docker光速入门
1.docker是什么,能干什么 Docker 是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中 ...