深层神经网络
前向传播和反向传播(Forward and backward propagation)
前向传播的步骤可以写成:
z
[
l
]
=
W
[
l
]
⋅
a
[
l
−
1
]
+
b
[
l
]
{z}^{[l]}={W}^{[l]}\cdot{a}^{[l-1]}+{b}^{[l]}
z[l]=W[l]⋅a[l−1]+b[l]
a
[
l
]
=
g
[
l
]
(
z
[
l
]
)
{{a}^{[l]}}={{g}^{[l]}}\left( {{z}^{[l]}}\right)
a[l]=g[l](z[l])
向量化实现过程可以写成:
z
[
l
]
=
W
[
l
]
⋅
A
[
l
−
1
]
+
b
[
l
]
{z}^{[l]}={W}^{[l]}\cdot {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])
反向传播的步骤可以写成:
(1)
d
z
[
l
]
=
d
a
[
l
]
∗
g
[
l
]
′
(
z
[
l
]
)
d{{z}^{[l]}}=d{{a}^{[l]}}*{{g}^{[l]}}'( {{z}^{[l]}})
dz[l]=da[l]∗g[l]′(z[l])
(2)
d
w
[
l
]
=
d
z
[
l
]
⋅
a
[
l
−
1
]
d{{w}^{[l]}}=d{{z}^{[l]}}\cdot{{a}^{[l-1]}}~
dw[l]=dz[l]⋅a[l−1]
(3)
d
b
[
l
]
=
d
z
[
l
]
d{{b}^{[l]}}=d{{z}^{[l]}}~~
db[l]=dz[l]
(4)
d
a
[
l
−
1
]
=
w
[
l
]
T
⋅
d
z
[
l
]
d{{a}^{[l-1]}}={{w}^{\left[ l \right]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
]
)
d{{z}^{[l]}}={{w}^{[l+1]T}}d{{z}^{[l+1]}}\cdot \text{ }{{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
]
)
d{{Z}^{[l]}}=d{{A}^{[l]}}*{{g}^{\left[ l \right]}}'\left({{Z}^{[l]}} \right)~~
dZ[l]=dA[l]∗g[l]′(Z[l])
(7)
d
W
[
l
]
=
1
m
d
Z
[
l
]
⋅
A
[
l
−
1
]
T
d{{W}^{[l]}}=\frac{1}{m}\text{}d{{Z}^{[l]}}\cdot {{A}^{\left[ l-1 \right]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
)
d{{b}^{[l]}}=\frac{1}{m}\text{ }np.sum(d{{z}^{[l]}},axis=1,keepdims=True)
db[l]=m1 np.sum(dz[l],axis=1,keepdims=True)
(9)
d
A
[
l
−
1
]
=
W
[
l
]
T
.
d
Z
[
l
]
d{{A}^{[l-1]}}={{W}^{\left[ l \right]T}}.d{{Z}^{[l]}}
dA[l−1]=W[l]T.dZ[l]
总结一下:
第一层可能有一个ReLU激活函数,第二层为另一个ReLU激活函数,第三层可能是sigmoid函数(如果你做二分类的话),用来计算损失;这样你就可以向后迭代进行反向传播求导来求 d w [ 3 ] {{dw}^{[3]}} dw[3], d b [ 3 ] {{db}^{[3]}} db[3] , d w [ 2 ] {{dw}^{[2]}} dw[2] , d b [ 2 ] {{db}^{[2]}} db[2] , d w [ 1 ] {{dw}^{[1]}} dw[1] , d b [ 1 ] {{db}^{[1]}} db[1]。在计算的时候,缓存会把 z [ 1 ] {{z}^{[1]}} z[1] z [ 2 ] {{z}^{[2]}} z[2] z [ 3 ] {{z}^{[3]}} z[3]传递过来,然后回传 d a [ 2 ] {{da}^{[2]}} da[2], d a [ 1 ] {{da}^{[1]}} da[1] ,可以用来计算 d a [ 0 ] {{da}^{[0]}} da[0],但我们不会使用它。
核对矩阵的维数(Getting your matrix dimensions right)
w
[
l
]
{{w}^{[l]}}
w[l]: (
n
[
l
]
{{n}^{[l]}}
n[l],
n
[
l
−
1
]
{{n}^{[l-1]}}
n[l−1]);
b
[
l
]
{{b}^{[l]}}
b[l] : (
n
[
l
]
,
1
)
{{n}^{[l]}},1)
n[l],1);
z
[
l
]
{{z}^{[l]}}
z[l],
a
[
l
]
{{a}^{[l]}}
a[l]:
(
n
[
l
]
,
1
)
({{n}^{[l]}},1)
(n[l],1);
d
w
[
l
]
{{dw}^{[l]}}
dw[l]和
w
[
l
]
{{w}^{[l]}}
w[l]维度相同,
d
b
[
l
]
{{db}^{[l]}}
db[l]和
b
[
l
]
{{b}^{[l]}}
b[l]维度相同,且
w
w
w和
b
b
b向量化维度不变,但
z
z
z,
a
a
a以及
x
x
x的维度会向量化后发生变化。
向量化后:
Z
[
l
]
=
(
z
[
l
]
[
1
]
,
z
[
l
]
[
2
]
,
z
[
l
]
[
3
]
,
…
,
z
[
l
]
[
m
]
)
{Z}^{[l]}=({{z}^{[l][1]}},{{z}^{[l][2]}},{{z}^{[l][3]}},…,{{z}^{[l][m]}})
Z[l]=(z[l][1],z[l][2],z[l][3],…,z[l][m]),
m
m
m为训练集大小,
Z
[
l
]
{Z}^{[l]}
Z[l]的维度
(
n
[
l
]
,
m
)
({{n}^{[l]}},m)
(n[l],m)
A
[
l
]
{A}^{[l]}
A[l]:
(
n
[
l
]
,
m
)
({n}^{[l]},m)
(n[l],m),
A
[
0
]
=
X
=
(
n
[
l
]
,
m
)
{A}^{[0]} = X =({n}^{[l]},m)
A[0]=X=(n[l],m)
搭建神经网络块(Building blocks of deep neural networks)
超参数
比如算法中的learning rate a a a(学习率)、iterations(梯度下降法循环的数量)、 L L L(隐藏层数目)、 n [ l ] {{n}^{[l]}} n[l](隐藏层单元数目)、choice of activation function(激活函数的选择)都需要你来设置,这些数字实际上控制了最后的参数 W W W和 b b b的值,所以它们被称作超参数。