在【神经网络和深度学习】第四周的课程中,感觉有些内容比较容易忘记但是及其重要,于是由这篇文章来记录相关内容。
一、深层神经网络
1.1 何为深层神经网络
拥有大于两层隐藏层的神经网络。(根据PPT得出的结论)
1.2 深层神经网络符号规约
如图,
x
1
,
x
2
,
x
3
x_1, x_2, x_3
x1,x2,x3为输入的特征值,可以称为第0层或输入层。从输入层向右依次是第1层、第2层、第3层、第4层(也叫输出层)。
所以这个网络是四层神经网络(通常不包含输入层),即:
L
(
L
a
y
e
r
s
)
=
4
L (Layers) = 4
L(Layers)=4。
- n [ l ] n^{[l]} n[l] 是第 l l l层的神经元个数。如: n [ 0 ] = 3 n^{[0]} =3 n[0]=3, n [ 1 ] = 5 n^{[1]} =5 n[1]=5, n [ 2 ] = 5 n^{[2]} =5 n[2]=5, n [ 3 ] = 3 n^{[3]} =3 n[3]=3, n [ 4 ] = 1 n^{[4]} =1 n[4]=1;
- w [ l ] w^{[l]} w[l] 是第 l l l层的权重;
- b [ l ] b^{[l]} b[l] 是第 l l l层的偏置值;
- z [ l ] z^{[l]} z[l] 是第 l l l层的未被激活函数(激励函数)激活的输出的值;
- g [ l ] g^{[l]} g[l] 是第 l l l层的激活函数(激励函数);
- a [ l ] a^{[l]} a[l] 是第 l l l层的激活函数(激励函数)输出的值,即: a [ l ] = g [ l ] ( z [ l ] ) a^{[l]} = g^{[l]}(z^{[l]}) a[l]=g[l](z[l]),注意: a [ 0 ] a^{[0]} a[0]为 x 1 , x 2 , x 3 x_1,x_2,x_3 x1,x2,x3。
二、深层神经网络中的前向传播
在前向传播中,首先我们要明确我们需要计算的量有: z [ l ] , a [ l ] z^{[l]},a^{[l]} z[l],a[l]。
2.1 前向传播计算方法
- z [ 1 ] = w [ 1 ] a [ 0 ] + b [ 1 ] z^{[1]}=w^{[1]}a^{[0]}+b^{[1]} z[1]=w[1]a[0]+b[1]
- a [ 1 ] = g [ 1 ] ( z [ 1 ] ) a^{[1]}=g^{[1]}(z^{[1]}) a[1]=g[1](z[1])
- z [ 2 ] = w [ 2 ] a [ 1 ] + b [ 2 ] z^{[2]}=w^{[2]}a^{[1]}+b^{[2]} z[2]=w[2]a[1]+b[2]
- a [ 2 ] = g [ 2 ] ( z [ 2 ] ) a^{[2]}=g^{[2]}(z^{[2]}) a[2]=g[2](z[2])
- ……
- a [ 4 ] = g [ 4 ] ( z [ 4 ] ) = y ^ a^{[4]}=g^{[4]}(z^{[4]})=\hat y a[4]=g[4](z[4])=y^
经过这样的循环计算后,我们可以得到一组输入的 y ^ \hat y y^。
通式(通式中大写变量均为向量,便于省去部分循环计算):
- 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])
- Y ^ = A [ 4 ] \hat Y=A^{[4]} Y^=A[4]
三、核对矩阵维数(可视为debug方法)
何对矩阵维数时关键的公式是 Z [ l ] = W [ l ] X + B [ l ] Z^{[l]}=W^{[l]}X+B^{[l]} Z[l]=W[l]X+B[l]。如:
- Z [ 1 ] = W [ 1 ] X + B [ 1 ] Z^{[1]}=W^{[1]}X+B^{[1]} Z[1]=W[1]X+B[1]
- Z Z Z是每一层的激活函数的个数(神经元个数), Z [ 1 ] . s h a p e ( ) = ( 3 , 1 ) Z^{[1]}.shape() =(3,1) Z[1].shape()=(3,1),也就是 ( n [ 1 ] , 1 ) = ( 3 , 1 ) (n^{[1]},1)=(3,1) (n[1],1)=(3,1)
- X X X是输入的特征值个数, X [ 1 ] . s h a p e ( ) = ( 2 , 1 ) X^{[1]}.shape()=(2,1) X[1].shape()=(2,1),也就是 ( n [ 0 ] , 1 ) = ( 2 , 1 ) (n^{[0]},1)=(2,1) (n[0],1)=(2,1)
- 然后我们就可以根据矩阵乘法规则推算出W的规模,
W
[
1
]
=
(
n
[
1
]
,
n
[
0
]
)
W^{[1]}=(n^{[1]}, n^{[0]})
W[1]=(n[1],n[0])
- 所以我们可以得到: W [ l ] = ( n [ l ] , n [ l − 1 ] ) W^{[l]}=(n^{[l]}, n^{[l-1]}) W[l]=(n[l],n[l−1]),也就是(当前层的神经元维数,前一层的神经元维数)
- 我们可以看到, W [ l ] X W^{[l]}X W[l]X的维数为 ( n [ l ] , 1 ) (n^{[l]},1) (n[l],1),因此根据矩阵加法规则,推算出 B [ l ] B^{[l]} B[l]的规模为 ( n [ l ] , 1 ) (n^{[l]},1) (n[l],1)
- 在反向传播中
d
w
[
l
]
dw^{[l]}
dw[l]和
W
[
l
]
W^{[l]}
W[l]有着相同的规模,为:
(
n
[
l
]
,
n
[
l
−
1
]
)
(n^{[l]}, n^{[l-1]})
(n[l],n[l−1]);
d
b
[
l
]
db^{[l]}
db[l]与
B
[
l
]
B^{[l]}
B[l]有着相同的规模,为:
(
n
[
l
]
,
1
)
(n^{[l]},1)
(n[l],1)。
可以得到前向传播和后向传播中传播公式为:
四、深层神经网络
4.1 每层神经网络输入及输出
4.1.1 正向传播
4.1.2 反向传播
4.1.4 神经网络 l l l层的前向传播
输入:
a
[
l
−
1
]
a^{[l-1]}
a[l−1]
输出:
a
[
l
]
,
c
a
c
h
e
(
z
[
l
]
)
a^{[l]},cache(z^{[l]})
a[l],cache(z[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],因此输出还有 w [ l ] w^{[l]} w[l]和 b [ l ] b^{[l]} b[l]。
a [ l ] = g [ l ] ( Z [ l ] ) a^{[l]} = g^{[l]}(Z^{[l]}) a[l]=g[l](Z[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])
4.1.5 神经网络 l l l层的后向传播
输入:
d
a
[
l
]
da^{[l]}
da[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]
- d z [ l ] = d a [ l ] ∗ g [ l ] ′ ( z [ l ] ) dz^{[l]}=da^{[l]}*g^{[l]}\\'(z^{[l]}) dz[l]=da[l]∗g[l]′(z[l])
- d a [ l ] = w [ l ] T ∗ d z [ l ] da^{[l]}=w^{[l]^T}*dz^{[l]} da[l]=w[l]T∗dz[l],将 d a [ l ] da^{[l]} da[l]带入上式得: 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]T∗dz[l+1]∗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 Z [ l ] = d A [ l ] ∗ g [ l ] ′ ( Z [ l ] ) dZ^{[l]}=dA^{[l]}*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 1mdZ^{[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 1mnp.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]T∗dZ[l]
4.1.3 小结
神经网络的一个梯度下降循环就是将正向传播和反向传播进行一次,计算出相关参数,然后使用 w = w − d w w = w - dw w=w−dw、 b = b − d b b = b - db b=b−db梯度下降的方法来更新参数。
注:需要将 Z , b [ l ] , w [ l ] Z,b^{[l]},w^{[l]} Z,b[l],w[l]缓存下来。