个人认为这一课非常重要!!! 我们已经掌握了前向传播和反向传播的基础知识,那么如何搭建一个深层神经网络的框架结构,是至关重要的,只有网络块结构清晰了,我们才真正理解到整个神经网络框架是怎么样实现的。
一、搭建深层神经网络块
以神经网络的第
l
l
l层为例,分析一下前向传播、反向传播的输入及输出元素。
- 参数: w [ l ] , b [ l ] w^{[l]},b^{[l]} w[l],b[l]
- 前向:输入
a
[
l
−
1
]
a^{[l-1]}
a[l−1],输出
a
[
l
]
a^{[l]}
a[l]
z [ l ] = w [ l ] a [ l − 1 ] + b [ l ] , c a c h e ( 缓 存 ) z [ l ] z^{[l]}=w^{[l]}a^{[l-1]}+b^{[l]},cache(缓存)z^{[l]} z[l]=w[l]a[l−1]+b[l],cache(缓存)z[l]
a [ l ] = g [ l ] ( z [ l ] ) a^{[l]}=g^{[l]}(z^{[l]}) a[l]=g[l](z[l]) - 反向:输入 d a [ l ] , c a c h e ( z [ l ] ) da^{[l]},cache(z^{[l]}) da[l],cache(z[l]),输出 d a [ l − 1 ] , d w [ l ] , d b [ l ] da^{[l-1]},dw^{[l]},db^{[l]} da[l−1],dw[l],db[l]
为了更清晰地表示出搭建输出网络块的过程,我画了如下一幅正反向传播流程图,在这幅图中标出了各个参数变量以及传播的方向。
- 方框表示神经网络的每一层中的参数
- 蓝色箭头表示前向传播
- 红色箭头表示反向传播
- 绿色箭头表示前向传播的缓存变量值,方便反向传播计算使用
- 紫色箭头表示计算出的供参数更新的导数值
在如上过程中,实现了一次梯度下降的循环。
值得注意的一点是,将计算出来的
z
,
w
,
b
z,w,b
z,w,b值进行缓存,在编程时会发现缓存非常方便,因为在计算反向传播中的导数时,缓存的数据可以迅速提供,从而快速求得
d
w
,
d
b
dw,db
dw,db
在这样一个复习梳理的过程中,神经网络的架构越来越清晰,对前向传播、反向传播的原理也会理解得越来越到位。
二、前向传播与反向传播
Forwords
向量化计算式:
Z
[
l
]
=
w
[
l
]
a
[
l
−
1
]
+
b
[
l
]
Z^{[l]}=w^{[l]}a^{[l-1]}+b^{[l]}
Z[l]=w[l]a[l−1]+b[l]
A [ l ] = g [ l ] ( Z [ l ] ) A^{[l]}=g^{[l]}(Z^{[l]}) A[l]=g[l](Z[l])
Backwards
用键盘输入这组计算式比较费时,但是我还是把这个过程写一写,列得更清晰一点儿。
d Z [ l ] = A [ l ] ∗ g ′ [ l ] ( z [ l ] ) dZ^{[l]}=A^{[l]}*g'^{[l]}(z^{[l]}) dZ[l]=A[l]∗g′[l](z[l])
d w [ l ] = 1 m d Z [ l ] A [ l − 1 ] T dw^{[l]}=\frac{1}{m} dZ^{[l]} {A^{[l-1]}}^T dw[l]=m1dZ[l]A[l−1]T
d b [ l ] = 1 m n p . s u m ( d z [ l ] , a x i s = 1 , k e e p d i m s = T r u e ) db^{[l]}=\frac{1}{m} np.sum(dz^{[l]}, axis=1, keepdims=True) db[l]=m1np.sum(dz[l],axis=1,keepdims=True)
d A [ l − 1 ] = w [ l ] T d Z [ l ] dA^{[l-1]}=w^{[l]T}dZ^{[l]} dA[l−1]=w[l]TdZ[l]