【动手学深度学习】00-矩阵求导和自动求导

1.矩阵求导

1.1 标量导数(高中知识)

都是高中的知识
【动手学深度学习】00-矩阵求导和自动求导_第1张图片

1.2 亚导数

将导数拓展到不可导的情况

【动手学深度学习】00-矩阵求导和自动求导_第2张图片

1.3 梯度

将导数扩展到向量

【动手学深度学习】00-矩阵求导和自动求导_第3张图片

1.3.1 ∂ y / ∂ x \partial y/\partial\mathbf{x} y/x 底部是向量,上部是标量

由于向量在底部,所以求导之后结果的向量会反过来

【动手学深度学习】00-矩阵求导和自动求导_第4张图片

样例为下:

特别的就是,两个向量的内积为矩阵,sum一个向量,其导数为向量1的转置

【动手学深度学习】00-矩阵求导和自动求导_第5张图片

注意,对于 ∂ < w , x > ∂ w = x T \frac{\partial<\bold{w,x}>}{\partial\bold{w}} = \bold{x^T} w<w,x>=xT

1.3.2 ∂ y / ∂ x \partial \bold{y}/\partial x y/x 底部是标量,上部是向量

上部是向量的时候,求导不会反置了,这个叫做分子布局符号

【动手学深度学习】00-矩阵求导和自动求导_第6张图片

向量和向量

【动手学深度学习】00-矩阵求导和自动求导_第7张图片

样例:

注意第一行最后两列,a和A分别为和向量x无关的向量和矩阵

【动手学深度学习】00-矩阵求导和自动求导_第8张图片

1.3.3 拓展到矩阵(拓展内容)

同样,和向量一样,如果矩阵在下面,那么他的行和列的个数就会转一下

【动手学深度学习】00-矩阵求导和自动求导_第9张图片

2.自动求导

2.1 向量链式法则

类比标量的链式法则,重点就是维度要弄对

【动手学深度学习】00-矩阵求导和自动求导_第10张图片

例子1:

【动手学深度学习】00-矩阵求导和自动求导_第11张图片

例子2 :

【动手学深度学习】00-矩阵求导和自动求导_第12张图片

2.2 自动求导

对于神经网络几百层的神经,手动求导几乎不可能,所以使用自动求导计算。

自动求导计算一个函数在指定值上的导数,有别于:

  • 符号求导:给出表达式,求出导数表达式
  • 数值求导:不需要知道f(x)的样子,通过一些数值去拟合这个函数

2.2.1 计算图

pytorch中不需要使用,但是tansflow和mxnet中可以显示构造

有点类似于刚才的链式求导过程

  • 将代码分解为操作子
  • 将计算表示成一个无环的图

【动手学深度学习】00-矩阵求导和自动求导_第13张图片

  • 显示构造,TensorFlow MXNet
  • 隐式构造 MXNet PyTorch

2.2.2 自动求导的两种方式

  • 正向累积,从内往外
  • 反向累积、又称反向传递(大名鼎鼎)
    【动手学深度学习】00-矩阵求导和自动求导_第14张图片

2.2.3反向累积

例子:

先计算z关于b的导数为2b,由于之前计算过了b的结果,所以读取之前存的b的结果即可。

同理往下继续算,需要的结果就从之前计算存的结果中读取即可

【动手学深度学习】00-矩阵求导和自动求导_第15张图片

总结:

【动手学深度学习】00-矩阵求导和自动求导_第16张图片

复杂度

内存复杂度:O(n),因为需要存储正向的所有中间结果(这也是耗费GPU资源的原因)

【动手学深度学习】00-矩阵求导和自动求导_第17张图片

对于正向传播,如果计算一个变量的梯度,还需要再扫描一遍,复杂度太高。所以来说一般的神经网络几乎不会去用正向传播

你可能感兴趣的:(动手学深度学习,矩阵,深度学习,线性代数,pytorch)