通过上文logistic regression的讲解知道,正向运算可以计算输出结果,而反向运算可以计算梯度或导数,从而调整参数。
通过简单的运算式引出计算图的组成,从而引出深度学习中前向传播和反向传播的运算方法。
一、计算图与正向传播
假设函数
J
(
a
,
b
,
c
)
=
3
(
a
+
b
c
)
.
J(a,b,c)=3(a+bc).
J(a,b,c)=3(a+bc).按照运算顺序我们令,
u
=
b
c
,
v
=
a
+
u
,
J
=
3
v
.
u=bc,v=a+u,J=3v.
u=bc,v=a+u,J=3v.
ps.如果学过高等数学中的多元微积分,那么以下内容均可以类比多元微分学中的链式求导法则(chain rule),于是得到如下图(其实正向计算即分布计算过程):
分布计算的过程比较容易,交给计算机完成会更加高效,所以这部分略。
二、计算导数与反向传播
d
J
d
v
=
3
,
d
v
d
a
=
1.
\frac{dJ}{dv}=3,\frac{dv}{da}=1.
dvdJ=3,dadv=1.
d J d a = d J d v d v d a = 3 × 1 = 3. \frac{dJ}{da}=\frac{dJ}{dv} \frac{dv}{da}=3\times1=3. dadJ=dvdJdadv=3×1=3.
d J d v = 3 , d v d u = 1. \frac{dJ}{dv}=3,\frac{dv}{du}=1. dvdJ=3,dudv=1.
d J d u = d J d v d v d u = 3 × 1 = 3. \frac{dJ}{du}=\frac{dJ}{dv} \frac{dv}{du}=3\times1=3. dudJ=dvdJdudv=3×1=3.
d J d b = d J d v d v d u d u d b = 3 × 1 × 2 = 6. \frac{dJ}{db}=\frac{dJ}{dv} \frac{dv}{du} \frac{du}{db}=3\times1 \times 2=6. dbdJ=dvdJdudvdbdu=3×1×2=6.
三、编程符号规定
求导时,
d
F
i
n
a
l
O
u
t
p
u
t
V
a
r
d
v
a
r
\frac{dFinalOutputVar}{dvar}
dvardFinalOutputVar表示最终输出变量对某个相关变量的导数。编程时,为了方便并统一表示这个求导变量,引入变量名:
d
v
a
r
.
dvar.
dvar.
例如,
d
J
d
u
→
d
u
,
d
J
d
a
→
d
a
.
\frac{dJ}{du}\to du,\frac{dJ}{da}\to da.
dudJ→du,dadJ→da. 同时,这样写也避开了中间变量。
四、总结
- 一个计算流程图,正向计算成本函数 J J J,需要优化的函数
- 在计算一系列导数时,最有效的办法是反向(从右到左计算),跟着红色箭头走,层层递进求导(链式)