标量、向量、矩阵微分与自动求导

本文探讨了自动求导的概念,包括它与符号和数值求导的区别,以及如何通过计算图来实现。介绍了正向和反向累积两种模式,并详细解析了反向累积的步骤及复杂度。自动求导在深度学习中对于优化模型参数至关重要,而计算图则有助于高效地执行这种优化过程。
摘要由CSDN通过智能技术生成

一图以蔽之(本文内容均为分子布局):

标量向量矩阵
x (1,)(n, 1)X (n, k)
标量y (1,)\frac{\partial y}{\partial x} (1,)\frac{\partial y}{\partial \textbf{x}} (1, n) \frac{\partial y}{\partial \textbf{X}} (k, n)
向量(m, 1)\frac{\partial \textbf{y}}{\partial {x}} (m, 1)\frac{\partial \textbf{y}}{\partial \textbf{x}} (m, n)\frac{\partial \textbf{y}}{\partial \textbf{X}} (m, k, n)
矩阵Y (m, l)\frac{\partial \textbf{Y}}{\partial x} (m, l)\frac{\partial \textbf{Y}}{\partial \textbf{x}} (m, l, n)\frac{\partial \textbf{Y}}{\partial \textbf{X}} (m, l, k, n)

几个重要公式:

\frac{\partial \left \| \textbf{x} \right \|^{2}}{\partial \textbf{x}}= 2\textbf{x}^{T}

\frac{\partial \left \langle \textbf{u},\textbf{v} \right \rangle}{\partial \textbf{x}}=\textbf{u}^{T}\frac{\partial \textbf{v}}{\partial \textbf{x}}+\textbf{v}^{T}\frac{\partial \textbf{u}}{\partial \textbf{x}}

\frac{\partial (\textbf{Ax})}{\partial \textbf{x}}=\textbf{A}

\frac{\partial (\textbf{x}^{T}\textbf{A})}{\partial \textbf{x}}=\textbf{A}^{T}

1.自动求导

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

                (1)符号求导(显式计算) 

In[1]:=D\left [ 4x^{3}+x^{2}+3,x \right ]

Out[1]=2x+12x^{2}

                 (2)数值求导(无需知道f(x)具体内容)

\frac{\partial f(x)}{\partial x}=\lim_{h\rightarrow 0}\frac{f(x+h)-f(x)}{h}

                        通过数值拟合,用一个很小很小的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.自动求导的两种模式

  • 链式法则:

\frac{\partial y}{\partial x}=\frac{\partial y}{\partial u_{n}}\frac{\partial u_{n}}{\partial u_{n-1}}...\frac{\partial u_{2}}{\partial u_{1}}\frac{\partial u_{1}}{\partial x}

  • 正向累积:

\frac{\partial y}{\partial x}=\frac{\partial y}{\partial u_{n}}(\frac{\partial u_{n}}{\partial u_{n-1}}(...(\frac{\partial u_{2}}{\partial u_{1}}\frac{\partial u_{1}}{\partial x})))

  • 反向累积(反向传递):

\frac{\partial y}{\partial x}=(((\frac{\partial y}{\partial u_{n}}\frac{\partial u_{n}}{\partial u_{n-1}})...)\frac{\partial u_{2}}{\partial u_{1}})\frac{\partial u_{1}}{\partial x}

        即backpropogation

         最后一行纠正一下,书对x求偏导,不是w

4.反向累积总结

构造计算图

前向:执行图,存储中间结果

反向:从相反方向执行图(去除不需要的枝)(需要的时候把之前中间结果拿过来用

 5.反向累积复杂度

  • 计算复杂度:O(n),n是操作子个数(即神经网络层数)
    • 通常正向和反向的代价类似
  • 内存复杂度:O(n),因为需要存储正向的所有中间结果

                                    此即为深度神经网络大量占用GPU资源的原因

  • 跟正向累积对比:
    • O(n)计算复杂度用来计算一个变量的梯度
    • O(1)内存复杂度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pi_kaqiu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值