浅层神经网络

1 神经网络概述(Neural Network Overview )

我们将学习如何实现一个神经网络。在我们深入学习具体技术之前,我希望快速的预览一下我们将会学到的东西。现在我们开始快速浏览一下如何实现神经网络。我们了解了这个模型(见图 3.1.1)如何与下面公式 3.1 建立联系。
图 3.1.1 :在这里插入图片描述

公式 3.1:
𝑦𝑥𝑐} ⟹ 𝑨 = 𝑥 𝑈 𝑦 + 𝑐
如上所示,首先你需要输入特征𝑦,参数𝑥和𝑐,通过这些你就可以计算出𝑨,公式 3.2:在这里插入图片描述

接下来使用𝑨就可以计算出𝑏。我们将的符号换为表示输出𝑧^ ⟹ 𝑏 = 𝜎(𝑨),然后可以计算出 loss function 𝑀(𝑏,𝑧)
神经网络看起来是如下这个样子(图 3.1.2)。正如我之前已经提到过,你可以把许多sigmoid 单元堆叠起来形成一个神经网络。对于图 3.1.1 中的节点,它包含了之前讲的计算的两个步骤:首先通过公式 3.1 计算出值𝑨,然后通过𝜎(𝑨)计算值𝑏。
在这里插入图片描述

图 3.1.2
在这个神经网络(图 3.1.2)对应的 3 个节点,首先计算第一层网络中的各个节点相关的数𝑨 [1] ,接着计算𝛽 [1] ,在计算下一层网络同理; 我们会使用符号[𝑛] 表示第𝑛层网络中节点相关的数,这些节点的集合被称为第𝑛层网络。这样可以保证[𝑛] 不会和我们之前用来表示单个的训练样本的(𝑗) (即我们使用表示第 i 个训练样本)混淆; 整个计算程,公式如下: 公式 3.3:在这里插入图片描述

公式 3.4:
𝑦𝑒𝑋 [1]𝑒𝑐 [1]} ⟸ 𝑒𝑨 [1] = 𝑒(𝑋 [1] 𝑦 + 𝑐 [1] ) ⟸ 𝑒𝛽 [1] = 𝑒𝜎(𝑨 [1] )
类似逻辑回归,在计算后需要使用计算,接下来你需要使用另外一个线性方程对应的参数计算𝑨 [2] , 计算𝑏 [2] ,此时𝑏 [2] 就是整个神经网络最终的输出,用 𝑧^ 表示网络的输出。
公式 3.5:在这里插入图片描述

我知道这其中有很多细节,其中有一点非常难以理解,即在逻辑回归中,通过直接计算𝑨得到结果𝑏。而这个神经网络中,我们反复的计算𝑨和𝑏,计算𝑏和𝑨,最后得到了最终的输出 loss function。
你应该记得逻辑回归中,有一些从后向前的计算用来计算导数𝑒𝑏、𝑒𝑨。同样,在神经网络中我们也有从后向前的计算,看起来就像这样,最后会计算𝑒𝑏 [2] 、𝑒𝑨 [2] ,计算出来之后,然后计算计算𝑒𝑋 [2] 、𝑒𝑐 [2] 等,按公式 3.4、3.5 箭头表示的那样,从右到左反向计算。
现在你大概了解了一下什么是神经网络,基于逻辑回归重复使用了两次该模型得到上述例子的神经网络。我清楚这里面多了很多新符号和细节,如果没有理解也不用担心,在接下来的视频中我们会仔细讨论具体细节。
那么,下一个视频讲述神经网络的表示。

2 神经网络的表示(Neural Network Representation )

先回顾一下我在上一个视频画几张神经网络的图片,在这次课中我们将讨论这些图片的具体含义,也就是我们画的这些神经网络到底代表什么。
我们首先关注一个例子,本例中的神经网络只包含一个隐藏层(图 3.2.1)。这是一张神经网络的图片,让我们给此图的不同部分取一些名字。在这里插入图片描述

