←上一篇 | ↓↑ | 下一篇→ |
---|---|---|
4.5 搭建深层神经网络快 | 回到目录 | 4.7 参数 vs. 超参数 |
前向和反向传播 (Forward and Backward Propagation)
之前我们学习了构成深度神经网络的基本模块,比如每一层都有前向传播步骤以及一个相反的反向传播步骤,这次视频我们讲讲如何实现这些步骤。
先讲前向传播,输入 a [ l − 1 ] a^{[l-1]} a[l−1] ,输出是 a [ l ] a^{[l]} a[l] ,缓存为 z [ l ] z^{[l]} z[l] ;从实现的角度来说我们可以缓存下 w [ l ] w^{[l]} w[l] 和 b [ l ] b^{[l]} b[l] ,这样更容易在不同的环节中调用函数。
所以前向传播的步骤可以写成:
z
[
l
]
=
W
[
l
]
⋅
a
[
l
−
1
]
+
b
[
l
]
a
[
l
]
=
g
[
l
]
(
z
[
l
]
)
z^{[l]}=W^{[l]}\cdot a^{[l-1]} + b^{[l]}\quad a^{[l]}=g^{[l]}(z^{[l]})
z[l]=W[l]⋅a[l−1]+b[l]a[l]=g[l](z[l])
向量化实现过程可以写成:
Z
[
l
]
=
W
[
l
]
⋅
A
[
l
−
1
]
+
b
[
l
]
A
[
l
]
=
g
[
l
]
(
Z
[
l
]
)
Z^{[l]}=W^{[l]}\cdot A^{[l-1]} + b^{[l]}\quad A^{[l]}=g^{[l]}(Z^{[l]})
Z[l]=W[l]⋅A[l−1]+b[l]A[l]=g[l](Z[l])
前向传播需要喂入
A
[
0
]
A^{[0]}
A[0] 也就是
X
X
X ,来初始化;初始化的是第一层的输入值。
a
[
0
]
a^{[0]}
a[0] 对应于一个训练样本的输入特征,而
A
[
0
]
A^{[0]}
A[0] 对应于一整
(
m
)
(m)
(m) 个训练样本的输入特征,所以这就是这条链的第一个前向函数的输入,重复这个步骤就可以从左到右计算前向传播。
下面讲反向传播的步骤:
输入为 d a [ l ] da^{[l]} da[l] ,输出为 d a [ l − 1 ] da^{[l-1]} da[l−1] , d w [ l ] dw^{[l]} dw[l] , d b [ l ] db^{[l]} db[l]
所以反向传播的步骤可以写成:
(1)
d
z
[
l
]
=
d
a
[
l
]
cot
g
[
l
]
′
(
z
[
l
]
)
dz^{[l]}=da^{[l]}\cot g^{[l]^{\prime}}(z^{[l]})
dz[l]=da[l]cotg[l]′(z[l])
(2)
d
w
[
l
]
=
d
z
[
l
]
⋅
a
[
l
−
1
]
dw^{[l]}=dz^{[l]}\cdot a^{[l-1]}
dw[l]=dz[l]⋅a[l−1]
(3)
d
b
[
l
]
=
d
z
[
l
]
db^{[l]}=dz^{[l]}
db[l]=dz[l]
(4)
d
a
[
l
−
1
]
=
w
[
l
]
T
⋅
d
z
[
l
]
da^{[l-1]}=w^{[l]T}\cdot dz^{[l]}
da[l−1]=w[l]T⋅dz[l]
(5)
d
z
[
l
]
=
w
[
l
+
1
]
T
d
z
[
l
+
1
]
⋅
g
[
l
]
(
z
[
l
]
)
dz^{[l]}=w^{[l+1]T}dz^{[l+1]}\cdot g^{[l]}(z^{[l]})
dz[l]=w[l+1]Tdz[l+1]⋅g[l](z[l])
式子(5)由式子(4)带入式子(1)得到,前四个式子就可实现反向函数。
向量化实现过程可以写成:
(6)
d
Z
[
l
]
=
d
A
[
l
]
⋅
g
[
l
]
′
(
Z
[
l
]
)
dZ^{[l]}=dA^{[l]}\cdot g^{[l]^{\prime}}(Z^{[l]})
dZ[l]=dA[l]⋅g[l]′(Z[l])
(7)
d
W
[
l
]
=
1
m
d
Z
[
l
]
⋅
A
[
l
−
1
]
T
dW^{[l]}=\frac1mdZ^{[l]}\cdot A^{[l-1]T}
dW[l]=m1dZ[l]⋅A[l−1]T
(8)
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]}=\frac1mnp.sum(dz^{[l]}, axis=1, keepdims=True)
db[l]=m1np.sum(dz[l],axis=1,keepdims=True)
(9)
d
A
[
l
−
1
]
=
W
[
l
]
T
∗
d
Z
[
l
]
dA^{[l-1]}=W^{[l]T}*dZ^{[l]}
dA[l−1]=W[l]T∗dZ[l]
总结一下:
第一层你可能有一个ReLU激活函数,第二层为另一个ReLU激活函数,第三层可能是sigmoid函数(如果你做二分类的话),输出值为,用来计算损失;这样你就可以向后迭代进行反向传播求导来求 d w [ 3 ] , d b [ 3 ] , d w [ 2 ] , d b [ 2 ] , d w [ 1 ] , d b [ 1 ] dw^{[3]} ,db^{[3]} ,dw^{[2]} ,db^{[2]} ,dw^{[1]} ,db^{[1]} dw[3],db[3],dw[2],db[2],dw[1],db[1] 。在计算的时候,缓存会把 z [ 1 ] z [ 2 ] z [ 3 ] z^{[1]}\ z^{[2]}\ z^{[3]} z[1] z[2] z[3] 传递过来,然后回传 d a [ 2 ] , d a [ 1 ] da^{[2]},da^{[1]} da[2],da[1] ,可以用来计算 d a [ 0 ] da^{[0]} da[0] ,但我们不会使用它,这里讲述了一个三层网络的前向和反向传播,还有一个细节没讲就是前向递归——用输入数据来初始化,那么反向递归(使用Logistic回归做二分类)——对 A [ l ] A^{[l]} A[l] 求导。
忠告:补补微积分和线性代数,多推导,多实践。
课程PPT
←上一篇 | ↓↑ | 下一篇→ |
---|---|---|
4.5 搭建深层神经网络快 | 回到目录 | 4.7 参数 vs. 超参数 |