神经网络和深度学习课程(第四周-深层神经网络)
目录
4.1 深层神经网络
深层神经网络其实就是包含更多隐藏层神经网络。如下图所示,分别列举了逻辑回归、1个隐藏层的神经网络、2个隐藏层的神经网络和5个隐藏层的神经网络模型结构。
注意:神经网络的层数=隐藏层的个数+1个输出层
介绍神经网络符号的含义:
符号 | 含义 |
---|---|
l l l | 层数(从0开始) |
n [ l ] n^{[l]} n[l] | 第L层神经元的个数 |
a [ l ] a^{[l]} a[l] | 第L层激活函数的输出 |
W [ l ] W^{[l]} W[l] | 第L层的权重 |
b [ l ] b^{[l]} b[l] | 第L层的参数b |
4.2 深层网网络的前向传播
接下来,推导一下深层神经网络的正向传播过程。以4层神经网络为例,对于单个样本:
第一层,L=1:
z
[
1
]
=
W
[
1
]
x
+
b
[
1
]
=
W
[
1
]
a
[
0
]
+
b
[
1
]
a
[
1
]
=
g
[
1
]
(
z
[
1
]
)
\begin{array}{c} z^{[1]}=W^{[1]} x+b^{[1]}=W^{[1]} a^{[0]}+b^{[1]} \\ a^{[1]}=g^{[1]}\left(z^{[1]}\right) \end{array}
z[1]=W[1]x+b[1]=W[1]a[0]+b[1]a[1]=g[1](z[1])
第二层,L=2:
z
[
2
]
=
W
[
1
]
a
[
1
]
+
b
[
2
]
a
[
2
]
=
g
[
2
]
(
z
[
2
]
)
\begin{array}{c} z^{[2]}=W^{[1]} a^{[1]}+b^{[2]} \\ a^{[2]}=g^{[2]}\left(z^{[2]}\right) \end{array}
z[2]=W[1]a[1]+b[2]a[2]=g[2](z[2])
第三层,L=3:
z
[
3
]
=
W
[
3
]
a
[
2
]
+
b
[
3
]
a
[
3
]
=
g
[
3
]
(
z
[
3
]
)
\begin{array}{c} z^{[3]}=W^{[3]} a^{[2]}+b^{[3]} \\ a^{[3]}=g^{[3]}\left(z^{[3]}\right) \end{array}
z[3]=W[3]a[2]+b[3]a[3]=g[3](z[3])
第四层,L=4:
z
[
4
]
=
W
[
4
]
a
[
3
]
+
b
[
4
]
a
[
4
]
=
g
[
4
]
(
z
[
4
]
)
\begin{array}{c} z^{[4]}=W^{[4]} a^{[3]}+b^{[4]} \\ a^{[4]}=g^{[4]}\left(z^{[4]}\right) \end{array}
z[4]=W[4]a[3]+b[4]a[4]=g[4](z[4])
对于m个训练样本,将其向量化:
第一层,L=1:
Z
[
1
]
=
W
[
1
]
X
+
b
[
1
]
=
W
[
1
]
A
[
0
]
+
b
[
1
]
A
[
1
]
=
g
[
1
]
(
Z
[
1
]
)
\begin{array}{c} Z^{[1]}=W^{[1]} X+b^{[1]}=W^{[1]} A^{[0]}+b^{[1]} \\ A^{[1]}=g^{[1]}\left(Z^{[1]}\right) \end{array}
Z[1]=W[1]X+b[1]=W[1]A[0]+b[1]A[1]=g[1](Z[1])
第二层,L=2:
Z
[
2
]
=
W
[
1
]
A
[
1
]
+
b
[
2
]
A
[
2
]
=
g
[
2
]
(
Z
[
2
]
)
\begin{array}{c} Z^{[2]}=W^{[1]}A^{[1]}+b^{[2]} \\ A^{[2]}=g^{[2]}\left(Z^{[2]}\right) \end{array}
Z[2]=W[1]A[1]+b[2]A[2]=g[2](Z[2])
第三层,L=3:
Z
[
3
]
=
W
[
3
]
A
[
2
]
+
b
[
3
]
A
[
3
]
=
g
[
3
]
(
Z
[
3
]
)
\begin{array}{c} Z^{[3]}=W^{[3]} A^{[2]}+b^{[3]} \\ A^{[3]}=g^{[3]}\left(Z^{[3]}\right) \end{array}
Z[3]=W[3]A[2]+b[3]A[3]=g[3](Z[3])
第四层,L=4:
Z
[
4
]
=
W
[
4
]
A
[
3
]
+
b
[
4
]
A
[
4
]
=
g
[
4
]
(
Z
[
4
]
)
\begin{array}{c} Z^{[4]}=W^{[4]} A^{[3]}+b^{[4]} \\ A^{[4]}=g^{[4]}\left(Z^{[4]}\right) \end{array}
Z[4]=W[4]A[3]+b[4]A[4]=g[4](Z[4])
综上所述,对于第l层,其正向传播过程的
Z
[
l
]
Z^{[l]}
Z[l]和
A
[
l
]
A^{[l]}
A[l]可以表示为:
Z
[
l
]
=
W
[
l
]
A
[
l
−
1
]
+
b
[
l
]
A
[
l
]
=
g
[
l
]
(
Z
[
l
]
)
\begin{array}{c} Z^{[l]}=W^{[l]} A^{[l-1]}+b^{[l]} \\ A^{[l]}=g^{[l]}\left(Z^{[l]}\right) \end{array}
Z[l]=W[l]A[l−1]+b[l]A[l]=g[l](Z[l])
对于m个样本,就是将x,z,a变成大写表示多个样本的组合,但W和b表示方法和单个样本的一样。
4.3 核对矩阵的维数
对于单个训练样本:
符号 | 大小 |
---|---|
W [ l ] W^{[l]} W[l] | ( n [ l ] , n [ l − 1 ] ) (n^{[l]},n^{[l-1]}) (n[l],n[l−1]) |
b [ l ] b^{[l]} b[l] | ( n [ l ] , 1 ) (n^{[l]},1) (n[l],1) |
a [ l ] a^{[l]} a[l] | ( n [ l ] , 1 ) (n^{[l]},1) (n[l],1) |
z [ l ] z^{[l]} z[l] | ( n [ l ] , 1 ) (n^{[l]},1) (n[l],1) |
对于m个训练样本:
符号 | 大小 |
---|---|
W [ l ] W^{[l]} W[l] | ( n [ l ] , n [ l − 1 ] ) (n^{[l]},n^{[l-1]}) (n[l],n[l−1]) |
b [ l ] b^{[l]} b[l] | ( n [ l ] , 1 ) (n^{[l]},1) (n[l],1) |
A [ l ] A^{[l]} A[l] | ( n [ l ] , m ) (n^{[l]},m) (n[l],m) |
Z [ l ] Z^{[l]} Z[l] | ( n [ l ] , m ) (n^{[l]},m) (n[l],m) |
需要注意的是m个样本的 W [ l ] W^{[l]} W[l] 和 b [ l ] b^{[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]中, b [ l ] b^{[l]} b[l]会被当成 ( n [ l ] , m ) (n^{[l]},m) (n[l],m)矩阵进行运算,这是因为python的广播性质,且 b [ l ] b^{[l]} b[l]每一列向量都是一样的。 | |
反向传播过程中, d W [ l ] dW^{[l]} dW[l] , d b [ l ] db^{[l]} db[l] , d a [ l ] da^{[l]} da[l]( d A [ l ] dA^{[l]} dA[l]) , d z [ l ] dz^{[l]} dz[l] ( d Z [ l ] dZ^{[l]} dZ[l])的维度分别与 W [ l ] W^{[l]} W[l] , b [ l ] b^{[l]} b[l] , a [ l ] ( A [ l ] ) a^{[l]}(A^{[l]}) a[l](A[l]) , z [ l ] ( Z [ l ] ) z^{[l]}(Z^{[l]}) z[l](Z[l]) 一致。 |
4.4 为什么使用深度神经网络?
我们都知道神经网络能处理很多问题,而且效果显著。其强大能力主要源自神经网络足够“深”,也就是说网络层数越多,神经网络就更加复杂和深入,学习也更加准确。接下来,我们从几个例子入手,看一下为什么深度网络能够如此强大。
先来看人脸识别的例子,如下图所示。经过训练,神经网络第一层所做的事就是从原始图片中提取出人脸的轮廓与边缘,即边缘检测。这样每个神经元得到的是一些边缘信息。神经网络第二层所做的事情就是将前一层的边缘进行组合,组合成人脸一些局部特征,比如眼睛、鼻子、嘴巴等。再往后面,就将这些局部特征组合起来,融合成人脸的模样。可以看出,随着层数由浅到深,神经网络提取的特征也是从边缘到局部特征到整体,由简单到复杂。可见,如果隐藏层足够多,那么能够提取的特征就越丰富、越复杂,模型的准确率就会越高。
语音识别模型也是这个道理。浅层的神经元能够检测一些简单的音调,然后较深的神经元能够检测出基本的音素,更深的神经元就能够检测出单词信息。如果网络够深,还能对短语、句子进行检测。记住一点,神经网络从左到右,神经元提取的特征从简单到复杂。特征复杂度与神经网络层数成正相关。特征越来越复杂,功能也越来越强大。
4.5 搭建深层神经网络块
下面用流程块图来解释神经网络正向传播和反向传播过程。
正向传播:
含义 | 符号 |
---|---|
输入 | a [ l − 1 ] a^{[l-1]} a[l−1] |
输出 | a [ l ] a^{[l]} a[l] |
计算时所需的参数 | W [ l ] W^{[l]} W[l] , b [ l ] b^{[l]} b[l] |
缓存变量 | z [ l ] z^{[l]} z[l] |
反向传播: | |
含义 | 符号 |
-------- | ----- |
输入 | d a [ l ] da^{[l]} da[l] |
输出 | d a [ l − 1 ] da^{[l-1]} da[l−1] |
计算时所需的参数 | W [ l ] W^{[l]} W[l] , b [ l ] b^{[l]} b[l], d z [ l ] ( d z [ l ] 与 d a [ l ] 和 z [ l ] 有关 ) dz^{[l]}(dz^{[l]}与da^{[l]}和z^{[l]}有关) dz[l](dz[l]与da[l]和z[l]有关) |
缓存变量 | d W [ l ] dW^{[l]} dW[l] , d b [ l ] db^{[l]} db[l] |
对于神经网络所有层,整体的流程块图正向传播过程和反向传播过程如下所示:
得到
d
W
[
l
]
dW^{[l]}
dW[l] ,
d
b
[
l
]
db^{[l]}
db[l] 后,进行参数更新:
W
[
l
:
=
W
[
l
]
−
α
d
W
[
l
]
W^{[l}: =W^{[l]}-\alpha dW^{[l]}
W[l:=W[l]−αdW[l]
b
[
l
]
:
=
b
[
l
]
−
α
d
b
[
l
]
b^{[l]}: =b^{[l]}-\alpha db^{[l]}
b[l]:=b[l]−αdb[l]
注意一点:
单个样本时,正向传播用x进行初始化,反向传播用
d
a
[
L
]
=
∂
L
∂
a
=
−
(
y
a
[
L
]
−
1
−
y
1
−
a
[
L
]
)
d a^{[L]}=\frac{\partial L}{\partial a}=-\left(\frac{y}{a^{[L]}}-\frac{1-y}{1-a^{[L]}}\right)
da[L]=∂a∂L=−(a[L]y−1−a[L]1−y)初始化。
m个样本时,正向传播用X进行初始化,反向传播用
d
A
[
L
]
=
∂
J
∂
A
=
1
m
∑
i
=
1
m
−
(
y
(
i
)
a
[
L
]
(
i
)
−
1
−
y
(
i
)
1
−
a
[
L
]
(
i
)
)
d A^{[L]}=\frac{\partial J}{\partial A}=\frac{1}{m}\sum_{i=1}^m{-\left(\frac{y^{(i)}}{a^{[L](i)}}-\frac{1-y^{(i)}}{1-a^{[L](i)}}\right)}
dA[L]=∂A∂J=m1∑i=1m−(a[L](i)y(i)−1−a[L](i)1−y(i))
4.6 正向传播和反向传播
正向传播过程:
- 单个训练样本
输入是 a [ l − 1 ] a^{[l-1]} a[l−1],输出是 a [ l ] a^{[l]} a[l],缓存是 z [ l ] z^{[l]} z[l],正向传播可写成:
z [ l ] = W [ l ] a [ l − 1 ] + b [ l ] a [ l ] = g [ l ] ( z [ l ] ) \begin{array}{c} z^{[l]}=W^{[l]} a^{[l-1]}+b^{[l]} \\ a^{[l]}=g^{[l]}\left(z^{[l]}\right) \end{array} z[l]=W[l]a[l−1]+b[l]a[l]=g[l](z[l]) - m个训练样本,向量化:
输入是 A [ l − 1 ] A^{[l-1]} A[l−1],输出是 A [ l ] A^{[l]} A[l],缓存是 Z [ l ] Z^{[l]} Z[l]
Z [ l ] = W [ l ] A [ l − 1 ] + b [ l ] A [ l ] = g [ l ] ( Z [ l ] ) \begin{array}{c} Z^{[l]}=W^{[l]} A^{[l-1]}+b^{[l]} \\ A^{[l]}=g^{[l]}\left(Z^{[l]}\right) \end{array} Z[l]=W[l]A[l−1]+b[l]A[l]=g[l](Z[l])
反向传播过程:
- 单个训练样本
输入是 d a [ l ] da^{[l]} da[l],输出是 d a [ l − 1 ] da^{[l-1]} da[l−1],其表达式为:
d z [ l ] = d a [ l ] ∗ g [ l ] ′ ( z [ l ] ) d W [ l ] = d z [ l ] ⋅ a [ l − 1 ] d b [ l ] = d z [ l ] d a [ l − 1 ] = W [ l ] T ⋅ d z [ l ] \begin{aligned} d z^{[l]}&=d a^{[l]} * g^{[l]^{\prime}}\left(z^{[l]}\right) \\ d W^{[l]}&=d z^{[l]} \cdot a^{[l-1]} \\ d b^{[l]}&=d z^{[l]} \\ d a^{[l-1]}&=W^{[l] T} \cdot d z^{[l]} \end{aligned} dz[l]dW[l]db[l]da[l−1]=da[l]∗g[l]′(z[l])=dz[l]⋅a[l−1]=dz[l]=W[l]T⋅dz[l]将第四个公式代入第一个公式得到 d z [ l + 1 ] d z^{[l+1]} dz[l+1]和 d z [ l ] d z^{[l]} dz[l]的关系,这个公式很重要:
d z [ l ] = W [ l + 1 ] T ⋅ d z [ l + 1 ] ∗ g [ l ] ′ ( z [ l ] ) d z^{[l]}=W^{[l+1] T} \cdot d z^{[l+1]} * g^{[l]^{\prime}}\left(z^{[l]}\right) dz[l]=W[l+1]T⋅dz[l+1]∗g[l]′(z[l]) - m个训练样本,向量化:
d Z [ l ] = d A [ l ] ∗ g [ l ] ′ ( Z [ l ] ) d W [ l ] = 1 m d Z [ l ] ⋅ A [ l − 1 ] T d b [ l ] = 1 m n p . sum ( d Z [ l ] , axis = 1 , keepdim = True ) d A [ l − 1 ] = W [ l ] T ⋅ d Z [ l ] d Z [ l ] = W [ l + 1 ] T ⋅ d Z [ l + 1 ] ∗ g [ l ] ′ ( Z [ l ] ) \begin{aligned} d Z^{[l]}&=d A^{[l]} * g^{[l]^{\prime}}\left(Z^{[l]}\right) \\ d W^{[l]}&=\frac{1}{m} d Z^{[l]} \cdot A^{[l-1] T} \\ d b^{[l]}&=\frac{1}{m} n p . \operatorname{sum}\left(d Z^{[l]}, \text { axis }=1, \text { keepdim }=\text { True }\right) \\ \qquad d A^{[l-1]}&=W^{[l] T} \cdot d Z^{[l]} \\ d Z^{[l]}&=W^{[l+1] T} \cdot d Z^{[l+1]} * g^{[l]^{\prime}}\left(Z^{[l]}\right) \end{aligned} dZ[l]dW[l]db[l]dA[l−1]dZ[l]=dA[l]∗g[l]′(Z[l])=m1dZ[l]⋅A[l−1]T=m1np.sum(dZ[l], axis =1, keepdim = True )=W[l]T⋅dZ[l]=W[l+1]T⋅dZ[l+1]∗g[l]′(Z[l])
4.7 参数和超参数
神经网络中的参数就是我们熟悉的
W
[
l
]
W^{[l]}
W[l]和
b
[
l
]
b^{[l]}
b[l]。而超参数则是例如学习速率α,训练迭代次数N,神经网络层数L,各层神经元个数
n
[
l
]
n^{[l]}
n[l],激活函数g(z)等。之所以叫做超参数的原因是它们决定了参数
W
[
l
]
W^{[l]}
W[l]和
b
[
l
]
b^{[l]}
b[l]的值。在后面的第二门课我们还将学习其它的超参数,这里先不讨论。
如何设置最优的超参数是一个比较困难的、需要经验知识的问题。通常的做法是选择超参数一定范围内的值,分别代入神经网络进行训练,测试cost function随着迭代次数增加的变化,根据结果选择cost function最小时对应的超参数值。这类似于validation的方法。
4.8 神经网络和人脑机制的关系
神经网络实际上可以分成两个部分:正向传播过程和反向传播过程。神经网络的每个神经元采用激活函数的方式,类似于感知机模型。这种模型与人脑神经元是类似的,可以说是一种非常简化的人脑神经元模型。如下图所示,人脑神经元可分为树突、细胞体、轴突三部分。树突接收外界电刺激信号(类比神经网络中神经元输入),传递给细胞体进行处理(类比神经网络中神经元激活函数运算),最后由轴突传递给下一个神经元(类比神经网络中神经元输出)。
值得一提的是,人脑神经元的结构和处理方式要复杂的多,神经网络模型只是非常简化的模型。人脑如何进行学习?是否也是通过反向传播和梯度下降算法现在还不清楚,可能会更加复杂。这是值得生物学家探索的事情。也许发现重要的新的人脑学习机制后,让我们的神经网络模型抛弃反向传播和梯度下降算法,能够实现更加准确和强大的神经网络模型!
Summary
本节课主要介绍了深层神经网络,是上一节浅层神经网络的拓展和归纳。首先,介绍了深层神经网络模型以及一些常用的符号。然后,用流程块图的方式详细推导正向传播过程和反向传播过程的输入输出和参数表达式。接着,我们介绍了超参数的概念,解释了超参数与参数的区别。最后,我们将神经网络与人脑做了类别,神经网络是简化的人脑模型。