图 3.2.1
我们有输入特征𝑦 1 、𝑦 2 、𝑦 3 ,它们被竖直地堆叠起来,这叫做神经网络的 输入层。它包含了神经网络的输入;然后这里有另外一层我们称之为 隐藏层(图 3.2.1 的四个结点)。待会儿我会回过头来讲解术语"隐藏"的意义;在本例中最后一层只由一个结点构成,而这个只有一个结点的层被称为 输出层,它负责产生预测值。解释隐藏层的含义:在一个神经网络中,当你使用监督学习训练它的时候,训练集包含了输入𝑦也包含了目标输出𝑧,所以术语隐藏层的含义是在训练集中,这些中间结点的准确值我们是不知道到的,也就是说你看不见它们在训练集中应具有的值。你能看见输入的值,你也能看见输出的值,但是隐藏层中的东西,在训练集中你是无法看到的。所以这也解释了词语隐藏层,只是表示你无法在训练集中看到他们。
现在我们再引入几个符号,就像我们之前用向量𝑦表示输入特征。这里有个可代替的记号𝑏 [0] 可以用来表示输入特征。𝑏表示激活的意思,它意味着网络中不同层的值会传递到它们后面的层中,输入层将𝑦传递给隐藏层,所以我们将输入层的激活值称为𝑏 [0] ;下一层即隐藏层也同样会产生一些激活值,那么我将其记作𝑏 [1] ,所以具体地,这里的第一个单元或结点我们将其表示为𝑏 1[1] ,第二个结点的值我们记为𝑏2[1] 以此类推。所以这里的是一个四维的向量如果写成 Python 代码,那么它是一个规模为 4x1 的矩阵或一个大小为 4 的列向量,如下公式,它是四维的,因为在本例中,我们有四个结点或者单元,或者称为四个隐藏层单元; 公式 3.7在这里插入图片描述

最后输出层将产生某个数值𝑏,它只是一个单独的实数,所以的𝑧^ 值将取为𝑏 [2] 。这与逻辑回归很相似,在逻辑回归中,我们有𝑧^ 直接等于𝑏,在逻辑回归中我们只有一个输出层,所以我们没有用带方括号的上标。但是在神经网络中,我们将使用这种带上标的形式来明确地指出这些值来自于哪一层,有趣的是在约定俗成的符号传统中,在这里你所看到的这个例子,只能叫做一个两层的神经网络(图 3.2.2)。原因是当我们计算网络的层数时,输入层是不算入总层数内,所以隐藏层是第一层,输出层是第二层。第二个惯例是我们将输入层称为第零层,所以在技术上,这仍然是一个三层的神经网络,因为这里有输入层、隐藏层,还有输出
层。但是在传统的符号使用中,如果你阅读研究论文或者在这门课中,你会看到人们将这个神经网络称为一个两层的神经网络,因为我们不将输入层看作一个标准的层。在这里插入图片描述

图 3.2.2
最后,我们要看到的隐藏层以及最后的输出层是带有参数的,这里的隐藏层将拥有两个参数𝑋和𝑐,我将给它们加上上标[1] (𝑋 [1] ,𝑐 [1] ),表示这些参数是和第一层这个隐藏层有关系的。之后在这个例子中我们会看到𝑋是一个 4x3 的矩阵,而𝑐是一个 4x1 的向量,第一个数字 4 源自于我们有四个结点或隐藏层单元,然后数字 3 源自于这里有三个输入特征,我们之后会更加详细地讨论这些矩阵的维数,到那时你可能就更加清楚了。相似的输出层也有一些与之关联的参数𝑋 [2] 以及𝑐 [2] 。从维数上来看,它们的规模分别是 1x4 以及 1x1。1x4 是因
为隐藏层有四个隐藏层单元而输出层只有一个单元,之后我们会对这些矩阵和向量的维度做出更加深入的解释,所以现在你已经知道一个两层的神经网络什么样的了,即它是一个只有一个隐藏层的神经网络。在下一个视频中。我们将更深入地了解这个神经网络是如何进行计算的,也就是这个神
经网络是怎么输入𝑦,然后又是怎么得到𝑧^ 。

