前向和反向微分都和Jacobian矩阵相关,同时它也可以帮助理解,所以从Jacobian矩阵谈起。
1. Jacobian Matrix雅各比矩阵
给定函数
f
:
R
n
→
R
m
f: R^n \rightarrow R^m
f:Rn→Rm和向量
Y
∈
R
m
Y\in{R^m}
Y∈Rm 使得
∀
X
∈
R
n
\forall{X}\in{R^n}
∀X∈Rn 都有
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(X−X(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
X→X(0),X∈Rnlim∥X−X(0)∥∥f(X)−(L(X−X(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(X−X(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
X→X(0),X∈Rnlimtf(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(vn−1(vn−2⋯(v1(x)))),thendxdy=dvndydvn−1dvndvn−2dvn−1⋯dv1dv2dxdv1
可以设
v
0
=
x
,
d
v
0
d
v
0
=
1
v_0=\mathbf{x}, \frac{dv_0}{dv_0}=1
v0=x,dv0dv0=1
前向微分,即是从右向左计算,而反向微分反之。
那么计算是如何进行的呢?
2.1 Forward Differentiation前向微分
引入Tangent derivative:
y
˙
=
∂
y
∂
x
\dot{y}=\frac{\partial{y}}{\partial{x}}
y˙=∂x∂y
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˙=∂x1∂v0=1v1=x2v1˙=∂x1∂v1=0v2=sinv0v3˙=∂x1∂v2=v0˙cosv0=cosx1v3=v1v2v3˙=∂x1∂v3=v1˙v2+v1v2˙=x2cosx1v4=v12v4˙=∂x1∂v4=2v1v1˙=0v5=v3+v4v5˙=∂x1∂v5=v3˙+v4˙=x2cosx1
v_6是我们要求的
∂
f
1
∂
x
1
\frac{\partial{f_1}}{\partial{x_1}}
∂x1∂f1.
同理,对于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˙=∂x2∂v0=0v1=x2v1˙=∂x2∂v1=1v2=sinv0v2˙=∂x2∂v2=v0˙cosv0=0v3=v1v2v3˙=∂x2∂v3=v1˙v2+v1v2˙=sinx1v4=v12v4˙=∂x2∂v4=2v1v1˙=2x2v5=v3+v4v5˙=∂x2∂v5=v3˙+v4˙=sinx1+2x2
v_6是我们要求的
∂
f
1
∂
x
2
\frac{\partial{f_1}}{\partial{x_2}}
∂x2∂f1
当我们给一个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 ∂x1∂fi,i=1,2和进行求算,它们共用同一套基础算子。对 ∂ f i ∂ x 1 , i = 1 , 2 \frac{\partial{f_i}}{\partial{x_1}},i=1,2 ∂x1∂fi,i=1,2求算完后,再对 ∂ f i ∂ x 2 , i = 1 , 2 \frac{\partial{f_i}}{\partial{x_2}},i=1,2 ∂x2∂fi,i=1,2进行求算。
从上面的例子可以看到,每当我们对input中的一个
x
i
x_i
xi进行一次单独的前向传递;对于不同的
x
i
x_i
xi,需要重复进行前向传递。
可以用雅各比矩阵来形象地解释:在前向微分模式下,每对一个
x
i
,
i
=
1
,
2
,
.
.
.
n
x_i,i=1,2,...n
xi,i=1,2,...n做一次前向传递都会输出雅各比矩阵相对应的一列,这个列向量的所有元素都是可以并行计算出来的;要产生完整的雅各比矩阵,将会重复n次这样的计算。
如何编程实现上面的计算?
1)运算符重载:由于前向微分的顺序和求算函数值的顺序是一样的,所以可以写一个类,在类中进行运算符重载,以处理导数运算。
2)源代码转换:根据输入的原函数生成一个新的函数,将其暴露给编译器,这比运算符重载更高效,但实现起来也更困难。
回到理论:
对于函数
f
:
R
n
→
R
m
f: R^n \rightarrow R^m
f:Rn→Rm,当
n
≪
m
n\ll{m}
n≪m时,前向微分可以节省很多时间。
但在机器学习等领域,我们要面对的是几乎都是
n
≫
m
n\gg{m}
n≫m的情况。于是,我们还有另一个适用于这种条件的模式:反向微分。
2.2 Reverse Differentiation反向微分
引入Adjoint derivative:
y
ˉ
=
∂
y
∂
x
\bar{y}=\frac{\partial{y}}{\partial{x}}
yˉ=∂x∂y
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ˉ=∂vi∂f=j:childofi∑vjˉ∂vi∂vj
可以知道,在step1前向传递时我们要记录下来的是 ∂ f ∂ v i \frac{\partial{f}}{\partial{v_i}} ∂vi∂f,而 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=x1v0→v2:∂v0∂v2=cosv0=cosx1v1=x2v1→v3:∂v1∂v3=v2=sinv0=sinx1,v1→v4:∂v1∂v4=2v1=2x2v2=sinv0v2→v3:∂v2∂v3=v1=x2v3=v1v2v3→v5:∂v3∂v5=1v4=v12v4→v5:∂v4∂v5=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
∂v5∂f=∂v5∂v5=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ˉ∂v4∂v5=1v3ˉ=v5ˉ∂v3∂v5=1v2ˉ=v3ˉ∂v2∂v3=x2v1ˉ=v3ˉ∂v1∂v3+v4ˉ∂v1∂v4=sinx1+2x2v0ˉ=v2ˉ∂v0∂v2=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} n≫m的情况下,能很好减少计算量。
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