《deeplearning.ai》 课程一第三周 | Shall
deeplearning.ai 是机器学习领域大牛Andrew Ng在Coursera上公布的新的深度学习的课程,相比之前机器学习的课程,本课程更偏重于深度学习的领域。
本文是课程一《Neural Networks and Deep Learning》的第三周笔记,上周我们给大家介绍了Logistic Regression,从本周开始,我们将正式开始学习神经网络,我们先从只有一个隐藏层的简单神经网络开始学习。在学习完本周课程后,我们将使用python实现一个单隐藏层的神经网络。
注:如果没有任何机器学习基础,直接学习本课程可能会有些费力,建议大家先去学习Andrew Ng机器学习课程,传送门在此 Coursera Machine Learning
基本概念
上周我们说过,逻辑回归是神经网络的基础,神经网络相比逻辑回归是添加了很多隐藏层。下图则是逻辑回归和神经网络的对比,在神经网络中,我们使用中括号的上角标来表示第几层。

在这里,我们同样使用计算图的概念来表示该神经网络,相比逻辑回归,我们多计算了一个a和z。并且我们同样使用前向传播和反向传播(梯度下降)来计算神经网络。
如下图就是神经网络的基本结构,它分为输入层,隐藏层和输出层,除了输入层和输出层的所有层都叫隐藏层。

神经网络的前向传播
如下图右上部分,我们先拿输入层和隐藏层的第一个神经元来看,其实这就是一个简单的逻辑回归,这样理解的话这个神经网络的隐藏层就是四个逻辑回归放在了一起。
这里我们需要注意下符号的表示,前面我们讲过中括号的上角标来表示第几层,那下角标则表示第几个神经元,比如z1为第一个神经元,a同理。

下图则为隐藏层的矩阵表示。

接下来我们来看隐藏层和输出层的连接,我们将隐藏层的a当做输入,发现了吗,这又是另一个逻辑回归。

注意我们前面讲的是针对一个样本,在逻辑回归时我们讲到了向量化,那么在这里我们同样需要对变量进行向量化,避免for循环,提高效率。
类比逻辑回归输入层x的向量化形式X,在神经网络里,Z就是将每个样本算出来的z横向叠加(A同理),具体如下图

神经网络中的激活函数
神经网络常用的激活函数有以下四种:Sigmoid, Tanh, ReLU, Leaky ReLU。其中Sigmoid函数我们在逻辑回归有介绍过,它的输出值在0~1之间,可以看成一个概率值,往往用在输出层,对于中间层来说,ReLU的效果最好。

激活函数都是非线性函数,那么我们为什么需要非线性的激活函数呢?
目前已有证明,如果激活函数使用线性的激活函数,那么不论有多少隐藏层,最终都是线性的组合,相当于一个线性回归。

在反向传播中,我们需要计算梯度,所以需要计算激活函数的导数,以下是四个激活函数的导数推导过程。



神经网络中的反向传播
通过上一周逻辑回归的反向传播过程,我们在这里同样使用计算图来计算神经网络中的各种梯度。

下图左侧为各个梯度的计算结果,右侧则为m个训练样本上的向量化表达。

神经网络中的参数初始化
在逻辑回归中,我们将参数w初始化为0,但如果我们在神经网络中还将w初始化为0,那么不管经过多少次前向传播和反向传播,隐藏层的所有节点都是相同的。所以我们应该随机地初始化w。

下图为具体初始化的代码实现,注意我们在初始化时乘了0.01,原因是如果我们使用了tanh作为我们的激活函数,若参数初始过大时,z也会比较大,此时梯度接近为0,梯度下降的速度就会非常的慢。

本周内容回顾
通过本周学习,我们学习到了:
- 神经网络的基本概念
- 神经网络的前向传播和反向传播
- 神经网络的激活函数
- 神经网络的参数初始化
最后贴出网易云课堂的链接,有兴趣的可以关注下我的知乎或博客,链接在最下方,可以交流下学习经验哈