3 计算一个神经网络的输出(Computing a Neural Network’s output )

在上一节的视频中,我们介绍只有一个隐藏层的神经网络的结构与符号表示。在这节的
视频中让我们了解神经网络的输出究竟是如何计算出来的。
首先,回顾下只有一个隐藏层的简单两层 神经网络结构:在这里插入图片描述

图 3.3.1
其中,𝑦表示输入特征,𝑏表示每个神经元的输出,𝑋表示特征的权重,上标表示神经网络的层数(隐藏层为 1),下标表示该层的第几个神经元。这是神经网络的 符号惯例,下同。
神经网络的计算
关于神经网络是怎么计算的,从我们之前提及的逻辑回归开始,如下图所示。用圆圈表示神经网络的计算单元,逻辑回归的计算有两个步骤,首先你按步骤计算出𝑨,然后在第二步中你以 sigmoid 函数为激活函数计算𝑨(得出𝑏),一个神经网络只是这样子做了好多次重复计算。
在这里插入图片描述

图 3.3.2
回到两层的神经网络,我们从隐藏层的第一个神经元开始计算,如上图第一个最上面的箭头所指。从上图可以看出,输入与逻辑回归相似,这个神经元的计算与逻辑回归一样分为两步,小圆圈代表了计算的两个步骤。
第一步,计算𝑨 1[1] ,𝑨1[1]= 𝑥 1[1]𝑈 𝑦 + 𝑐1[1] 。
第二步,通过激活函数计算𝑏 1[1] ,𝑏1[1]= 𝜎(𝑨 1[1])。
隐藏层的第二个以及后面两个神经元的计算过程一样,只是注意符号表示不同,最终分别得到
𝑏 2[1]、 𝑏3[1] 、 𝑏4[1] ,详细结果见下:在这里插入图片描述

向量化计算 如果你执行神经网络的程序,用 for 循环来做这些看起来真的很低效。所以接下来我们要做的就是把这四个等式向量化。向量化的过程是将神经网络中的一层神经元参数纵向堆积起来,例如隐藏层中的𝑥纵向堆积起来变成一个(4,3)的矩阵,用符号𝑋 [1] 表示。另一个看待这个的方法是我们有四个逻辑回归单元,且每一个逻辑回归单元都有相对应的参数——向量𝑥,把这四个向量堆积在一起,你会得出这 4×3 的矩阵。 因此, 公式 3.8: 𝑨 [𝑜] =𝑥 [𝑜] 𝑦 + 𝑐 [𝑜]
公式 3.9:
𝑏 [𝑜] = 𝜎(𝑨 [𝑜] )
详细过程见下: 公式 3.10:在这里插入图片描述

公式 3.11:在这里插入图片描述

对于神经网络的第一层,给予一个输入𝑦,得到𝑏 [1] ,𝑦可以表示为𝑏 [0] 。通过相似的衍生你会发现,后一层的表示同样可以写成类似的形式,得到𝑏 [2] ,𝑧^ = 𝑏 [2] ,具体过程见公式 3.8、3.9。在这里插入图片描述

图 3.3.3
如上图左半部分所示为神经网络,把网络左边部分盖住先忽略,那么最后的输出单元就相当于一个逻辑回归的计算单元。当你有一个包含一层隐藏层的神经网络,你需要去实现以计算得到输出的是右边的四个等式,并且可以看成是一个向量化的计算过程,计算出隐藏层的四个逻辑回归单元和整个隐藏层的输出结果,如果编程实现需要的也只是这四行代码。
总结:通过本视频,你能够根据给出的一个单独的输入特征向量,运用四行代码计算出一个简单神经网络的输出。接下来你将了解的是如何一次能够计算出不止一个样本的神经网络输出,而是能一次性计算整个训练集的输出。

