1.矩阵求导
1.1 标量导数(高中知识)
都是高中的知识
1.2 亚导数
将导数拓展到不可导的情况
1.3 梯度
将导数扩展到向量
1.3.1 ∂ y / ∂ x \partial y/\partial\mathbf{x} ∂y/∂x 底部是向量,上部是标量
由于向量在底部,所以求导之后结果的向量会反过来
样例为下:
特别的就是,两个向量的内积为矩阵,sum一个向量,其导数为向量1的转置
注意,对于 ∂ < 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 底部是标量,上部是向量
上部是向量的时候,求导不会反置了,这个叫做分子布局符号
向量和向量:
样例:
注意第一行最后两列,a和A分别为和向量x无关的向量和矩阵
1.3.3 拓展到矩阵(拓展内容)
同样,和向量一样,如果矩阵在下面,那么他的行和列的个数就会转一下
2.自动求导
2.1 向量链式法则
类比标量的链式法则,重点就是维度要弄对
例子1:
例子2 :
2.2 自动求导
对于神经网络几百层的神经,手动求导几乎不可能,所以使用自动求导计算。
自动求导计算一个函数在指定值上的导数,有别于:
- 符号求导:给出表达式,求出导数表达式
- 数值求导:不需要知道f(x)的样子,通过一些数值去拟合这个函数
2.2.1 计算图
pytorch中不需要使用,但是tansflow和mxnet中可以显示构造
有点类似于刚才的链式求导过程
- 将代码分解为操作子
- 将计算表示成一个无环的图
- 显示构造,TensorFlow MXNet
- 隐式构造 MXNet PyTorch
2.2.2 自动求导的两种方式
- 正向累积,从内往外
- 反向累积、又称反向传递(大名鼎鼎)
2.2.3反向累积
例子:
先计算z关于b的导数为2b,由于之前计算过了b的结果,所以读取之前存的b的结果即可。
同理往下继续算,需要的结果就从之前计算存的结果中读取即可
总结:
复杂度
内存复杂度:O(n),因为需要存储正向的所有中间结果(这也是耗费GPU资源的原因)
对于正向传播,如果计算一个变量的梯度,还需要再扫描一遍,复杂度太高。所以来说一般的神经网络几乎不会去用正向传播