一图以蔽之(本文内容均为分子布局):
标量 | 向量 | 矩阵 | ||
---|---|---|---|---|
x (1,) | x (n, 1) | X (n, k) | ||
标量 | y (1,) | (1,) | (1, n) | (k, n) |
向量 | y (m, 1) | (m, 1) | (m, n) | (m, k, n) |
矩阵 | Y (m, l) | (m, l) | (m, l, n) | (m, l, k, n) |
几个重要公式:
1.自动求导- 自动求导计算一个函数在指定值上的导数
- 它有别于
(1)符号求导(显式计算)
(2)数值求导(无需知道f(x)具体内容)
通过数值拟合,用一个很小很小的h
2.计算图- 将代码分解成 *** 作子
- 将计算表示成一个无环图
每个圈表示一个输入或计算
- 显式构造
from mxnet import sym
a = sym.var()
b = sym.var()
c = 2 * a + b
# bind data into a and b later
如Tensorflow/Theano/MXNet
- 隐式构造
from mxnet import autograde, nd
with autograde.record()
a = nd.ones((2, 1))
b = nd.ones((2, 1))
c = 2 * a + b
如PyTorch/MXNet
3.自动求导的两种模式- 链式法则:
- 正向累积:
- 反向累积(反向传递):
即backpropogation
最后一行纠正一下,书对x求偏导,不是w
4.反向累积总结构造计算图
前向:执行图,存储中间结果
反向:从相反方向执行图(去除不需要的枝)(需要的时候把之前中间结果拿过来用)
5.反向累积复杂度- 计算复杂度:O(n),n是 *** 作子个数(即神经网络层数)
- 通常正向和反向的代价类似
- 内存复杂度:O(n),因为需要存储正向的所有中间结果
此即为深度神经网络大量占用GPU资源的原因
- 跟正向累积对比:
- O(n)计算复杂度用来计算一个变量的梯度
- O(1)内存复杂度
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)