【自动微分】前向微分和反向微分

前向和反向微分都和Jacobian矩阵相关,同时它也可以帮助理解,所以从Jacobian矩阵谈起。

1. Jacobian Matrix雅各比矩阵

给定函数 f : R n → R m f: R^n \rightarrow R^m f:RnRm和向量 Y ∈ R m Y\in{R^m} YRm 使得 ∀ X ∈ R n \forall{X}\in{R^n} XRn 都有
A ( X ) = L ( X ) + Y A(X)=L(X)+Y A(X)=L(X)+Y
A ( X ) A(X) A(X)是一个仿射函数.
对于一个点 X ( 0 ) ∈ R m X^{(0)}\in{R^m} X(0)Rm,希望找到一个仿射函数 A A A来近似函数 f f f,即尽可能使
A ( X ( 0 ) ) = f ( X ( 0 ) ) A(X^{(0)})=f(X^{(0)}) A(X(0))=f(X(0))
于是使
Y = f ( X ( 0 ) ) − L ( X ( 0 ) ) Y=f(X^{(0)})-L(X^{(0)}) Y=f(X(0))L(X(0))
利用线性函数的性质有
A ( X ) = L ( X − X ( 0 ) ) + f ( X ( 0 ) ) A(X)=L(X-X^{(0)})+f(X^{(0)}) A(X)=L(XX(0))+f(X(0))
f f f X ( 0 ) ∈ R n X^{(0)}\in{R^n} X(0)Rn处可微
lim ⁡ X → X ( 0 ) , X ∈ R n ∥ f ( X ) − ( L ( X − X ( 0 ) ) + f ( X ( 0 ) ) ) ∥ ∥ X − X ( 0 ) ∥ = 0 \lim_{X\rightarrow{X^{(0)},X\in{R^n}}}\frac{\|f(X)-(L(X-X^{(0)})+f(X^{(0)}))\|}{\|X-X^{(0)}\|}=0 XX(0),XRnlimXX(0)f(X)(L(XX(0))+f(X(0)))=0
L L L f f f X ( 0 ) X^{(0)} X(0)的导数。于是设求导对应的矩阵为 J J J,引入 R n R^n Rn空间的标准基 e 1 , e 2 , . . . , e n e_1,e_2,...,e_n e1,e2,...,en考虑在方向 j j j上对于点 X ( 0 ) X^{(0)} X(0)有微小变化的向量 X ( j ) = X ( 0 ) + t e j , j = 1 , 2 , . . . , n X^{(j)}=X^{(0)}+te_j,j=1,2,...,n X(j)=X(0)+tej,j=1,2,...,n,即
L ( X − X ( 0 ) ) = t J e j L(X-X^{(0)})= tJe_j L(XX(0))=tJej
由导数的定义得
lim ⁡ X → X ( 0 ) , X ∈ R n f ( X ( j ) ) − f ( X ( 0 ) ) t = J e j \lim_{X\rightarrow{X^{(0)},X\in{R^n}}}\frac{f(X^{(j)})-f(X^{(0)})}{t}=Je_j XX(0),XRnlimtf(X(j))f(X(0))=Jej
等号右边表示这是矩阵 J J J的第j列,等号左边即为 f f f关于 X ( j ) X^{(j)} X(j)的偏导数 ∂ f ∂ X ( j ) ( X ( 0 ) ) . \frac{\partial{f}}{\partial{X^{(j)}}}(X^{(0)}). X(j)f(X(0)).

