跟着李沐学深度学习-矩阵计算-detach,backward函数

向量的导数

如果y是标量x是标量,结果就是标量。如果y是标量x是相邻则求导是x维度相同的向量。如果y是向量x是标量,那么求出来的导数和y维度相同。如果y和x是向量,则求导是一个矩阵
在这里插入图片描述

将向量拓展到矩阵

这张图的关系很好的表明了如果x和y做导数,拓展到矩阵求导上是什么形式。如果两个矩阵做梯度,那么梯度就是四维张量。梯度是往值变化最大的方向。
在这里插入图片描述
梯度是和等高线正交的
在这里插入图片描述
向量的函数的求导。求导中的运算。如果y和x无关求导是全0向量,y=au,求导是u关于x的导数。如果是sum(x)求导是全1,如果是x的模求导是2x的转置。y=u+v求导是导数和,导数积等于导数乘以函数的和,内积求导是u的转置乘以v的导数加v的转置乘u的导数
在这里插入图片描述

如果y是向量,x是标量。那么对于y求x的导数是向量。那么导数是分子布局符号。如果y是标量,x是向量那么导数是行向量叫做分母布局符号。
在这里插入图片描述向量关于向量求导,求出来是个矩阵。是每个y与每个x对应求导。

在这里插入图片描述
如果都是矩阵,那么在矩阵的求导就是如下,只介绍到了和的求导。x是矩阵,对y求x的导数是得到的对角矩阵I。
在这里插入图片描述

自动求导

由于神经网络有时候经常好几百层。所以需要自动求导。一般常用的数值求导是拟合一个导数,近似得到。用一个很小的h去求x的导数。
在这里插入图片描述
将代码分解成子操作。然后用图表示一个计算。
在这里插入图片描述
可以显示的构造一个计算图,也可以隐式的构造。
在这里插入图片描述
自动求导将链式法则变为计算图表示法的话。可以分为正向累积和反向累积又称反向传递。
在这里插入图片描述
正向和反向在计算图上的区别。正向计算是从下往上,反向计算是从上往下,就是著名的backpropogation
在这里插入图片描述
反向累积不需要存值。
在这里插入图片描述
内存复杂度很低,这样很费GPU资源
在这里插入图片描述

使用backward来反向传递计算梯度

调用backward求y关于x的梯度。然后输出x的梯度。
在这里插入图片描述
默认情况下pytorch会把所有梯度累积起来。所以算下一个函数的梯度时要用grad.zero_()来算。pytorch里下划线代表重写变量的内容。
在这里插入图片描述

backward()函数

在深度学习中绝大部分是对标量求导,很少向量对向量求导。所以如果x和y都是向量的话,需要对y做一个求和符号。再采用backward求导。
在这里插入图片描述

detach函数

detach 表示将y当做一个常数而不是关于x的函数。意思就是不对y求导。当需要把网络中某些参数保留。就用detach固定。简而言之就是这个变量不参与求导。
在这里插入图片描述
计算控制流的时候,pytorch也可以求它的梯度
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_36820823/article/details/123757371
今日推荐