deeplearning.ai学习笔记(3) —— 深层神经网络

时间:2022-12-14 17:25:50

本文转载自吴恩达《深度学习》系列课程笔记

深层神经网络(Deep L-layer neural network)

在过去的几年中,DLI(深度学习学院 deep learning institute)已经意识到有一些函数,只有非常深的神经网络能学会,而更浅的模型则办不到。尽管对于任何给定的问题很难去提前预测到底需要多深的神经网络,所以先去尝试逻辑回归,尝试一层然后两层隐含层,然后把隐含层的数量看做是另一个可以*选择大小的超参数,然后再保留交叉验证数据上评估,或者用你的开发集来评估。

再看下深度学习的符号定义:

deeplearning.ai学习笔记(3) —— 深层神经网络

上图是一个四层的神经网络,有三个隐藏层。可以看到,第一层(即左边数过去第二层,因为输入层是第0层)有5个神经元数目,第二层5个,第三层3个。

用L表示层数,上图: L = 4 ,输入层的索引为“0”,第一个隐藏层 n [ 1 ] = 5 ,表示有5个隐藏神经元,同理 n [ 2 ] = 5 n [ 3 ] = 3 n [ 4 ] = n [ L ] = 1 (输出单元为1)。而输入层, n [ 0 ] = n x = 3

对于每层l都用 a [ l ] 来记作l层激活后结果。

通过用激活函数 g 计算 z [ l ] ,激活函数也被索引为层数 l ,然后用 w [ l ] 来记作在l层计算 z [ l ] 值的权重。类似的, z [ l ] 里的方程 b [ l ] 也一样。

最后总结下符号约定:

输入的特征记作 x ,但是 x 同样也是0层的激活函数,所以 x = a [ 0 ]

最后一层的激活函数 a [ L ] 是等于这个神经网络所预测的输出结果。

深层网络中的前向和反向传播

前向传播

输入 a [ l 1 ]

输出 a [ l ] ,cache( z [ l ] )

公式

Z [ l ] = W [ l ] a [ l 1 ] + b [ l ]

a [ l ] = g [ l ] ( Z [ l ] )

反向传播

输入 d a [ l ]

输出 d a [ l 1 ] d W [ l ] d b [ 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 ]

搭建深层神经网络块

deeplearning.ai学习笔记(3) —— 深层神经网络

神经网络的一步训练(一个梯度下降循环),包含了从 a [ 0 ] (即 x)经过一系列正向传播计算得到 y ^ (即 a [ l ] )。然后再计算 d a [ l ] ,开始实现反向传播,得到所有的导数项,W 和 b 也会在每一层被更新。

在代码实现时,可以将正向传播过程中计算出来的 z 值缓存下来,待到反向传播计算时使用。

矩阵的维度

W [ l ] : ( n [ l ] , n [ l 1 ] )

b [ l ] : ( n [ l ] , 1 )

d W [ l ] : ( n [ l ] , n [ l 1 ] )

d b [ l ] : ( n [ l ] , 1 )

对于 Z、a,向量化之前有:

Z [ l ] , a [ l ] : ( n [ l ] , 1 )

而在向量化之后,则有:

Z [ l ] , A [ l ] : ( n [ l ] , m )

在计算反向传播时,dZ、dA 的维度和 Z、A 是一样的。

使用深层表示的原因

对于人脸识别,神经网络的第一层从原始图片中提取人脸的轮廓和边缘,每个神经元学习到不同边缘的信息;网络的第二层将第一层学得的边缘信息组合起来,形成人脸的一些局部的特征,例如眼睛、嘴巴等;后面的几层逐步将上一层的特征组合起来,形成人脸的模样。随着神经网络层数的增加,特征也从原来的边缘逐步扩展为人脸的整体,由整体到局部,由简单到复杂。层数越多,那么模型学习的效果也就越精确。

同样的,对于语音识别,第一层神经网络可以学习到语言发音的一些音调,后面更深层次的网络可以检测到基本的音素,再到单词信息,逐渐加深可以学到短语、句子。

通过例子可以看到,随着神经网络的深度加深,模型能学习到更加复杂的问题,功能也更加强大。

参数和超参数

参数即是我们在过程中想要模型学习到的信息(模型自己能计算出来的),例如 W [ l ] b [ l ] 。而超参数(hyper parameters) 即为控制参数的输出值的一些网络信息(需要人经验判断)。超参数的改变会导致最终得到的参数 W [ l ] b [ l ] 的改变。

典型的超参数有:

  • 学习速率:α
  • 迭代次数:N
  • 隐藏层的层数:L
  • 每一层的神经元个数: n [ 1 ] n [ 2 ] ,…
  • 激活函数 g(z) 的选择

当开发新应用时,预先很难准确知道超参数的最优值应该是什么。因此,通常需要尝试很多不同的值。应用深度学习领域是一个很大程度基于经验的过程。