下面有
f ( X ) = [ f 1 ( X ( 0 ) ) f 2 ( X ( 0 ) ) . . . f m ( X ( 0 ) ) ] f(X)=\left[ \begin{matrix} f_1(X^{(0)}) \\ f_2(X^{(0)}) \\ ...\\ f_m(X^{(0)}) \\ \end{matrix} \right] f(X)=f1(X(0))f2(X(0))...fm(X(0))
那么有矩阵
J = [ ∂ f ∂ X ( 1 ) ( X ( 0 ) ) ∂ f ∂ X ( 2 ) ( X ( 0 ) ) ⋯ ∂ f ∂ X ( n ) ( X ( 0 ) ) ] J= \left[ \begin{matrix} \frac{\partial{f}}{\partial{X^{(1)}}}(X^{(0)})&& \frac{\partial{f}}{\partial{X^{(2)}}}(X^{(0)})&& \cdots&& \frac{\partial{f}}{\partial{X^{(n)}}}(X^{(0)})&& \end{matrix} \right] J=[X(1)f(X(0))X(2)f(X(0))X(n)f(X(0))]
= [ ∂ f 1 ∂ X ( 1 ) ( X ( 0 ) ) ∂ f 1 ∂ X ( 2 ) ( X ( 0 ) ) ⋯ ∂ f 1 ∂ X ( n ) ( X ( 0 ) ) ∂ f 2 ∂ X ( 1 ) ( X ( 0 ) ) ∂ f 2 ∂ X ( 2 ) ( X ( 0 ) ) ⋯ ∂ f 2 ∂ X ( n ) ( X ( 0 ) ) ∂ f 3 ∂ X ( 1 ) ( X ( 0 ) ) ∂ f 3 ∂ X ( 2 ) ( X ( 0 ) ) ⋯ ∂ f 3 ∂ X ( n ) ( X ( 0 ) ) ⋮ ⋮ ⋱ ⋮ ∂ f m ∂ X ( 1 ) ( X ( 0 ) ) ∂ f m ∂ X ( 2 ) ( X ( 0 ) ) ⋯ ∂ f m ∂ X ( n ) ( X ( 0 ) ) ] =\left[ \begin{matrix} \frac{\partial{f_1}}{\partial{X^{(1)}}}(X^{(0)}) && \frac{\partial{f_1}}{\partial{X^{(2)}}}(X^{(0)})&& \cdots&& \frac{\partial{f_1}}{\partial{X^{(n)}}}(X^{(0)})\\ \\ \frac{\partial{f_2}}{\partial{X^{(1)}}}(X^{(0)}) && \frac{\partial{f_2}}{\partial{X^{(2)}}}(X^{(0)})&& \cdots&& \frac{\partial{f_2}}{\partial{X^{(n)}}}(X^{(0)})\\ \\ \frac{\partial{f_3}}{\partial{X^{(1)}}}(X^{(0)}) && \frac{\partial{f_3}}{\partial{X^{(2)}}}(X^{(0)})&& \cdots&& \frac{\partial{f_3}}{\partial{X^{(n)}}}(X^{(0)})\\ \vdots&&\vdots&&\ddots&&\vdots\\ \frac{\partial{f_m}}{\partial{X^{(1)}}}(X^{(0)}) && \frac{\partial{f_m}}{\partial{X^{(2)}}}(X^{(0)})&& \cdots&& \frac{\partial{f_m}}{\partial{X^{(n)}}}(X^{(0)})\\ \end{matrix} \right] =X(1)f1(X(0)X(1)f2(X(0)X(1)f3(X(0)X(1)fm(X(0)X(2)f1(X(0)X(2)f2(X(0)X(2)f3(X(0)X(2)fm(X(0)X(n)f1(X(0)X(n)f2(X(0)X(n)f3(X(0)X(n)fm(X(0)
称此 J m × n ( X ( 0 ) ) J_{m\times{n}}(X^{(0)}) Jm×n(X(0)) f f f在点 X ( 0 ) X^{(0)} X(0)的Jacobian矩阵或导数矩阵.
则有 J m × n ( X ) J_{m\times{n}}(X) Jm×n(X)是函数 f f f的Jacobian矩阵,它表示了一个多维向量函数的最佳线性逼近。

2. Automatic Differentiation自动微分

自动微分是介于符号计算和数值计算之间的一种求微分方式,先将符号微分作为基本的算子,用基本算子将input/中间结果组织起来得到新的中间结果并保存起来,而后应用于整个函数的微分,其本质是图计算。
主要利用了链式法则(Chain rule),有前向微分(Forward/Tangent Differentiation)和反向微分(Reverse/Adjoint Differentiation)两个模式,选择何种模式取决于input的维度和output的维度,以能更快速高效地求微分。

链式法则:
S u p p o s e v n ( v n − 1 ( v n − 2 ⋯ ( v 1 ( x ) ) ) ) , t h e n d y d x = d y d v n d v n d v n − 1 d v n − 1 d v n − 2 ⋯ d v 2 d v 1 d v 1 d x Suppose\enspace v_n(v_{n-1}(v_{n-2}\cdots(v_1(\mathbf{x})))) ,then\\ \frac{d\mathbf{y}}{d\mathbf{{x}}}= \frac{d\mathbf{y}}{dv_n} \frac{dv_{n}}{dv_{n-1}} \frac{dv_{n-1}}{dv_{n-2}} \cdots \frac{dv_{2}}{dv_{1}} \frac{dv_1}{d\mathbf{{x}}} Supposevn(vn1(vn2(v1(x)))),thendxdy=dvndydvn1dvndvn2dvn1dv1dv2dxdv1
可以设 v 0 = x , d v 0 d v 0 = 1 v_0=\mathbf{x}, \frac{dv_0}{dv_0}=1 v0=xdv0dv0=1
前向微分,即是从右向左计算,而反向微分反之。
那么计算是如何进行的呢?

2.1 Forward Differentiation前向微分

引入Tangent derivative:
y ˙ = ∂ y ∂ x \dot{y}=\frac{\partial{y}}{\partial{x}} y˙=xy
x是choosen variable,就是 ∂ x \partial{x} x在分子中保持不变。

先简单地考虑函数 f 1 ( x 1 , x 2 ) = x 2 sin ⁡ x 1 + x 2 2 f_1(x_1,x_2)=x_2\sin{x_1}+x_2^2 f1(x1,x2)=x2sinx1+x22,输入.
对于变量 x 1 x_1 x1,有
v 0 = x 1 v 0 ˙ = ∂ v 0 ∂ x 1 = 1 v 1 = x 2 v 1 ˙ = ∂ v 1 ∂ x 1 = 0 v 2 = sin ⁡ v 0 v 3 ˙ = ∂ v 2 ∂ x 1 = v 0 ˙ cos ⁡ v 0 = cos ⁡ x 1 v 3 = v 1 v 2 v 3 ˙ = ∂ v 3 ∂ x 1 = v 1 ˙ v 2 + v 1 v 2 ˙ = x 2 cos ⁡ x 1 v 4 = v 1 2 v 4 ˙ = ∂ v 4 ∂ x 1 = 2 v 1 v 1 ˙ = 0 v 5 = v 3 + v 4 v 5 ˙ = ∂ v 5 ∂ x 1 = v 3 ˙ + v 4 ˙ = x 2 cos ⁡ x 1 v_0=x_1 \enspace\enspace \dot{v_0}=\frac{\partial{v_0}}{\partial{x_1}}=1 \\ v_1=x_2 \enspace\enspace \dot{v_1}=\frac{\partial{v_1}}{\partial{x_1}}=0 \\ v_2=\sin{v_0} \enspace\enspace \dot{v_3}=\frac{\partial{v_2}}{\partial{x_1}}=\dot{v_0}\cos{v_0}=\cos{x_1} \\ v_3=v_1v_2 \enspace\enspace \dot{v_3}=\frac{\partial{v_3}}{\partial{x_1}}= \dot{v_1}v_2+v_1\dot{v_2}=x_2\cos{x_1} \\ v_4=v_1^2 \enspace\enspace \dot{v_4}=\frac{\partial{v_4}}{\partial{x_1}}= 2v_1\dot{v_1}=0 \\ v_5= v_3+v_4 \enspace\enspace \dot{v_5}=\frac{\partial{v_5}}{\partial{x_1}}= \dot{v_3}+\dot{v_4}=x_2\cos{x_1} \\ v0=x1v0˙=x1v0=1v1=x2v1˙=x1v1=0v2=sinv0v3˙=x1v2=v0˙cosv0=cosx1v3=v1v2v3˙=x1v3=v1˙v2+v1v2˙=x2cosx1v4=v12v4˙=x1v4=2v1v1˙=0v5=v3+v4v5˙=x1v5=v3˙+v4˙=x2cosx1
v_6是我们要求的 ∂ f 1 ∂ x 1 \frac{\partial{f_1}}{\partial{x_1}} x1f1.
同理,对于x_2,再进行一次上述操作.
v 0 = x 1 v 0 ˙ = ∂ v 0 ∂ x 2 = 0 v 1 = x 2 v 1 ˙ = ∂ v 1 ∂ x 2 = 1 v 2 = sin ⁡ v 0 v 2 ˙ = ∂ v 2 ∂ x 2 = v 0 ˙ cos ⁡ v 0 = 0 v 3 = v 1 v 2 v 3 ˙ = ∂ v 3 ∂ x 2 = v 1 ˙ v 2 + v 1 v 2 ˙ = sin ⁡ x 1 v 4 = v 1 2 v 4 ˙ = ∂ v 4 ∂ x 2 = 2 v 1 v 1 ˙ = 2 x 2 v 5 = v 3 + v 4 v 5 ˙ = ∂ v 5 ∂ x 2 = v 3 ˙ + v 4 ˙ = sin ⁡ x 1 + 2 x 2 v_0=x_1 \enspace\enspace \dot{v_0}=\frac{\partial{v_0}}{\partial{x_2}}=0 \\ v_1=x_2 \enspace\enspace \dot{v_1}=\frac{\partial{v_1}}{\partial{x_2}}=1 \\ v_2=\sin{v_0} \enspace\enspace \dot{v_2}=\frac{\partial{v_2}}{\partial{x_2}}=\dot{v_0}\cos{v_0}=0 \\ v_3=v_1v_2 \enspace\enspace \dot{v_3}=\frac{\partial{v_3}}{\partial{x_2}}=\dot{v_1}v_2+v_1\dot{v_2}=\sin{x_1} \\ v_4=v_1^2 \enspace\enspace \dot{v_4}=\frac{\partial{v_4}}{\partial{x_2}}= 2v_1\dot{v_1}=2x_2 \\ v_5= v_3+v_4 \enspace\enspace \dot{v_5}=\frac{\partial{v_5}}{\partial{x_2}}= \dot{v_3}+\dot{v_4}=\sin{x_1}+2x_2 \\ v0=x1v0˙=x2v0=0v1=x2v1˙=x2v1=1v2=sinv0v2˙=x2v2=v0˙cosv0=0v3=v1v2v3˙=x2v3=v1˙v2+v1v2˙=sinx1v4=v12v4˙=x2v4=2v1v1˙=2x2v5=v3+v4v5˙=x2v5=v3˙+v4˙=sinx1+2x2
v_6是我们要求的 ∂ f 1 ∂ x 2 \frac{\partial{f_1}}{\partial{x_2}} x2f1
当我们给一个input时,每一个中间变量 v i v_i vi及其 v i ˙ \dot{v_i} vi˙都可以求出其值。

如果我们再给一个 f 2 f_2 f2那么我们可以并行地对 ∂ f i ∂ x 1 , i = 1 , 2 \frac{\partial{f_i}}{\partial{x_1}},i=1,2 x1fii=12和进行求算,它们共用同一套基础算子。对 ∂ f i ∂ x 1 , i = 1 , 2 \frac{\partial{f_i}}{\partial{x_1}},i=1,2 x1fii=12求算完后,再对 ∂ f i ∂ x 2 , i = 1 , 2 \frac{\partial{f_i}}{\partial{x_2}},i=1,2 x2fii=12进行求算。

从上面的例子可以看到,每当我们对input中的一个 x i x_i xi进行一次单独的前向传递;对于不同的 x i x_i xi,需要重复进行前向传递。
可以用雅各比矩阵来形象地解释:在前向微分模式下,每对一个 x i , i = 1 , 2 , . . . n x_i,i=1,2,...n xii=12...n做一次前向传递都会输出雅各比矩阵相对应的一列,这个列向量的所有元素都是可以并行计算出来的;要产生完整的雅各比矩阵,将会重复n次这样的计算。

如何编程实现上面的计算?
1)运算符重载:由于前向微分的顺序和求算函数值的顺序是一样的,所以可以写一个类,在类中进行运算符重载,以处理导数运算。
2)源代码转换:根据输入的原函数生成一个新的函数,将其暴露给编译器,这比运算符重载更高效,但实现起来也更困难。

回到理论:
对于函数 f : R n → R m f: R^n \rightarrow R^m f:RnRm,当 n ≪ m n\ll{m} nm时,前向微分可以节省很多时间。
但在机器学习等领域,我们要面对的是几乎都是 n ≫ m n\gg{m} nm的情况。于是,我们还有另一个适用于这种条件的模式:反向微分。

2.2 Reverse Differentiation反向微分

引入Adjoint derivative:
y ˉ = ∂ y ∂ x \bar{y}=\frac{\partial{y}}{\partial{x}} yˉ=xy
y是choosen variable,就是 ∂ y \partial{y} y在分子中保持不变。

我们回忆一下,在前向微分中前向传递计算中间变量的同时计算其导数,最终自然而然地就求得了原函数的导数。

而对于反向微分,我们有两部分操作:
对于给定的函数 f ( x 1 , x 2 , . . . , x n ) f(x_1,x_2,...,x_n) f(x1,x2,...,xn)和一个input。
step 1:
一个计算中间变量,同时将每个中间变量的依赖关系存起来(就是建立一个有向图),而非同时计算相对应的导数。
step 2:
完成step1后,我们会得到原函数的输出,于是我们用这个输出计算其偏导数 f ˉ \bar{f} fˉ,将它看作一个中间变量,然后从这里反向传递,一次性求 x 1 ˉ , x 2 ˉ , . . . , x n ˉ \bar{x_1},\bar{x_2},...,\bar{x_n} x1ˉ,x2ˉ,...,xnˉ。有下面式子:
v i ˉ = ∂ f ∂ v i = ∑ j : c h i l d o f i v j ˉ ∂ v j ∂ v i \bar{v_i}=\frac{\partial{f}}{\partial{v_i}}= \sum_{j:child\enspace of \enspace i}\bar{v_j} \frac{\partial{v_j}}{\partial{v_i}} viˉ=vif=j:childofivjˉvivj

可以知道,在step1前向传递时我们要记录下来的是 ∂ f ∂ v i \frac{\partial{f}}{\partial{v_i}} vif,而 v j ˉ \bar{v_j} vjˉ则是在反向传递是要做的计算。容易知道,对于最后一个节点(也就是input对应的函数值),其 v j ˉ = 1 \bar{v_j}=1 vjˉ=1.

还是用前向微分给的函数举例子:
f 1 ( x 1 , x 2 ) = x 2 sin ⁡ x 1 + x 2 2 f_1(x_1,x_2)=x_2\sin{x_1}+x_2^2 f1(x1,x2)=x2sinx1+x22

step1 : 左列是中间值,右列是需要记录的节点关系。(在反向传递是,箭头右边的是子节点)
v 0 = x 1 v 0 → v 2 : ∂ v 2 ∂ v 0 = cos ⁡ v 0 = cos ⁡ x 1 v 1 = x 2 v 1 → v 3 : ∂ v 3 ∂ v 1 = v 2 = sin ⁡ v 0 = sin ⁡ x 1 , v 1 → v 4 : ∂ v 4 ∂ v 1 = 2 v 1 = 2 x 2 v 2 = sin ⁡ v 0 v 2 → v 3 : ∂ v 3 ∂ v 2 = v 1 = x 2 v 3 = v 1 v 2 v 3 → v 5 : ∂ v 5 ∂ v 3 = 1 v 4 = v 1 2 v 4 → v 5 : ∂ v 5 ∂ v 4 = 1 v 5 = v 3 + v 4 无 子 节 点 v_0=x_1 \enspace\enspace v_0 \rightarrow{v_2}:\frac{\partial{v_2}}{\partial{v_0}}= \cos{v_0}=\cos{x_1} \\ v_1=x_2 \enspace\enspace v_1 \rightarrow{v_3}:\frac{\partial{v_3}}{\partial{v_1}}=v_2=\sin{v_0}=\sin{x_1}, v_1 \rightarrow{v_4}:\frac{\partial{v_4}}{\partial{v_1}}=2v_1=2x_2 \\ v_2=\sin{v_0} \enspace\enspace v_2\rightarrow{v_3}:\frac{\partial{v_3}}{\partial{v_2}}=v_1=x_2 \\ v_3=v_1v_2 \enspace\enspace v_3\rightarrow{v_5}:\frac{\partial{v_5}}{\partial{v_3}}=1 \\ v_4=v_1^2 \enspace\enspace v_4 \rightarrow{v_5}:\frac{\partial{v_5}}{\partial{v_4}}=1 \\ v_5= v_3+v_4 \enspace\enspace 无子节点 \\ v0=x1v0v2:v0v2=cosv0=cosx1v1=x2v1v3:v1v3=v2=sinv0=sinx1,v1v4:v1v4=2v1=2x2v2=sinv0v2v3:v2v3=v1=x2v3=v1v2v3v5:v3v5=1v4=v12v4v5:v4v5=1v5=v3+v4

step2 : 反向传递时,从 ∂ f ∂ v 5 = ∂ v 5 ∂ v 5 = 1 \frac{\partial{f}}{\partial{v_5}}=\frac{\partial{v_5}}{\partial{v_5}}=1 v5f=v5v5=1开始,有需要的数据就从step1存下来的东西里找。
v 5 ˉ = 1 v 4 ˉ = v 5 ˉ ∂ v 5 ∂ v 4 = 1 v 3 ˉ = v 5 ˉ ∂ v 5 ∂ v 3 = 1 v 2 ˉ = v 3 ˉ ∂ v 3 ∂ v 2 = x 2 v 1 ˉ = v 3 ˉ ∂ v 3 ∂ v 1 + v 4 ˉ ∂ v 4 ∂ v 1 = sin ⁡ x 1 + 2 x 2 v 0 ˉ = v 2 ˉ ∂ v 2 ∂ v 0 = x 2 cos ⁡ x 1 其 中 , x 1 ˉ = v 0 ˉ , x 2 ˉ = v 1 ˉ \bar{v_5}=1\\ \bar{v_4}=\bar{v_5}\frac{\partial{v_5}}{\partial{v_4}}=1\\ \bar{v_3}=\bar{v_5}\frac{\partial{v_5}}{\partial{v_3}}=1\\ \bar{v_2}=\bar{v_3}\frac{\partial{v_3}}{\partial{v_2}}=x_2\\ \bar{v_1}=\bar{v_3}\frac{\partial{v_3}}{\partial{v_1}}+\bar{v_4}\frac{\partial{v_4}}{\partial{v_1}}=\sin{x_1}+2x_2\\ \bar{v_0}=\bar{v_2}\frac{\partial{v_2}}{\partial{v_0}}=x_2\cos{x_1}\\ 其中,\bar{x_1}=\bar{v_0},\bar{x_2}=\bar{v_1} v5ˉ=1v4ˉ=v5ˉv4v5=1v3ˉ=v5ˉv3v5=1v2ˉ=v3ˉv2v3=x2v1ˉ=v3ˉv1v3+v4ˉv1v4=sinx1+2x2v0ˉ=v2ˉv0v2=x2cosx1,x1ˉ=v0ˉ,x2ˉ=v1ˉ

f ( X ) = [ f 1 f 2 . . . f m ] f(X)=\left[ \begin{matrix} f_1 \\ f_2 \\ ...\\ f_m \\ \end{matrix} \right] f(X)=f1f2...fm
那么,要对每一个 f i , i = 1 , 2 , 3 , . . . , m f_i,i=1,2,3,...,m fi,i=1,2,3,...,m进行一次反向微分操作,即可获得原函数完整的Jacobian矩阵。

同样地,用Jacobian矩阵来理解,在每对一个 f i f_i fi仅从一次反向微分后,都会产生原函数Jacobian矩阵的一行, n ≫ m n\gg{m} nm的情况下,能很好减少计算量。

3.参考资料

[1]https://www.youtube.com/watch?v=wG_nF1awSSY
[2]https://blog.csdn.net/chen64515/article/details/109472926?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165375802616782248588691%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=165375802616782248588691&biz_id=0&utm_medium=distribute.wap_search_result.none-task-blog-2allsobaiduend~default-1-109472926-null-null.wap_first_rank_v2_rank_v29&utm_term=%E9%9B%85%E5%8F%AF%E6%AF%94%E7%9F%A9%E9%98%B5%E5%92%8C%E6%A2%AF%E5%BA%A6&spm=1018.2118.3001.4187
[3]https://www.cnblogs.com/simplex/articles/6777895.html
[4]https://math.stackexchange.com/questions/2195377/reverse-mode-differentiation-vs-forward-mode-differentiation-where-are-the-be/3119199#3119199
[5]https://blog.csdn.net/qq_38640439/article/details/81674466?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165383246716782395320562%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=165383246716782395320562&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-3-81674466-null-null.142v11pc_search_result_control_group,157v12control&utm_term=自动微分&spm=1018.2226.3001.4187
[6]https://www.youtube.com/watch?v=jS-0aAamC64

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值