4 多样本向量化(Vectorizing across multiple examples )

在上一个视频,了解到如何针对于单一的训练样本,在神经网络上计算出预测值。
在这个视频,将会了解到如何向量化多个训练样本,并计算出结果。该过程与你在逻辑回归中所做类似。
逻辑回归是将各个训练样本组合成矩阵,对矩阵的各列进行计算。神经网络是通过对逻辑回归中的等式简单的变形,让神经网络计算出输出值。这种计算是所有的训练样本同时进行的,以下是实现它具体的步骤:在这里插入图片描述

图 3.4.1
上一节视频中得到的四个等式。它们给出如何计算出𝑨 [1] ,𝑏 [1] ,𝑨 [2] ,𝑏 [2] 。
对于一个给定的输入特征向量𝑌,这四个等式可以计算出𝛽 [2] 等于𝑧^ 。这是针对于单一的
训练样本。如果有𝑛个训练样本,那么就需要重复这个过程。
用第一个训练样本𝑦 [1] 来计算出预测值𝑧^ [1] ,就是第一个训练样本上得出的结果。
然后,用𝑦 [2] 来计算出预测值𝑧^ [2] ,循环往复,直至用𝑦 [𝑛] 计算出𝑧 ^ [𝑛] 。
用激活函数表示法,如上图左下所示,它写成𝑏 2 、𝑏 2 和𝑏 2
【注】:𝑏 2 ,(𝑗)是指第𝑗个训练样本而[2]是指第二层。
如果有一个非向量化形式的实现,而且要计算出它的预测值,对于所有训练样本,需要
让𝑗从 1 到𝑛实现这四个等式:
𝑨 1 = 𝑋 1 𝑦 (𝑗) + 𝑐 1
𝑏 1 = 𝜎(𝑨 1 )
𝑨 2 = 𝑋 2 𝑏 1 + 𝑐 2
𝑏 2 = 𝜎(𝑨 2 )
对于上面的这个方程中的
(𝑗) ,是所有依赖于训练样本的变量,即将(𝑗)添加到𝑦,𝑨和𝑏。如果想计算𝑛个训练样本上的所有输出,就应该向量化整个计算,以简化这列。
本课程需要使用很多线性代数的内容,重要的是能够正确地实现这一点,尤其是在深度学习的错误中。实际上本课程认真地选择了运算符号,这些符号只是针对于这个课程的,并且能使这些向量化容易一些。
所以,希望通过这个细节可以更快地正确实现这些算法。接下来讲讲如何向量化这些:
公式 3.12:在这里插入图片描述

公式 3.13:在这里插入图片描述

公式 3.14:在这里插入图片描述

