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

向量的导数

如果y是标量x是标量,结果就是标量。如果y是标量x是相邻则求导是x维度相同的向量。如果y是向量x是标量,那么求出来的导数和y维度相同。如果y和x是向量,则求导是一个矩阵
跟着李沐学深度学习-矩阵计算-detach,backward函数_第1张图片

将向量拓展到矩阵

这张图的关系很好的表明了如果x和y做导数,拓展到矩阵求导上是什么形式。如果两个矩阵做梯度,那么梯度就是四维张量。梯度是往值变化最大的方向。
跟着李沐学深度学习-矩阵计算-detach,backward函数_第2张图片
梯度是和等高线正交的
跟着李沐学深度学习-矩阵计算-detach,backward函数_第3张图片
向量的函数的求导。求导中的运算。如果y和x无关求导是全0向量,y=au,求导是u关于x的导数。如果是sum(x)求导是全1,如果是x的模求导是2x的转置。y=u+v求导是导数和,导数积等于导数乘以函数的和,内积求导是u的转置乘以v的导数加v的转置乘u的导数
跟着李沐学深度学习-矩阵计算-detach,backward函数_第4张图片

如果y是向量,x是标量。那么对于y求x的导数是向量。那么导数是分子布局符号。如果y是标量,x是向量那么导数是行向量叫做分母布局符号。
跟着李沐学深度学习-矩阵计算-detach,backward函数_第5张图片向量关于向量求导,求出来是个矩阵。是每个y与每个x对应求导。

跟着李沐学深度学习-矩阵计算-detach,backward函数_第6张图片
如果都是矩阵,那么在矩阵的求导就是如下,只介绍到了和的求导。x是矩阵,对y求x的导数是得到的对角矩阵I。
跟着李沐学深度学习-矩阵计算-detach,backward函数_第7张图片

自动求导

由于神经网络有时候经常好几百层。所以需要自动求导。一般常用的数值求导是拟合一个导数,近似得到。用一个很小的h去求x的导数。
跟着李沐学深度学习-矩阵计算-detach,backward函数_第8张图片
将代码分解成子操作。然后用图表示一个计算。
跟着李沐学深度学习-矩阵计算-detach,backward函数_第9张图片
可以显示的构造一个计算图,也可以隐式的构造。
跟着李沐学深度学习-矩阵计算-detach,backward函数_第10张图片
自动求导将链式法则变为计算图表示法的话。可以分为正向累积和反向累积又称反向传递。
跟着李沐学深度学习-矩阵计算-detach,backward函数_第11张图片
正向和反向在计算图上的区别。正向计算是从下往上,反向计算是从上往下,就是著名的backpropogation
跟着李沐学深度学习-矩阵计算-detach,backward函数_第12张图片
反向累积不需要存值。
跟着李沐学深度学习-矩阵计算-detach,backward函数_第13张图片
内存复杂度很低,这样很费GPU资源
跟着李沐学深度学习-矩阵计算-detach,backward函数_第14张图片

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

调用backward求y关于x的梯度。然后输出x的梯度。
跟着李沐学深度学习-矩阵计算-detach,backward函数_第15张图片
默认情况下pytorch会把所有梯度累积起来。所以算下一个函数的梯度时要用grad.zero_()来算。pytorch里下划线代表重写变量的内容。
跟着李沐学深度学习-矩阵计算-detach,backward函数_第16张图片

backward()函数

在深度学习中绝大部分是对标量求导,很少向量对向量求导。所以如果x和y都是向量的话,需要对y做一个求和符号。再采用backward求导。
跟着李沐学深度学习-矩阵计算-detach,backward函数_第17张图片

detach函数

detach 表示将y当做一个常数而不是关于x的函数。意思就是不对y求导。当需要把网络中某些参数保留。就用detach固定。简而言之就是这个变量不参与求导。
跟着李沐学深度学习-矩阵计算-detach,backward函数_第18张图片
计算控制流的时候,pytorch也可以求它的梯度
跟着李沐学深度学习-矩阵计算-detach,backward函数_第19张图片

你可能感兴趣的:(深度强化学习技术与车间调度,其他,matlab,算法)