1. 绪论
神经网络是由感知机中的元件作为基本组成元件构造的多层网络结构,其模型的构建计算过程y=f(x) 我们通常称为前向传播,梯度下降过程中计算导数通常称为反向传播。
2. 前向传播
在写明计算公式前先声明一些变量定义。输出求和节点的向量记为z,经过激活函数的记为a,此层的权重记为W,偏差记为b,其有如下关系:
a
[
l
]
=
σ
(
z
[
l
]
)
=
σ
(
W
[
l
]
a
[
[
l
−
1
]
]
+
b
[
l
]
)
a^{[l]} = \sigma(z^{[l]})=\sigma(W^{[l]}a^[[l-1]]+b^{[l]})
a[l]=σ(z[l])=σ(W[l]a[[l−1]]+b[l])
其中
a
[
l
]
a^{[l]}
a[l] 向量的维度为
n
[
l
]
∗
1
n^{[l]} * 1
n[l]∗1 ,
W
[
l
]
W^{[l]}
W[l] 的维度为
n
[
l
]
∗
n
[
l
−
1
]
n^{[l]} * n^{[l-1]}
n[l]∗n[l−1] ,
b
[
l
]
b^{[l]}
b[l] 向量的维度为
n
[
l
]
∗
1
n^{[l]} * 1
n[l]∗1
假定输入层为第0层,其输出的变量定义为 a [ 0 ] = x a^{[0]} =x a[0]=x
上述这个公式的计算过程其实就是前向传播算法。直到最后一层输出层我们计算出最终的 y = a o u t p u t y=a^{output} y=aoutput
3. 反向传播
模型构建好了,此时我们需要对其构建一个损失函数,然后进行梯度下降,此过程中有大量的参数W, b。那么如何计算呢? 我们利用链式法则!假设损失函数为J,
假设我们已知
∂
J
∂
a
[
l
+
1
]
\frac{\partial J}{\partial {a^{[l+1]}}}
∂a[l+1]∂J , 因为
a
[
l
+
1
]
=
σ
(
z
[
l
+
1
]
)
a^{[l+1]} = \sigma(z^{[l+1]})
a[l+1]=σ(z[l+1]) ,则有:
∂
J
∂
z
[
l
+
1
]
=
∂
J
∂
a
[
l
+
1
]
∗
∂
a
[
l
+
1
]
∂
z
[
l
+
1
]
=
∂
J
∂
a
[
l
+
1
]
∗
σ
′
(
z
[
l
+
1
]
)
\frac{\partial J}{\partial {z^{[l+1]}}} = \frac{\partial J}{\partial {a^{[l+1]}}} * \frac{\partial {a^{[l+1]}}}{\partial {z^{[l+1]}}} =\frac{\partial J}{\partial {a^{[l+1]}}} * \sigma'(z^{[l+1]})
∂z[l+1]∂J=∂a[l+1]∂J∗∂z[l+1]∂a[l+1]=∂a[l+1]∂J∗σ′(z[l+1])
又因为
z
[
l
+
1
]
=
W
[
l
+
1
]
a
[
[
l
]
]
+
b
[
l
+
1
]
z^{[l+1]}=W^{[l+1]}a^[[l]]+b^{[l+1]}
z[l+1]=W[l+1]a[[l]]+b[l+1]
∂
J
∂
W
[
l
+
1
]
=
∂
J
∂
z
[
l
+
1
]
∗
∂
z
[
l
+
1
]
∂
W
[
l
+
1
]
=
∂
J
∂
a
[
l
+
1
]
∗
σ
′
(
z
[
l
+
1
]
)
∗
(
a
[
l
]
)
T
∂
J
∂
b
[
l
+
1
]
=
∂
J
∂
z
[
l
+
1
]
∗
∂
z
[
l
+
1
]
∂
b
[
l
+
1
]
=
∂
J
∂
a
[
l
+
1
]
∗
σ
′
(
z
[
l
+
1
]
)
∂
J
∂
a
[
l
]
=
∂
J
∂
z
[
l
+
1
]
∗
∂
z
[
l
+
1
]
∂
a
[
l
]
=
(
W
[
l
+
1
]
)
T
∗
∂
J
∂
a
[
l
+
1
]
∗
σ
′
(
z
[
l
+
1
]
)
\frac{\partial J}{\partial {W^{[l+1]}}} = \frac{\partial J}{\partial {z^{[l+1]}}} * \frac{\partial {z^{[l+1]}}}{\partial {W^{[l+1]}}} = \frac{\partial J}{\partial {a^{[l+1]}}} * \sigma'(z^{[l+1]}) * (a^{[l]})^T \\ \frac{\partial J}{\partial {b^{[l+1]}}} = \frac{\partial J}{\partial {z^{[l+1]}}} * \frac{\partial {z^{[l+1]}}}{\partial {b^{[l+1]}}} = \frac{\partial J}{\partial {a^{[l+1]}}} * \sigma'(z^{[l+1]}) \\ \frac{\partial J}{\partial {a^{[l]}}} = \frac{\partial J}{\partial {z^{[l+1]}}} * \frac{\partial {z^{[l+1]}}}{\partial {a^{[l]}}} = (W^{[l+1]})^T * \frac{\partial J}{\partial {a^{[l+1]}}}* \sigma'(z^{[l+1]})
∂W[l+1]∂J=∂z[l+1]∂J∗∂W[l+1]∂z[l+1]=∂a[l+1]∂J∗σ′(z[l+1])∗(a[l])T∂b[l+1]∂J=∂z[l+1]∂J∗∂b[l+1]∂z[l+1]=∂a[l+1]∂J∗σ′(z[l+1])∂a[l]∂J=∂z[l+1]∂J∗∂a[l]∂z[l+1]=(W[l+1])T∗∂a[l+1]∂J∗σ′(z[l+1])
通过上述的反向传播计算过程即可计算出所有权重的偏导数。
4. 总结
这里利用吴恩达课程中一张图更好的理解前向传播和反向传播的过程。