1.视频网站:mooc慕课https://mooc.study.163.com/university/deeplearning_ai#/c
2.详细笔记网站(中文):http://www.ai-start.com/dl2017/
3.github课件+作业+答案:https://github.com/stormstone/deeplearning.ai
4.6 前向和反向传播 Forward and backward propagation
上一节了解了构成深度NN的基本模块,每一层都有前向传播步骤以及一个相反的反向传播步骤,本节将介绍如何实现这些步骤。
前向传播
第l层输入a[l-1],输出a[l],保存z[l],W[l]和b[l]。
前向传播的步骤
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])
输入特征
x
=
a
[
0
]
x=a^{[0]}
x=a[0]
向量化实现
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])
输入特征集合
X
=
A
[
0
]
X=A^{[0]}
X=A[0]
反向传播
第l层输入da[l],输出da[l-1],dz[l],dW[l]和db[l]。
反向传播的步骤
d
z
[
l
]
=
d
a
[
l
]
∗
g
[
l
]
′
(
z
[
l
]
)
dz^{[l]}=da^{[l]}\ast g^{[l]'}(z^{[l]})
dz[l]=da[l]∗g[l]′(z[l])
d
W
[
l
]
=
d
z
[
l
]
a
[
l
−
1
]
dW^{[l]}=dz^{[l]}a^{[l-1]}
dW[l]=dz[l]a[l−1]
d
b
[
l
]
=
d
z
[
l
]
db^{[l]}=dz^{[l]}
db[l]=dz[l]
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]
在3.9 神经网络的梯度下降法曾经给出过单隐层NN的dz公式
d z [ l ] = W [ l + 1 ] T d z [ l + 1 ] ∗ g [ l ] ′ ( z [ l ] ) dz^{[l]}=W^{[l+1]T}dz^{[l+1]}∗g^{[l]′}(z^{[l]}) dz[l]=W[l+1]Tdz[l+1]∗g[l]′(z[l])
注意,其实2个公式是一致的。
向量化实现
d
Z
[
l
]
=
d
A
[
l
]
∗
g
[
l
]
′
(
Z
[
l
]
)
dZ^{[l]}=dA^{[l]}\ast g^{[l]'}(Z^{[l]})
dZ[l]=dA[l]∗g[l]′(Z[l])
d
W
[
l
]
=
1
m
d
Z
[
l
]
A
[
l
−
1
]
T
dW^{[l]}=\frac 1m 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 1m 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]
汇总
输入X
- 第一层使用修正线性单元激活函数Relu
- 第二层使用另外一个Relu函数
- 第三层使用sigmoid函数(如果是二分分类)
- 输出预测值 y ^ \hat y y^
- 计算损失
L
(
y
^
,
y
)
L(\hat y,y)
L(y^,y)
然后开始向后迭代,反向传播求导
- 使用保存的 z [ l ] z^{[l]} z[l]来计算 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]
- 依次回传 d a [ 3 ] , d a [ 2 ] , d a [ 1 ] da^{[3]},da^{[2]},da^{[1]} da[3],da[2],da[1]
以上就是一个3层NN的前向和反向传播。
前向传播,我们使用输入数据X来初始化。
对于逻辑回归的反向传播,初始化使用的是
d
A
[
l
]
=
(
−
y
(
1
)
a
(
1
)
+
1
−
y
(
1
)
1
−
a
(
1
)
.
.
.
.
.
.
−
y
(
m
)
a
(
m
)
+
1
−
y
(
m
)
1
−
a
(
m
)
)
dA^{[l]}=(-\frac {y^{(1)}}{a^{(1)}}+\frac {1-y^{(1)}}{1-a^{(1)}}......-\frac {y^{(m)}}{a^{(m)}}+\frac {1-y^{(m)}}{1-a^{(m)}})
dA[l]=(−a(1)y(1)+1−a(1)1−y(1)......−a(m)y(m)+1−a(m)1−y(m))