公式 3.15:在这里插入图片描述
前一张幻灯片中的 for 循环是来遍历所有个训练样本。 定义矩阵𝑌等于训练样本,将它们组合成矩阵的各列,形成一个𝑜维或𝑜乘以𝑛维矩阵。接下来计算见公式 3.15:
以此类推,从小写的向量𝑦到这个大写的矩阵𝑌,只是通过组合𝑦向量在矩阵的各列中。
同理,𝑨 1 ,𝑨 1 等等都是𝑨 1 的列向量,将所有𝑛都组合在各列中,就的到矩阵𝑎 [1] 。
同理,𝑏 1 ,𝑏 1 ,……,𝑏 1 将其组合在矩阵各列中,如同从向量𝑦到矩阵𝑌,以及从向量𝑨到矩阵𝑎一样,就能得到矩阵𝐵 [1] 。
同样的,对于𝑎 [2] 和𝐵 [2] ,也是这样得到。
这种符号其中一个作用就是,可以通过训练样本来进行索引。这就是水平索引对应于不同的训练样本的原因,这些训练样本是从左到右扫描训练集而得到的。
在垂直方向,这个垂直索引对应于神经网络中的不同节点。例如,这个节点,该值位于矩阵的最左上角对应于激活单元,它是位于第一个训练样本上的第一个隐藏单元。它的下一个值对应于第二个隐藏单元的激活值。它是位于第一个训练样本上的,以及第一个训练示例中第三个隐藏单元,等等。
当垂直扫描,是索引到隐藏单位的数字。当水平扫描,将从第一个训练示例中从第一个隐藏的单元到第二个训练样本,第三个训练样本……直到节点对应于第一个隐藏单元的激活值,且这个隐藏单元是位于这𝑛个训练样本中的最终训练样本。
从水平上看,矩阵𝐵代表了各个训练样本。从竖直上看,矩阵𝐵的不同的索引对应于不同的隐藏单元。
对于矩阵𝑎 , 𝑌情况也类似,水平方向上,对应于不同的训练样本;竖直方向上,对应不同的输入特征,而这就是神经网络输入层中各个节点。
神经网络上通过在多样本情况下的向量化来使用这些等式。
在下一个视频中,将证明为什么这是一种正确向量化的实现。这种证明将会与逻辑回归中的证明类似。

5 向 量 化 实 现 的 解 释 ( Justification for vectorizedimplementation )

在上一个视频中,我们学习到如何将多个训练样本横向堆叠成一个矩阵𝑌,然后就可以推导出神经网络中前向传播(forward propagation)部分的向量化实现。
在这个视频中,我们将会继续了解到,为什么上一节中写下的公式就是将多个样本向量化的正确实现。
我们先手动对几个样本计算一下前向传播,看看有什么规律:
公式 3.16: 𝑨 1 = 𝑋 [1] 𝑦 (1) + 𝑐 [1]
𝑨 1 = 𝑋 [1] 𝑦 (2) + 𝑐 [1]
𝑨 1 = 𝑋 [1] 𝑦 (3) + 𝑐 [1]
这里,为了描述的简便,我们先忽略掉 𝑐 [1] 后面你将会看到利用 Python 的广播机制,可以很容易的将𝑐 [1] 加进来。
现在 𝑋 [1] 是一个矩阵,𝑦 (1) ,𝑦 (2) ,𝑦 (3) 都是列向量,矩阵乘以列向量得到列向量,下面将它们用图形直观的表示出来: 公式 3.17:在这里插入图片描述

视频中,吴恩达老师很细心的用不同的颜色表示不同的样本向量,及其对应的输出。所以从图中可以看出,当加入更多样本时,只需向矩阵𝑌中加入更多列。
所以从这里我们也可以了解到,为什么之前我们对单个样本的计算要写成 𝑨 1 =𝑋 [1] 𝑦 (𝑗) + 𝑐 [1] 这种形式,因为当有不同的训练样本时,将它们堆到矩阵𝑌的各列中,那么它们的输出也就会相应的堆叠到矩阵 𝑎 [1] 的各列中。现在我们就可以直接计算矩阵 𝑎 [1]加上𝑐 [1] ,因为列向量 𝑐 [1] 和矩阵 𝑎 [1] 的列向量有着相同的尺寸,而 Python 的广播机制对于这种矩阵与向量直接相加的处理方式是,将向量与矩阵的每一列相加。 所以这一节只是说明了为什么公式 𝑎 [1] = 𝑋 [1] 𝑌 + 𝑐 [1] 是前向传播的第一步计算的正确向量化实现,但事实证明,类似的分析可以发现,前向传播的其它步也可以使用非常相似的逻辑,即如果将输入按列向量横向堆叠进矩阵,那么通过公式计算之后,也能得到成列堆叠的输出。
最后,对这一段视频的内容做一个总结:
由公式 3.12、公式 3.13、公式 3.14、公式 3.15 可以看出,使用向量化的方法,可以不需要显示循环,而直接通过矩阵运算从𝑌就可以计算出 𝐵 [1] ,实际上𝑌可以记为 𝐵 [0] ,使用同样的方法就可以由神经网络中的每一层的输入 𝐵 [𝑗−1] 计算输出 𝐵 [𝑗] 。其实这些方程有一定对称性,其中第一个方程也可以写成𝑎 [1] = 𝑋 [1] 𝐵 [0] + 𝑐 [1] ,你看这对方程,还有这对方程形式其实很类似,只不过这里所有指标加了 1。所以这样就显示出神经网络的不同层次,你知道大概每一步做的都是一样的,或者只不过同样的计算不断重复而已。这里我们有一个双层神经网络,我们在下周视频里会讲深得多的神经网络,你看到随着网络的深度变大,基本上也还是重复这两步运算,只不过是比这里你看到的重复次数更多。在下周的视频中将会讲解更深层次的神经网络,随着层数的加深,基本上也还是重复同样的运算。
以上就是对神经网络向量化实现的正确性的解释,到目前为止,我们仅使用 sigmoid 函数作为激活函数,事实上这并非最好的选择,在下一个视频中,将会继续深入的讲解如何使用更多不同种类的激活函数。

