《神经网络与深度学习》课程笔记(4)– 浅层神经网络

首页 » 算法 » 正文

一、Neural Networks Overview

首先,我们从整体结构上来大致看一下神经网络模型。

前面的课程中,我们已经使用计算图的方式介绍了逻辑回归梯度下降算法的正向传播和反向传播两个过程。如下图所示。神经网络的结构与逻辑回归类似,只是神经网络的层数比逻辑回归多一层,多出来的中间那层称为隐藏层或中间层。这样从计算上来说,神经网络的正向传播和反向传播过程只是比逻辑回归多了一次重复的计算。正向传播过程分成两层,第一层是输入层到隐藏层,用上标[1]来表示:
《神经网络与深度学习》课程笔记(4)-- 浅层神经网络
第二层是隐藏层到输出层,用上标[2]来表示:

《神经网络与深度学习》课程笔记(4)-- 浅层神经网络
在写法上值得注意的是,方括号上标[i]表示当前所处的层数;圆括号上标(i)表示第i个样本。

同样,反向传播过程也分成两层。第一层是输出层到隐藏层,第二层是隐藏层到输入层。其细节部分我们之后再来讨论。

下面我们以图示的方式来介绍单隐藏层的神经网络结构。如下图所示,单隐藏层神经网络就是典型的浅层(shallow)神经网络。《神经网络与深度学习》课程笔记(4)-- 浅层神经网络
结构上,从左到右,可以分成三层:输入层(Input layer),隐藏层(Hidden layer)和输出层(Output layer)。输入层和输出层,顾名思义,对应着训练样本的输入和输出,很好理解。隐藏层是抽象的非线性的中间层,这也是其被命名为隐藏层的原因。
《神经网络与深度学习》课程笔记(4)-- 浅层神经网络
《神经网络与深度学习》课程笔记(4)-- 浅层神经网络

二、神经网络计算过程

1.单个样本

接下来我们开始详细推导神经网络的计算过程。回顾一下,我们前面讲过两层神经网络可以看成是逻辑回归再重复计算一次。如下图所示,逻辑回归的正向计算可以分解成计算z和a的两部分:
《神经网络与深度学习》课程笔记(4)-- 浅层神经网络
《神经网络与深度学习》课程笔记(4)-- 浅层神经网络
《神经网络与深度学习》课程笔记(4)-- 浅层神经网络
《神经网络与深度学习》课程笔记(4)-- 浅层神经网络

2.多个样本

上一部分我们只是介绍了单个样本的神经网络正向传播矩阵运算过程。而对于m个训练样本,我们也可以使用矩阵相乘的形式来提高计算效率。而且它的形式与上一部分单个样本的矩阵运算十分相似,比较简单。
《神经网络与深度学习》课程笔记(4)-- 浅层神经网络
值得注意的是输入矩阵X也可以写成A[0]

三、激活函数

神经网络隐藏层和输出层都需要激活函数(activation function),在之前的课程中我们都默认使用Sigmoid函数σ(x)作为激活函数。其实,还有其它激活函数可供使用,不同的激活函数有各自的优点。下面我们就来介绍几个不同的激活函数g(x)

  • sigmoid函数
    《神经网络与深度学习》课程笔记(4)-- 浅层神经网络
  • tanh函数
    《神经网络与深度学习》课程笔记(4)-- 浅层神经网络
  • ReLU函数
    《神经网络与深度学习》课程笔记(4)-- 浅层神经网络
  • Leaky ReLU函数
    《神经网络与深度学习》课程笔记(4)-- 浅层神经网络

如上图所示,不同激活函数形状不同,a的取值范围也有差异。

1.如何选择合适的激活函数呢?

比较sigmoid函数和tanh函数

首先我们来比较sigmoid函数和tanh函数。
对于隐藏层的激活函数,一般来说,tanh函数要比sigmoid函数表现更好一些。因为tanh函数的取值范围在[-1,+1]之间,隐藏层的输出被限定在[-1,+1]之间,可以看成是在0值附近分布,均值为0。这样从隐藏层到输出层,数据起到了归一化(均值为0)的效果。因此,隐藏层的激活函数,tanh比sigmoid更好一些。
而对于输出层的激活函数,因为二分类问题的输出取值为{0,+1},所以一般会选择sigmoid作为激活函数。
观察sigmoid函数和tanh函数,我们发现有这样一个问题,就是当|z|很大的时候,激活函数的斜率(梯度)很小。因此,在这个区域内,梯度下降算法会运行得比较慢。在实际应用中,应尽量避免使z落在这个区域,使|z|尽可能限定在零值附近,从而提高梯度下降算法运算速度。

ReLU激活函数

为了弥补sigmoid函数和tanh函数的这个缺陷,就出现了ReLU激活函数。ReLU激活函数在z大于零时梯度始终为1;在z小于零时梯度始终为0;z等于零时的梯度可以当成1也可以当成0,实际应用中并不影响。
对于隐藏层,选择ReLU作为激活函数能够保证z大于零时梯度始终为1,从而提高神经网络梯度下降算法运算速度。但当z小于零时,存在梯度为0的缺点,实际应用中,这个缺点影响不是很大。为了弥补这个缺点,出现了Leaky ReLU激活函数,能够保证z小于零是梯度不为0。

