作者: 大树先生
博客: http://blog.csdn.net/koala_tree
GitHub:https://github.com/KoalaTree
2017 年 09 月 25 日
以下为在Coursera上吴恩达老师的DeepLearning.ai课程项目中,第一部分《神经网络和深度学习》第四周课程“深层神经网络”部分关键点的笔记。笔记并不包含全部小视频课程的记录,如需学习笔记中舍弃的内容请至 Coursera 或者 网易云课堂。同时在阅读以下笔记之前,强烈建议先学习吴恩达老师的视频课程。
同时我在知乎上开设了关于机器学习深度学习的专栏收录下面的笔记,方便在移动端的学习。欢迎关注我的知乎:大树先生。一起学习一起进步呀!_
神经网络和深度学习—深层神经网络
1. 矩阵的维度
DNN结构示意图如图所示:
对于第 l l l层神经网络,单个样本其各个参数的矩阵维度为:
- 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)
- d W [ l ] dW^{[l]} dW[l]: ( n [ l ] , n [ l − 1 ] ) (n^{[l]},n^{[l-1]}) (n[l],n[l−1])
- d b [ l ] db^{[l]} db[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)
- A [ l ] = Z [ l ] A^{[l]}=Z^{[l]} A[l]=Z[l]: ( n [ l ] , 1 ) (n^{[l]},1) (n[l],1)
2. 为什么使用深层表示
人脸识别和语音识别:
对于人脸识别,神经网络的第一层从原始图片中提取人脸的轮廓和边缘,每个神经元学习到不同边缘的信息;网络的第二层将第一层学得的边缘信息组合起来,形成人脸的一些局部的特征,例如眼睛、嘴巴等;后面的几层逐步将上一层的特征组合起来,形成人脸的模样。随着神经网络层数的增加,特征也从原来的边缘逐步扩展为人脸的整体,由整体到局部,由简单到复杂。层数越多,那么模型学习的效果也就越精确。
对于语音识别,第一层神经网络可以学习到语言发音的一些音调,后面更深层次的网络可以检测到基本的音素,再到单词信息,逐渐加深可以学到短语、句子。
所以从上面的两个例子可以看出随着神经网络的深度加深,模型能学习到更加复杂的问题,功能也更加强大。
电路逻辑计算:
假定计算异或逻辑输出:
y = x 1 ⊕ x 2 ⊕ x 3 ⊕ ⋯ ⊕ x n y=x_{1}\oplus x_{2}\oplus x_{3}\oplus \cdots\oplus x_{n} y=x1⊕x2⊕x3⊕⋯⊕xn
对于该运算,若果使用深度神经网络,每层将前一层的相邻的两单元进行异或,最后到一个输出,此时整个网络的层数为一个树形的形状,网络的深度为 O ( log 2 ( n ) ) O(\log_{2}(n)) O(log2(n)),共使用的神经元的个数为:
1 + 2 + ⋅ + 2 log 2 ( n ) − 1 = 1 ⋅ 1 − 2 log 2 ( n ) 1 − 2 = 2 log 2 ( n ) − 1 = n − 1 1+2+\cdot+2^{\log_{2}(n)-1}=1\cdot \dfrac{1-2^{\log_{2}(n)}}{1-2}=2^{\log_{2}(n)}-1=n-1 1+2+⋅+2log2(n)−1=1⋅1−21−2log2(n)=2log2(n)−1=n−1
即输入个数为n,输出个数为n-1。
但是如果不适用深层网络,仅仅使用单隐层的网络(如右图所示),需要的神经元个数为 2 n − 1 2^{n-1} 2n−1个 。同样的问题,但是深层网络要比浅层网络所需要的神经元个数要少得多。
3. 前向和反向传播
首先给定DNN的一些参数:
- L:DNN的总层数;
- n [ l ] n^{[l]} n[l]:表示第 l l l层的包含的单元个数;
- a [ l ] a^{[l]} a[l]:表示第 l l l层激活函数的输出;
- W [ l ] W^{[l]} W[l]:表示第 l l l层的权重;
- 输入 x x x记为 a [ 0 ] a^{[0]} a[0],输出 y ^ \hat y y^记为 a [ L ] a^{[L]} a[L]。
前向传播(Forward propagation)
Input:
a
[
l
−
1
]
a^{[l-1]}
a[l−1]
Output:
a
[
l
]
,
c
a
c
h
e
(
z
[
l
]
)
a^{[l]},\rm cache(z^{[l]})
a[l],cache(z[l])
- 公式:
z [ l ] = W [ l ] ⋅ a [ l − 1 ] + b [ l ] a [ l ] = g [ l ] ( z [ l ] ) z^{[l]}= W^{[l]}\cdot a^{[l-1]}+b^{[l]}\\ a^{[l]}=g^{[l]}(z^{[l]}) z[l]=W[l]⋅a[l−1]+b[l]a[l]=g[l](z[l]) - 向量化程序:
Z [ l ] = W [ l ] ⋅ A [ l − 1 ] + b [ l ] A [ l ] = g [ l ] ( Z [ l ] ) Z^{[l]}=W^{[l]}\cdot A^{[l-1]}+b^{[l]}\\A^{[l]}=g^{[l]}(Z^{[l]}) Z[l]=W[l]⋅A[l−1]+b[l]A[l]=g[l](Z[l])
反向传播(Backward propagation)
Input:
d
a
[
l
]
da^{[l]}
da[l]
Output:
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 ] ) 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 ] dz^{[l]}=da^{[l]} * g^{[l]}{'}(z^{[l]})\\dW^{[l]}=dz^{[l]}\cdot a^{[l-1]}\\db^{[l]}=dz^{[l]}\\da^{[l-1]}=W^{[l]}{^T}\cdot dz^{[l]} dz[l]=da[l]∗g[l]′(z[l])dW[l]=dz[l]⋅a[l−1]db[l]=dz[l]da[l−1]=W[l]T⋅dz[l]
将 d a [ l − 1 ] 代 入 d z [ l ] da^{[l-1]}代入dz^{[l]} da[l−1]代入dz[l],有:
d z [ l ] = W [ l + 1 ] T ⋅ d z [ l + 1 ] ∗ g [ l ] ′ ( z [ l ] ) dz^{[l]}=W^{[l+1]}{^T}\cdot dz^{[l+1]}* g^{[l]}{'}(z^{[l]}) dz[l]=W[l+1]T⋅dz[l+1]∗g[l]′(z[l]) - 向量化程序:
d Z [ l ] = d A [ l ] ∗ g [ l ] ′ ( Z [ l ] ) d W [ l ] = 1 m d Z [ l ] ⋅ A [ l − 1 ] 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 A [ l − 1 ] = W [ l ] T ⋅ d Z [ l ] dZ^{[l]}=dA^{[l]} * g^{[l]}{'}(Z^{[l]})\\dW^{[l]}=\dfrac{1}{m}dZ^{[l]}\cdot A^{[l-1]}\\db^{[l]}=\dfrac{1}{m}np.sum(dZ^{[l]},axis=1,keepdims = True)\\dA^{[l-1]}=W^{[l]}{^T}\cdot dZ^{[l]} dZ[l]=dA[l]∗g[l]′(Z[l])dW[l]=m1dZ[l]⋅A[l−1]db[l]=m1np.sum(dZ[l],axis=1,keepdims=True)dA[l−1]=W[l]T⋅dZ[l]
4. 参数和超参数
参数:
参数即是我们在过程中想要模型学习到的信息, W [ l ] , b [ l ] W^{[l]},b^{[l]} W[l],b[l]。
超参数:
超参数即为控制参数的输出值的一些网络信息,也就是超参数的改变会导致最终得到的参数 W [ l ] , b [ l ] W^{[l]},b^{[l]} W[l],b[l]的改变。
举例:
- 学习速率: α \alpha α
- 迭代次数:N
- 隐藏层的层数:L
- 每一层的神经元个数: n [ 1 ] , n [ 2 ] , ⋯ n^{[1]},n^{[2]},\cdots n[1],n[2],⋯
- 激活函数 g ( z ) g(z) g(z)的选择
更多超参数的调整和学习吴恩达老师将在下一个主题中介绍。
大概利用了一周的时间将第一部分《神经网络和深度学习》学习完了,这一部分如其标题,主要从logistic regression 开始逐步讲解了神经网络前向传播和后向传播的内部原理,通过学习结合课后的作业确实能够更加深入更加透彻地理解神经网络的原理。感谢Ng提供这么好的课程。
本周(Week4)的课后编程题请参见:

本文是吴恩达在Coursera上的DeepLearning.ai课程第一部分的笔记,主要涵盖了深层神经网络的矩阵维度、深层表示的原因、前向和反向传播以及参数和超参数的解释。通过示例说明了深度网络在人脸识别和语音识别中的应用,以及在解决异或逻辑问题时与浅层网络相比的优势。
886

被折叠的 条评论
为什么被折叠?