6 激活函数(Activation functions )

使用一个神经网络时,需要决定使用哪种激活函数用隐藏层上,哪种用在输出节点上。
到目前为止,之前的视频只用过 sigmoid 激活函数,但是,有时其他的激活函数效果会更好。
在神经网路的前向传播中, 𝑏 [1] = 𝜎(𝑨 [1] )和𝑏 [2] = 𝜎(𝑨 [2] )这两步会使用到sigmoid函数。
sigmoid 函数在这里被称为激活函数。
公式 3.18: 在这里插入图片描述
更通常的情况下,使用不同的函数𝑕(𝑨 [1] ),𝑕可以是除了 sigmoid 函数意外的非线性函数。tanh 函数或者双曲正切函数是总体上都优于 sigmoid 函数的激活函数。
如图,𝑏 = 𝑢𝑏𝑜(𝑨)的值域是位于+1 和-1 之间。
公式 3.19: 在这里插入图片描述

事实上,tanh 函数是 sigmoid 的向下平移和伸缩后的结果。对它进行了变形后,穿过了(0,0)点,并且值域介于+1 和-1 之间。
结果表明,如果在隐藏层上使用函数
公式 3.20: 𝑕(𝑨 [1] ) = 𝑢𝑏𝑜ℎ(𝑨 [1] ) 效果总是优于 sigmoid 函数。因为函数值域在-1 和+1的激活函数,其均值是更接近零均值的。在训练一个算法模型时,如果使用 tanh 函数代替sigmoid 函数中心化数据,使得数据的平均值更接近 0 而不是 0.5.
这会使下一层学习简单一点,在第二门课中会详细讲解。
在讨论优化算法时,有一点要说明:我基本已经不用 sigmoid 激活函数了,tanh 函数在所有场合都优于 sigmoid 函数。
但有一个例外:在二分类的问题中,对于输出层,因为𝑧的值是 0 或 1,所以想让𝑧^ 的数值介于 0 和 1 之间,而不是在-1 和+1 之间。所以需要使用 sigmoid 激活函数。
这里的公式 3.21:
在这里插入图片描述