总结

如果是分类问题,输出层的激活函数一般会选择sigmoid函数。
但是隐藏层的激活函数通常不会选择sigmoid函数,tanh函数的表现会比sigmoid函数好一些。实际应用中,通常会会选择使用ReLU或者Leaky ReLU函数,保证梯度下降速度不会太小。
其实,具体选择哪个函数作为激活函数没有一个固定的准确的答案,应该要根据具体实际问题进行验证(validation)。

2.激活函数为什么是非线性的?

上一部分讲的四种激活函数都是非线性(non-linear)的。那是否可以使用线性激活函数呢?答案是不行!下面我们就来进行简要的解释和说明。

假设所有的激活函数都是线性的,为了简化计算,我们直接令激活函数g(z)=z,即a=z。那么,浅层神经网络的各层输出为:
《神经网络与深度学习》课程笔记(4)-- 浅层神经网络
经过推导我们发现a[2]仍是输入变量x的线性组合。这表明,使用神经网络与直接使用线性模型的效果并没有什么两样。即便是包含多层隐藏层的神经网络,如果使用线性函数作为激活函数,最终的输出仍然是输入x的线性模型。这样的话神经网络就没有任何作用了。因此,隐藏层的激活函数必须要是非线性的。

另外,如果所有的隐藏层全部使用线性激活函数,只有输出层使用非线性激活函数,那么整个神经网络的结构就类似于一个简单的逻辑回归模型,而失去了神经网络模型本身的优势和价值。

值得一提的是,如果是预测问题而不是分类问题,输出y是连续的情况下,输出层的激活函数可以使用线性函数。如果输出y恒为正值,则也可以使用ReLU激活函数,具体情况,具体分析。

3.激活函数求导

在梯度下降反向计算过程中少不了计算激活函数的导数即梯度。
对于sigmoid函数的导数:
《神经网络与深度学习》课程笔记(4)-- 浅层神经网络
对于tanh函数的导数:
《神经网络与深度学习》课程笔记(4)-- 浅层神经网络
对于ReLU函数的导数:
《神经网络与深度学习》课程笔记(4)-- 浅层神经网络
对于Leaky ReLU函数:
《神经网络与深度学习》课程笔记(4)-- 浅层神经网络

四、神经网络反向传播梯度计算

接下来看一下在神经网络中如何进行梯度计算。
《神经网络与深度学习》课程笔记(4)-- 浅层神经网络

1.单个训练样本推导

我们仍然使用计算图的方式来推导神经网络反向传播过程。
对于单个训练样本,正向过程很容易,反向过程可以根据梯度计算方法逐一推导。
《神经网络与深度学习》课程笔记(4)-- 浅层神经网络
《神经网络与深度学习》课程笔记(4)-- 浅层神经网络

2.m个训练样本

浅层神经网络(包含一个隐藏层),m个训练样本的正向传播过程和反向传播过程分别包含了6个表达式,其向量化矩阵形式如下图所示:
《神经网络与深度学习》课程笔记(4)-- 浅层神经网络

五、权重随机初始化讨论

神经网络模型中的参数权重W是不能全部初始化为零的,接下来我们分析一下原因。

举个简单的例子,一个浅层神经网络包含两个输入,隐藏层包含两个神经元。如果权重W[1]和W[2]都初始化为零,即:
《神经网络与深度学习》课程笔记(4)-- 浅层神经网络
《神经网络与深度学习》课程笔记(4)-- 浅层神经网络
我们把这种权重W全部初始化为零带来的问题称为symmetry breaking problem。解决方法也很简单,就是将W进行随机初始化(b可初始化为零)。python里可以使用如下语句进行W和b的初始化:

W_1 = np.random.randn((2,2))*0.01
b_1 = np.zero((2,1))
W_2 = np.random.randn((1,2))*0.01
b_2 = 0

《神经网络与深度学习》课程笔记(4)-- 浅层神经网络

六、总结

本节课主要介绍了浅层神经网络。首先,我们简单概述了神经网络的结构:包括输入层,隐藏层和输出层。然后,我们以计算图的方式推导了神经网络的正向输出,并以向量化的形式归纳出来。接着,介绍了不同的激活函数并做了比较,实际应用中根据不同需要选择合适的激活函数。激活函数必须是非线性的,不然神经网络模型起不了任何作用。然后,我们重点介绍了神经网络的反向传播过程以及各个参数的导数推导,并以矩阵形式表示出来。最后,介绍了权重随机初始化的重要性,必须对权重W进行随机初始化操作。
转载自该处

未经允许不得转载:作者:1147-柳同学, 转载或复制请以 超链接形式 并注明出处 拜师资源博客
原文地址:《《神经网络与深度学习》课程笔记(4)– 浅层神经网络》 发布于2021-02-22

分享到:
赞(0) 打赏

评论 抢沙发

评论前必须登录!

  注册



长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

Vieu3.3主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录