吴恩达深度学习第一门课第三周—浅层神经网络学习笔记

一.神经网络概述

    上周学习了图3.1.1这个模型如何与公式3.1建立联系:

    

    这一周主要学习的是含有一个隐藏层的神经网络 ,它的样子如下图:

 图中从左到右分别为 输入层,隐藏层,输出层。在上一周学习的逻辑回归中,通过直接计算𝑧得
到结果𝑎。而这个神经网络中,需要重复计算两次𝑧和𝑎,(每一个圆圈都代表了两步运算,分别为计算z和𝑎),最后得到了最终的输出。同样在逻辑回归中学习了从后向前的计算用来计算导数𝑑𝑎、𝑑𝑧,在神经网络中也有从后向前的计算,看起来就像这样,最后会计算𝑑𝑎[2] 、𝑑𝑧[2],计算出来之后,然后计算计算𝑑𝑊[2]、𝑑𝑏[2] 等。这个视频主要是大概了解一下什么是神经网络,下一个视频将学习神经网络的表示。

二.神经网络的表示

上一个视频学习了神经网络的样子,这节课将会学到神经网络怎么表示:

     先来解释一下隐藏层的含义:在一个神经网络中,当你使用监督学习训练它的时候,训练集包含了输入𝑥也包含了目标输出𝑦,所以术语隐藏层的含义是在训练集中,这些中间结点的准确值我们是不知道到的,也就是说你看不见它们在训练集中应具有的值。你能看见输入的值,你也能看见输出的值,但是隐藏层中的东西,在训练集中你是无法看到的。

   现在来看表示符号:记号𝑎[0]可以用来表示输入特征。𝑎表示激活的意思,它意味着网络中不同层的值会传递到它们后面的层中,输入层将𝑥传递给隐藏层,所以我们将输入层的激活值称为𝑎[0];下一层即隐藏层也同样会产生一些激活值,那么我将其记作𝑎[1],所以具体地,这里的第一个单元
或结点我们将其表示为𝑎1[1],第二个结点的值我们记为𝑎2[1]。以此类推。所以这里的是一个四
维的向量如果写成 Python 代码,那么它是一个规模为 4x1 的矩阵或一个大小为 4 的列向量,
如下公式,它是四维的,因为在本例中,我们有四个结点或者单元,或者称为四个隐藏层单元。 

 在神经网络中,我们将使用这种带上标的形式来明确地指出这些值来自于哪一层,有趣的是在约定俗成的符号传统中,在这里你所看到的这个例子,只能叫做一个两层的神经网络(图 3.2.2)。原因是当我们计算网络的层数时,输入层是不算入总层数内,所以隐藏层是第一层,输出层是第二层。第二个惯例是我们将输入层称为第零层,所以在技术上,这仍然是一个三层的神经网络,因为这里有输入层、隐藏层,还有输出层。但是在传统的符号使用中,如果你阅读研究论文或者在这门课中,你会看到人们将这个神经网络称为一个两层的神经网络,因为我们不将输入层看作一个标准
的层。

对于隐藏层和输出层的参数,类似的用𝑊[1],𝑏[1],𝑊[2]以及𝑏[2]表示。

三.计算一个神经网络的输出

在上一节的视频中,学习了只有一个隐藏层的神经网络的结构与符号表示。在这节课中会了解神经网络的输出究竟是如何计算出来的:

关于神经网络是怎么计算的,从之前提及的逻辑回归开始,如下图所示。用圆圈
表示神经网络的计算单元,逻辑回归的计算有两个步骤,首先按步骤计算出𝑧,然后在第
二步中以 sigmoid 函数为激活函数计算𝑧(得出𝑎),一个神经网络只是这样子做了好多次
重复计算。

 回到两层神经网络(下图中公式是向量化后的结果):

 

通过本节课,学会了根据给出的一个单独的输入特征向量,运用四行代码计算
出一个简单神经网络的输出。接下来将学习如何一次计算出不止一个样本的神
经网络输出,而是能一次性计算整个训练集的输出。

四.多样本向量化

在上一个视频,了解到如何针对于单一的训练样本,在神经网络上计算出预测值。
在这个视频,将会了解到如何向量化多个训练样本,并计算出结果。该过程与在逻
辑回归中所做类似。

上一节视频中得到的四个等式。它们给出如何计算出𝑧[1],𝑎[1],𝑧[2],𝑎[2]。
对于一个给定的输入特征向量𝑋,这四个等式可以计算出𝛼[2]等于𝑦^。这是针对于单一
的训练样本。如果有𝑚个训练样本,那么就需要重复这个过程。
用第一个训练样本𝑥[1]来计算出预测值𝑦^[1],就是第一个训练样本上得出的结果。
然后,用𝑥[2]来计算出预测值𝑦^[2],循环往复,直至用𝑥[𝑚]计算出𝑦^[𝑚]。
用激活函数表示法,如上图左下所示,它写成𝑎[2](1)、𝑎[2](2)和𝑎[2](𝑚)。
【注】:𝑎[2](𝑖),(𝑖)是指第𝑖个训练样本而[2]是指第二层。

向量化计算公式:

垂直方向代表的是不同的隐藏单元,水平方向代表不同的训练样本。

五.激活函数

使用一个神经网络时,需要决定使用哪种激活函数用隐藏层上,哪种用在输出节点上。
到目前为止,之前的视频只用过 sigmoid 激活函数,但是,有时其他的激活函数效果会更
好。

 这有一些选择激活函数的经验法则:
sigmoid 激活函数:除了输出层是一个二分类问题基本不会用它。
tanh 激活函数:tanh 是非常优秀的,几乎适合所有场合
ReLu 激活函数:最常用的默认函数,,如果不确定用哪个激活函数,就使用 ReLu 或者
Leaky ReLu。

ReLu和Leaky ReLu优点:

   第一,在𝑧的区间变动很大的情况下,激活函数的导数或者激活函数的斜率都会远大于
0
,在程序实现就是一个 if-else 语句,而 sigmoid 函数需要进行浮点四则运算,在实践中,
使用 ReLu 激活函数神经网络通常会比使用 sigmoid 或者 tanh 激活函数学习的更快

   第二,sigmoid 和 tanh 函数的导数在正负饱和区的梯度都会接近于 0,这会造成梯度
弥散,而 Relu 和 Leaky ReLu 函数大于 0 部分都为常数,不会产生梯度弥散现象。(同时应
该注意到的是,Relu 进入负半区的时候,梯度为 0,神经元此时不会训练,产生所谓的稀
疏性,而 Leaky ReLu 不会有这问题)

最后强调:自己的神经网络的应用,以及其特殊性,是很难提前知道选择
哪些效果更好。所以通常的建议是:如果不确定哪一个激活函数效果更好,可以把它们都
试试,然后在验证集或者发展集上进行评价。然后看哪一种表现的更好,就去使用它。

六.为什么需要非线性激活函数? 

证明如下:

这是神经网络正向传播的方程,现在我们去掉函数𝑔,然后令𝑎[1] = 𝑧[1],或者我们也
可以令𝑔(𝑧) = 𝑧,这个有时被叫做线性激活函数(更学术点的名字是恒等激励函数,因为
它们就是把输入值输出)。为了说明问题我们把𝑎[2] = 𝑧[2],那么这个模型的输出𝑦或仅仅只
是输入特征𝑥的线性组合。

 在这里线性隐层一点用也没有,因为这两个线性函数的组合本身就是线性函数,所以
除非引入非线性,否则无法计算更有趣的函数,即使网络层数再多也不行;只有一个地方可以使用线性激活函数------𝑔(𝑧) = 𝑧,就是你在做机器学习中的回归问题。𝑦 是一个实数,举个例子,比如你想预测房地产价格,𝑦 就不是二分类任务 0 或 1,而是一个实数,从 0 到正无穷。如果𝑦 是个实数,那么在输出层用线性激活函数也许可行,你的输出也是一个实数,从负无穷到正无穷。

   总而言之,不能在隐藏层用线性激活函数,可以用 ReLU 或者 tanh 或者 leaky ReLU 或
者其他的非线性激活函数,唯一可以用线性激活函数的通常就是输出层。

 七.激活函数的导数

在神经网络中使用反向传播的时候,你真的需要计算激活函数的斜率或者导数。针对
以下四种激活,求其导数如下:

 

八.神经网络的梯度下降 

训练参数需要做梯度下降,在训练神经网络的时候,随机初始化参数很重要,而不是
初始化成全零。当你参数初始化成某些值后,每次梯度下降都会循环计算以下预测值:

九.随机初始化 

当训练神经网络时,权重随机初始化是很重要的。对于逻辑回归,把权重初始化为
0 当然也是可以的。但是对于一个神经网络,如果把权重或者参数都初始化为 0,那么梯
度下降将不会起作用。

 如果要初始化成 0,由于所有的隐含单元都是对称的,无论运行梯度下降多久,
他们一直计算同样的函数。这没有任何帮助,因为你想要两个不同的隐含单元计算不同的
函 数 , 这 个 问 题 的 解 决 方 法 就 是 随 机 初 始 化 参 数 。  应 该 这 么 做 : 把 𝑊[1] 设 为
np.random.randn(2,2)(生成高斯分布),通常再乘上一个小的数,比如 0.01,这样把它
初始化为很小的随机数。然后𝑏没有这个对称的问题(叫做 symmetry breaking problem),
所以可以把 𝑏 初始化为 0,因为只要随机初始化𝑊就有不同的隐含单元计算不同的东西,
因此不会有 symmetry breaking 问题了。相似的,对于𝑊[2]可以随机初始化,𝑏[2]可以初
始化为 0。

 

 你也许会疑惑,这个常数从哪里来,为什么是 0.01,而不是 100 或者 1000。我们通常
倾向于初始化为很小的随机数。因为如果你用 tanh 或者 sigmoid 激活函数,或者说只在输
出 层 有 一 个 Sigmoid , 如 果 ( 数 值 ) 波 动 太 大 , 当 你 计 算 激 活 值 时 𝑧[1] = 𝑊[1]𝑥 +
𝑏[1] , 𝑎[1] = 𝜎(𝑧[1]) = 𝑔[1](𝑧[1])如果𝑊很大,𝑧就会很大。𝑧的一些值𝑎就会很大或者很小,
因此这种情况下你很可能停在 tanh/sigmoid 函数的平坦的地方(见图 3.8.2),这些地方梯度
很小也就意味着梯度下降会很慢,因此学习也就很慢。

事实上有时有比 0.01 更好的常数,当你训练一个只有一层隐藏层的网络时(这是相对
浅的神经网络,没有太多的隐藏层),设为 0.01 可能也可以。但当你训练一个非常非常深
的神经网络,你可能会选择一个不同于的常数而不是 0.01。下一节课我们会讨论怎么并且
何时去选择一个不同于 0.01 的常数,但是无论如何它通常都会是个相对小的数。

  • 30
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值