李沐-动手学深度学习(五)自动求导
2022-06-16 本文已影响0人
minlover
1、向量链式法则
内积<x,w>=x^T*w=[x1*w1,x2*w2,...xn*wn]是个标量,标量对向量求导,是向量的转置维度
2、自动求导
(1)神经网络动不动几百层,很难手动计算
符号求导指把导数公式求出来。数值求导指不需要知道具体的f(x)形式。
(2)自动求导怎么做的:计算图——本质上等价于用链式法则求导的过程。
计算图是一个无环的图
(3)显示构造:Tensorflow、Theano、MXNet
(4)隐式构造:PyTorch、MXNet
(4)有了计算图后,两种自动求导的方式
前向需要把所有中间值存下来,反向时(那俩灰的导数如果不需要就可以不算了),需要把中间结果拿过来用
反向累积前,需要先正着来一遍计算复杂度0(n),然后反向累积的计算复杂度O(n)。
反向累积内存复杂度高O(n),因为需要把正向的中间结果储存下。所以深度神经网络很耗GPU资源。
下图中,上面的正向只反向的第一步,下面的正向指正向累积。
正向累积的好处是,内存复杂度O(1),不管多深,不用存储中间结果,但是缺点是,每计算一个变量的梯度需要扫一遍O(n)。所以神经网络中不太用,因为神经网络需要对每一层算梯度,正向累积计算复杂度太高。
chapter_preliminaries/autograd.ipynb
x是tensor([0., 1., 2., 3.])。y是一个向量,但是机器学习中很少对一个向量函数来求导,所以大部分情况都是对标量求导,绝大部分情况,会对y进行一个求和sum再求导。
这是因为机器学习的loss经常是一个标量。