在深度学习的神经网络中,可以通过Computation Graph建立每层函数之间的关系。下面开始举例。
前向传播
首先我们有三个参数a,b,c,其损失函数为J(w) = 3(a+b*c),然后计算每个参数的梯度:
d
J
d
a
;
d
J
d
b
;
d
J
d
c
\frac{dJ}{da};\frac{dJ}{db};\frac{dJ}{dc}
dadJ;dbdJ;dcdJ
然后我们可以通过拆解损失函数,并通过中间参数进行传递:
u
=
b
c
v
=
a
+
u
J
=
3
v
u = bc\\v = a + u\\J = 3v
u=bcv=a+uJ=3v
由上,可以建立一个计算图:
反向传播
在计算图的基础上,可以清楚的得到每个参数的梯度求导公式:
d
J
d
a
=
d
J
d
v
d
v
d
a
d
J
d
b
=
d
J
d
v
d
v
d
u
d
u
d
b
d
J
d
b
=
d
J
d
v
d
v
d
u
d
u
d
c
\frac{dJ}{da} = \frac{dJ}{dv}\frac{dv}{da}\\ \frac{dJ}{db} = \frac{dJ}{dv}\frac{dv}{du}\frac{du}{db}\\ \frac{dJ}{db} = \frac{dJ}{dv}\frac{dv}{du}\frac{du}{dc}
dadJ=dvdJdadvdbdJ=dvdJdudvdbdudbdJ=dvdJdudvdcdu
为了让求解过程更清晰地表达,我们将公式带入到计算图中
现在开始反向传播,通过简单地组合节点梯度来计算每个参数的梯度:
所以有
d
J
d
a
=
d
J
d
v
d
v
d
a
=
3
∗
1
=
3
d
J
d
b
=
d
J
d
v
d
v
d
u
d
u
d
b
=
3
∗
1
∗
2
=
6
d
J
d
b
=
d
J
d
v
d
v
d
u
d
u
d
c
=
3
∗
1
∗
3
=
9
\frac{dJ}{da} = \frac{dJ}{dv}\frac{dv}{da} = 3*1=3\\ \frac{dJ}{db} = \frac{dJ}{dv}\frac{dv}{du}\frac{du}{db}=3*1*2=6\\ \frac{dJ}{db} = \frac{dJ}{dv}\frac{dv}{du}\frac{du}{dc}=3*1*3=9
dadJ=dvdJdadv=3∗1=3dbdJ=dvdJdudvdbdu=3∗1∗2=6dbdJ=dvdJdudvdcdu=3∗1∗3=9
在NN神经网络中,通过线性函数和非线性函数的组合构成一个网络去解决问题,并通过反向传播更新线性函数的超参数的权重来拟合数据,其中非线性函数sigmoid是激活函数,其作用是当只有线性函数组合时,整个函数还是线性函数,只有组合了sigmoid,才能是非线性函数,用来拟合非线性关系(生活中大多数问题都是非线性问题)。