鹤壁建设网站推广,外贸网网站建设,wordpress 文章列表顺序,新手如何优化网站排名1. 神经网络综述
首先#xff0c;我们从整体结构上来大致看一下神经网络模型。
前面的课程中#xff0c;我们已经使用计算图的方式介绍了逻辑回归梯度下降算法的正向传播和反向传播两个过程。如下图所示。神经网络的结构与逻辑回归类似#xff0c;只是神经网络的层数比逻辑…1. 神经网络综述
首先我们从整体结构上来大致看一下神经网络模型。
前面的课程中我们已经使用计算图的方式介绍了逻辑回归梯度下降算法的正向传播和反向传播两个过程。如下图所示。神经网络的结构与逻辑回归类似只是神经网络的层数比逻辑回归多一层多出来的中间那层称为隐藏层/中间层。这样从计算上来说神经网络的正向传播和反向传播过程只是比逻辑回归多了一次重复的计算。正向传播过程分成两层第一层是输入层到隐藏层用上标[1]来表示 第二层是隐藏层到输出层用上标[2]来表示 在写法上值得注意的是方括号上标[i]表示当前所处的层数圆括号上标(i)表示第i个样本。
同样反向传播过程也分成两层。第一层是输出层到隐藏层第二层是隐藏层到输入层。 2. 神经网络表示
单隐藏层神经网络就是典型的浅层shallow神经网络如下图所示。 结构上从左到右可以分成三层输入层Input layer隐藏层Hidden layer和输出层Output layer。输入层和输出层顾名思义对应着训练样本的输入和输出很好理解。隐藏层是抽象的非线性的中间层。
在写法上我们通常把输入矩阵X记为把隐藏层输出记为上标从0开始。用下标表示第几个神经元注意下标从1开始。例如表示隐藏层第1个神经元表示隐藏层第2个神经元。这样隐藏层有4个神经元就可以将其输出写成矩阵的形式 最后相应的输出层记为即y^。这种单隐藏层神经网络也被称为两层神经网络2 layer NN。之所以叫两层神经网络是因为通常我们只会计算隐藏层输出和输出层的输出输入层是不用计算的。这也是我们把输入层层数上标记为0的原因。 3. 计算神经网络的输出 接下来我们开始详细推导神经网络的计算过程。两层神经网络可以看成是逻辑回归再重复计算一次。如下图所示逻辑回归的正向计算可以分解成计算z和a的两部分 对于两层神经网络从输入层到隐藏层对应一次逻辑回归运算从隐藏层到输出层对应一次逻辑回归运算。每层计算时要注意对应的上标和下标一般我们记上标方括号表示layer下标表示第几个神经元。例如表示第l层的第i个神经元。注意i从1开始l从0开始。
下面我们将从输入层到输出层的计算公式列出来 然后从隐藏层到输出层的计算公式为 其中a[1]为 上述每个节点的计算都对应着一次逻辑运算的过程分别由计算z和a两部分组成。 为了提高程序运算速度我们引入向量化和矩阵运算的思想将上述表达式转换成矩阵运算的形式 之前也介绍过这里顺便提一下W[1]的维度是4,3b[1]的维度是4,1W[2]的维度是1,4b[2]的维度是1,1。这点需要特别注意。
4. 多个变量进行矢量化
上一部分我们只是介绍了单个样本的神经网络正向传播矩阵运算过程。而对于m个训练样本我们也可以使用矩阵相乘的形式来提高计算效率。而且它的形式与上一部分单个样本的矩阵运算十分相似比较简单。 不使用for循环利用矩阵运算的思想输入矩阵X的维度为nx,m。这样我们可以把上面的for循环写成矩阵运算的形式 其中的维度是4,m4是隐藏层神经元的个数的维度与相同和的维度均为1,m。
对上面这四个矩阵来说均可以这样来理解行表示神经元个数列表示样本数目m。
5. 矢量化实现的解释
这部分Andrew用图示的方式解释了m个样本的神经网络矩阵运算过程。其实内容比较简单只要记住上述四个矩阵的行表示神经元个数列表示样本数目m就行了。
值得注意的是输入矩阵X也可以写成。
6. 激活函数
神经网络隐藏层和输出层都需要激活函数activation function在之前的课程中我们都默认使用Sigmoid函数σ(x)σ(x)作为激活函数。其实还有其它激活函数可供使用不同的激活函数有各自的优点。下面我们就来介绍几个不同的激活函数g(x)。
sigmoid函数 tanh函数 ReLU函数 Leaky ReLU函数 如上图所示不同激活函数形状不同a的取值范围也有差异。
如何选择合适的激活函数呢首先我们来比较sigmoid函数和tanh函数。对于隐藏层的激活函数一般来说tanh函数要比sigmoid函数表现更好一些。因为tanh函数的取值范围在[-1,1]之间隐藏层的输出被限定在[-1,1]之间可以看成是在0值附近分布均值为0。这样从隐藏层到输出层数据起到了归一化均值为0的效果。因此隐藏层的激活函数tanh比sigmoid更好一些。
而对于输出层的激活函数因为二分类问题的输出取值为{0,1}所以一般会选择sigmoid作为激活函数。
观察sigmoid函数和tanh函数我们发现有这样一个问题就是当|z|很大的时候激活函数的斜率梯度很小。因此在这个区域内梯度下降算法会运行得比较慢。在实际应用中应尽量避免使z落在这个区域使|z|尽可能限定在零值附近从而提高梯度下降算法运算速度。
为了弥补sigmoid函数和tanh函数的这个缺陷就出现了ReLU激活函数。ReLU激活函数在z大于零时梯度始终为1在z小于零时梯度始终为0z等于零时的梯度可以当成1也可以当成0实际应用中并不影响。
对于隐藏层选择ReLU作为激活函数能够保证z大于零时梯度始终为1从而提高神经网络梯度下降算法运算速度。但当z小于零时存在梯度为0的缺点实际应用中这个缺点影响不是很大。为了弥补这个缺点出现了Leaky ReLU激活函数能够保证z小于零是梯度不为0。
最后总结一下
如果是分类问题输出层的激活函数一般会选择sigmoid函数。但是隐藏层的激活函数通常不会选择sigmoid函数tanh函数的表现会比sigmoid函数好一些。实际应用中通常会会选择使用ReLU或者Leaky ReLU函数保证梯度下降速度不会太小。其实具体选择哪个函数作为激活函数没有一个固定的准确的答案应该要根据具体实际问题进行验证validation。
7. 为什么需要非线性激活函数
我们知道上一部分讲的四种激活函数都是非线性non-linear的。那是否可以使用线性激活函数呢答案是不行下面我们就来进行简要的解释和说明。
假设所有的激活函数都是线性的为了简化计算我们直接令激活函数g(z)zg即az。那么浅层神经网络的各层输出为 我们对上式中a[2]进行化简计算 经过推导我们发现a[2]仍是输入变量x的线性组合。这表明使用神经网络与直接使用线性模型的效果并没有什么两样。即便是包含多层隐藏层的神经网络如果使用线性函数作为激活函数最终的输出仍然是输入x的线性模型。这样的话神经网络就没有任何作用了。因此隐藏层的激活函数必须要是非线性的。
另外如果所有的隐藏层全部使用线性激活函数只有输出层使用非线性激活函数那么整个神经网络的结构就类似于一个简单的逻辑回归模型而失去了神经网络模型本身的优势和价值。
值得一提的是如果是预测问题而不是分类问题输出y是连续的情况下输出层的激活函数可以使用线性函数。如果输出y恒为正值则也可以使用ReLU激活函数具体情况具体分析。
8. 激活函数的导数-梯度
在梯度下降反向计算过程中少不了计算激活函数的导数即梯度。
我们先来看一下sigmoid函数的导数 对于tanh函数的导数 对于ReLU函数的导数 对于Leaky ReLU函数 9. 神经网络的梯度下降法
接下来看一下在神经网络中如何进行梯度计算。 该神经网络正向传播过程为 其中g(⋅)g(⋅)表示激活函数。
反向传播是计算导数梯度的过程这里先列出来Cost function对各个参数的梯度 反向传播的具体推导过程我们下一部分再进行详细说明。 10. 神经网络反向传播过程(optional)
我们仍然使用计算图的方式来推导神经网络反向传播过程。记得之前介绍逻辑回归时我们就引入了计算图来推导正向传播和反向传播其过程如下图所示 由于多了一个隐藏层神经网络的计算图要比逻辑回归的复杂一些如下图所示。对于单个训练样本正向过程很容易反向过程可以根据梯度计算方法逐一推导。 总结一下浅层神经网络包含一个隐藏层m个训练样本的正向传播过程和反向传播过程分别包含了6个表达式其向量化矩阵形式如下图所示 11. Random Initialization
神经网络模型中的参数权重W是不能全部初始化为零的接下来我们分析一下原因。
举个简单的例子一个浅层神经网络包含两个输入隐藏层包含两个神经元。如果权重W[1]和W[2]都初始化为零即 我们把这种权重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
这里我们将和乘以0.01的目的是尽量使得权重W初始化比较小的值。之所以让W比较小是因为如果使用sigmoid函数或者tanh函数作为激活函数的话W比较小得到的|z|也比较小靠近零点而零点区域的梯度比较大这样能大大提高梯度下降算法的更新速度尽快找到全局最优解。如果W较大得到的|z|也比较大附近曲线平缓梯度较小训练过程会慢很多。
当然如果激活函数是ReLU或者Leaky ReLU函数则不需要考虑这个问题。但是如果输出层是sigmoid函数则对应的权重W最好初始化到比较小的值。
12. 总结
本节课主要介绍了浅层神经网络。
首先我们简单概述了神经网络的结构包括输入层隐藏层和输出层。然后我们以计算图的方式推导了神经网络的正向输出并以向量化的形式归纳出来。 接着介绍了不同的激活函数并做了比较实际应用中根据不同需要选择合适的激活函数。激活函数必须是非线性的不然神经网络模型起不了任何作用。 然后我们重点介绍了神经网络的反向传播过程以及各个参数的导数推导并以矩阵形式表示出来。 最后介绍了权重随机初始化的重要性必须对权重W进行随机初始化操作。