在这个例子里看到的是,对隐藏层使用 tanh 激活函数,输出层使用 sigmoid 函数。
所以,在不同的神经网络层中,激活函数可以不同。为了表示不同的激活函数,在不同的层中,使用方括号上标来指出𝑕上标为[1]的激活函数,可能会跟𝑕上标为[2]不同。方括号上标[1]代表隐藏层,方括号上标[2]表示输出层。
sigmoid 函数和 tanh 函数两者共同的缺点是,在𝑨特别大或者特别小的情况下,导数的梯度或者函数的斜率会变得特别小,最后就会接近于 0,导致降低梯度下降的速度。
在机器学习另一个很流行的函数是:修正线性单元的函数(ReLu),ReLu 函数图像是如下图。 公式 3.22: 𝑏 = 𝑛𝑏𝑦(0,𝑨) 所以,只要𝑨是正值的情况下,导数恒等于 1,当𝑨是负值的时候,导数恒等于 0。从实际上来说,当使用𝑨的导数时,𝑨=0 的导数是没有定义的。但是当编程实现的时候,𝑨的取值刚好等于 0.00000001,这个值相当小,所以,在实践中,不需要担心这个值,𝑨是等于 0 的时候,假设一个导数是 1 或者 0 效果都可以。
这有一些选择激活函数的经验法则:
如果输出是 0、1 值(二分类问题),则输出层选择 sigmoid 函数,然后其它的所有单元都选择 Relu 函数。
这是很多激活函数的默认选择,如果在隐藏层上不确定使用哪个激活函数,那么通常会使用 Relu 激活函数。有时,也会使用 tanh 激活函数,但 Relu 的一个优点是:当𝑨是负值的时候,导数等于 0。
这里也有另一个版本的 Relu 被称为 Leaky Relu。
当𝑨是负值时,这个函数的值不是等于 0,而是轻微的倾斜,如图。
在这里插入图片描述

这个函数通常比 Relu 激活函数效果要好,尽管在实际中 Leaky ReLu 使用的并不多。
图 3.6.1
两者的优点是:
第一,在𝑨的区间变动很大的情况下,激活函数的导数或者激活函数的斜率都会远大于0,在程序实现就是一个 if-else 语句,而 sigmoid 函数需要进行浮点四则运算,在实践中,使用 ReLu 激活函数神经网络通常会比使用 sigmoid 或者 tanh 激活函数学习的更快。
第二,sigmoid 和 tanh 函数的导数在正负饱和区的梯度都会接近于 0,这会造成梯度弥散,而 Relu 和 Leaky ReLu 函数大于 0 部分都为常数,不会产生梯度弥散现象。(同时应该注意到的是,Relu 进入负半区的时候,梯度为 0,神经元此时不会训练,产生所谓的稀疏性,而 Leaky ReLu 不会有这问题)𝑨在 ReLu 的梯度一半都是 0,但是,有足够的隐藏层使得 z 值大于 0,所以对大多数的
训练数据来说学习过程仍然可以很快。
快速概括一下不同激活函数的过程和结论。
sigmoid 激活函数:除了输出层是一个二分类问题基本不会用它。
tanh 激活函数:tanh 是非常优秀的,几乎适合所有场合。
ReLu 激活函数:最常用的默认函数,,如果不确定用哪个激活函数,就使用 ReLu 或者Leaky ReLu。
公式 3.23: 𝑏 = 𝑛𝑏𝑦(0.01𝑨,𝑨)
为什么常数是 0.01?当然,可以为学习算法选择不同的参数。
在选择自己神经网络的激活函数时,有一定的直观感受,在深度学习中的经常遇到一个问题:在编写神经网络的时候,会有很多选择:隐藏层单元的个数、激活函数的选择、初始化权值……这些选择想得到一个对比较好的指导原则是挺困难的。
鉴于以上三个原因,以及在工业界的见闻,提供一种直观的感受,哪一种工业界用的多,哪一种用的少。但是,自己的神经网络的应用,以及其特殊性,是很难提前知道选择哪些效果更好。所以通常的建议是:如果不确定哪一个激活函数效果更好,可以把它们都试试,然后在验证集或者发展集上进行评价。然后看哪一种表现的更好,就去使用它。
为自己的神经网络的应用测试这些不同的选择,会在以后检验自己的神经网络或者评估算法的时候,看到不同的效果。如果仅仅遵守使用默认的 ReLu 激活函数,而不要用其他的激励函数,那就可能在近期或者往后,每次解决问题的时候都使用相同的办法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值