week4
学习大概是最可反映付出与回报成正比的事情了叭。
共勉!
——————————————————————
4.1 Deep L-layer neural network
在前三周学习了单隐层神经网络和单层神经网络(即逻辑回归),通常隐藏层较少的神经网络,比如只有一两层的,就称之为 shallow model,也就是较浅的网络,如下图所示的前三种模型。相对应也有 deep model,即含有较多的隐藏层,如下图的最后一个模型。
事实上, shallow model 很难实现学习一些比较复杂的函数,或者说只有比较深的网络才能学习这些复杂函数,因此学习深层神经网络是非常有必要的。
首先给出一些描述深层神经网络的符号注记,以下面的网络为例:
- L L L:表示网络的层数,此网络中 L = 5 L=5 L=5;
- n [ l ] n^{[l]} n[l]:表示第 l l l 层的单元数目,以第0层表示输入层,所以 n [ 0 ] = n x = 3 , n [ 1 ] = n [ 2 ] = 5 , n [ 3 ] = 3 , n [ 4 ] = n [ L ] = 1 n^{[0]}=n_x=3,n^{[1]}=n^{[2]}=5,n^{[3]}=3,n^{[4]}=n^{[L]}=1 n[0]=nx=3,n[1]=n[2]=5,n[3]=3,n[4]=n[L]=1;
- 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 ] = x a^{[0]}=x a[0]=x,对于输出层有 a [ 4 ] = a [ L ] = y ^ a^{[4]}=a^{[L]}=\hat{y} a[4]=a[L]=y^;
- W [ l ] W^{[l]} W[l]:表示第 l l l 层的权重矩阵;
- b [ l ] b^{[l]} b[l]:表示第 l l l 层的偏置;
4.2 深层网络中的前向传播
仍以该网络为例,学习深层网络是如何进行前向传播的:
4.2.1 单样本的前向传播
假设输入的样本为 x x x,我们来逐层计算一下输出与激活向量。
第一个式子中,用
a
[
0
]
a^{[0]}
a[0] 来表示输入的特征向量之前就已经说过了,并且能够发现,每一层的计算公式都是相似的,因此我们可以将单样本的前向传播归纳为以下两个公式:
4.2.2 训练集的前向传播
和前面讲的差不多,对于多样本或者说整个训练集的传播,使用向量化要比用for循环更快,深层网络的这种向量化与单隐层神经网络的向量化是相似的,不外乎增加了一些隐藏层。
同样可以发现,每层的计算公式都是相似的,因此可以归结为:
4.2.3 归纳
因此无论是单个样本的向量化还是整个训练集的向量化,其计算过程都是一样的,即从前向后地逐层计算激活向量。实际问题中,这样的逐层计算是可以利用for循环来实现的,如下所示:
4.2.4 核对矩阵的维数
吴老师在课堂上说,手动核对一下矩阵的维数是非常有效的避免bug的方法,所以下面用这个四隐层的神经网络为例,来演示下如何确定矩阵维数。
(1) 单样本的矩阵维数
以第一个隐藏层为例,
z
[
1
]
=
W
[
1
]
x
+
b
[
1
]
z^{[1]}=W^{[1]}x+b^{[1]}
z[1]=W[1]x+b[1]。
其中 :
- x : ( 2 , 1 ) = ( n [ 0 ] , 1 ) x: (2,1)=(n^{[0]},1) x:(2,1)=(n[0],1)
- z [ 1 ] : ( 3 , 1 ) = ( n [ 1 ] , 1 ) z^{[1]}: (3,1)=(n^{[1]},1) z[1]:(3,1)=(n[1],1)
暂时忽略 b [ 1 ] b^{[1]} b[1] 的话,根据矩阵乘法很容易得知:
- W [ 1 ] : ( 3 , 2 ) = ( n [ 1 ] , n [ 0 ] ) W^{[1]}:(3,2)=(n^{[1]},n^{[0]}) W[1]:(3,2)=(n[1],n[0])
再根据矩阵的加法,就能得到:
- b [ 1 ] : ( 3 , 1 ) = ( n [ 1 ] , 1 ) b^{[1]}:(3,1)=(n^{[1]},1) b[1]:(3,1)=(n[1],1)
剩下的几层就不一一举例了,放在下面的表格里。
(2) 训练集的矩阵维数
以第一个隐藏层为例,
Z
[
1
]
=
W
[
1
]
X
+
b
[
1
]
Z^{[1]}=W^{[1]}X+b^{[1]}
Z[1]=W[1]X+b[1]。
其中 :
- X : ( 2 , m ) = ( n [ 0 ] , m ) X: (2,m)=(n^{[0]},m) X:(2,m)=(n[0],m)
- Z [ 1 ] / A [ 1 ] : ( 3 , m ) = ( n [ 1 ] , m ) Z^{[1]}/A^{[1]}: (3,m)=(n^{[1]},m) Z[1]/A[1]:(3,m)=(n[1],m)
暂时忽略 b [ 1 ] b^{[1]} b[1] 的话,根据矩阵乘法很容易得知:
- W [ 1 ] : ( 3 , 2 ) = ( n [ 1 ] , n [ 0 ] ) W^{[1]}:(3,2)=(n^{[1]},n^{[0]}) W[1]:(3,2)=(n[1],n[0])
再根据矩阵的加法,就能得到:
- b [ 1 ] : ( 3 , m ) = ( n [ 1 ] , m ) b^{[1]}:(3,m)=(n^{[1]},m) b[1]:(3,m)=(n[1],m)
剩余层的参数如下:
其他需要检查的就是输入特征向量与输出特征向量以及激活值,希望我自己到时候能想起来用这个小技巧哈哈哈哈哈。
4.3 为什么需要深层表示
所谓的**深层表示(deep representation)**即含有许多隐藏层的神经网络。
4.3.1 深度网络在计算什么
以下面的人脸检测构建的神经网络为例:
- 第一个隐藏层可以看作特征检测器(feature detector)或边缘检测器(edge detector),它由24个隐藏单元构成,如上图中底部的第一张图。其中每一个小方格都代表了一个隐藏单元,比如左上角的小方格,它的作用可能就是检测图像的垂直边缘,而右下方的小格子则用于检测图像的水平边缘。
- 第二个隐藏层起到的作用就是将上一层探测到的特征组合成面部的不同部分,比如眼睛、鼻子等等。
- 通常认为前面两层学到的特征是简单的,是lower features,那么第三个隐藏层的作用就是将这些浅层特征组合在一起,形成复杂的、抽象的特征,最终用于计算输出 y ^ \hat{y} y^。
所以神经网络由浅入深的过程也是一个从简单到复杂、从lower features到deep features的过程,在这一过程中,神经网络会检测不同的特征或者说学习不同的函数。
4.3.2 电路理论与深度学习
电路理论(circuit theory)指的是:在非正式的情况下,存在很多函数都可以用较小但却很深的神经网络来计算(这里的较小是指隐藏单元的数量较少),但如果用相对浅一些的神经网络计算同样的函数,则需要呈指数增长的单元数量才能达到相同的计算效果。以计算 异或(XOR) 为例:
能够看出,在增加隐藏层的情况下,仅需
O
(
l
o
g
n
)
O(logn)
O(logn) 的复杂度即可计算出结果,而在使用单层网络的情况下,由于
n
n
n 个特征具有
2
n
2^n
2n 中组合,故需要
O
(
2
n
)
O(2n)
O(2n) 的复杂度。
4.4 实现神经网络
4.4.1 搭建神经网络块
(1) 第 l l l 层的前向传播与反向传播
前面学到了神经网络的学习过程包括前向传播和反向传播,那么实际问题中要如何实现这两种传播过程呢?对于 l a y e r l layer\ l layer l 而言,它即要经过前向传播也要经过反向传播,那么我们需要明确这两种过程的输入与输出分别是什么?
- 参数 W [ l ] W^{[l]} W[l] 和 b [ l ] b^{[l]} b[l] 肯定是必不可少的。
- 对于前向传播来说,目的是计算每一层的激活向量 a [ l ] a^{[l]} a[l],所以前向传播中每一层的输入就是 a [ l − 1 ] a^{[l-1]} a[l−1],输出为 a [ l ] a^{[l]} a[l](对于第一层有 a [ 0 ] = x a^{[0]}=x a[0]=x)。在这里涉及到的另外一个输出是 c a c h e z [ l ] cache\ z^{[l]} cache z[l],之所以进行缓存,是为了在反向传播的时候方便快速地将参数 W [ l ] W^{[l]} W[l] 和 b [ l ] b^{[l]} b[l] 分享或者说复制。
- 而反向传播的目的是计算梯度,所以反向传播中每一层的输入为 d a [ l ] da^{[l]} da[l] 与 c a c h e z [ l ] cache\ z^{[l]} cache z[l],虽然我们只是缓存了 z [ l ] z^{[l]} z[l],但实际上的缓存还包括了参数 W [ l ] W^{[l]} W[l] 和 b [ l ] b^{[l]} b[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] (因为是反向传播嘛 所以从后面的隐藏层往前面的隐藏层进行传递)。如下图所示:
(2) L层神经网络的梯度下降循环
当我们能够实现上面的两个函数后,就可以实现整个神经网络的计算过程了。
4.4.2 具体实现输出
上一小节学习了整个神经网络进行计算的过程,这节是如何实现上述过程中重复执行的基本操作。
对 l a y e r l layer l layerl 而言:
(1) 前向传播
(2)反向传播
4.4.3 小结
以这样一个双隐层神经网络为例:
比较容易画出它的梯度下降循环图,假设隐藏层的激活函数为 ReLU,输出层的激活函数为sigmoid,那么有:
4.5 总结
学习的过程中,能进行思考是最重要的,继续努力吧霞霞子~。