吴恩达深度学习课程之第一门课 神经网络和深度学习 第三周课程笔记

本文参考黄海广主编针对吴恩达深度学习课程DeepLearning.ai 《深度学习课程 笔记 (V5.1 )》

第三周:浅层神经网络

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

学习如何实现一个神经网络。快速浏览一下如何实现逻辑回归神经网络。

神经网络:

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

只有一个隐藏层的神经网络的结构与符号表示。

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

神经网络的输出究竟是如何计算出来的,回顾下只有一个隐藏层的简单两层神经网络结构

神经网络的计算

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

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

如上图左半部分所示为神经网络,把网络左边部分盖住先忽略,那么最后的输出单元就相当于一个逻辑回归的计算单元。当你有一个包含一层隐藏层的神经网络,你需要去实现以计算得到输出的是右边的四个等式,并且可以看成是一个向量化的计算过程,计算出隐藏层的四个逻辑回归单元和整个隐藏层的输出结果,如果编程实现需要的也只是这四行代码。
总结 给出的一个单独的输入特征向量,运用四行代码计算出一个简单神经网络的输出。

接下来你将了解的是如何一次能够计算出不止一个样本的神经网络输出,而是能一次性计算整个训练集的输出。

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

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

向量化

垂直方向,这个垂直索引对应于神经网络中的不同节点。例如,这个节点,该值位于矩阵的最左上角对应于激活单元,它是位于第一个训练样本上的第一个隐藏单元。它的下一个值对应于第二个隐藏单元的激活值。它是位于第一个训练样本上的,以及第一个训练示例中第三个隐藏单元,等等。

当垂直扫描,是索引到隐藏单位的数字。当水平扫描,将从第一个训练示例中从第一个隐藏的单元到第二个训练样本,第三个训练样本……直到节点对应于第一个隐藏单元的激活值,且这个隐藏单元是位于这 m 个训练样本中的最终训练样本。

水平上看,矩阵 A 代表了各个训练样本。从竖直上看,矩阵 A 的不同的索引对应于不同的隐藏单元。

对于矩阵Z,X情况也类似,水平方向上,对应于不同的训练样本;竖直方向上,对应不同的输入特征,而这就是神经网络输入层中各个节点。

接下来将证明为什么这是一向量化的实现。这种证明将会与逻辑回归中的证明类似。

3.5 向 量 化 实 现 的 解 释 ( Justification for vectorized
implementation)

视频中,吴恩达老师很细心的用不同的颜色表示不同的样本向量,及其对应的输出。所以从
图中可以看出,当加入更多样本时,只需向矩阵𝑌中加入更多列。

z[1] =W[1]X + b [1] 

以上就是对神经网络向量化实现的正确性的解释,到目前为止,我们仅使用 sigmoid 函
数作为激活函数,事实上这并非最好的选择,在下一个视频中,将会继续深入的讲解如何使
用更多不同种类的激活函数。

3.6 激活函数(Activation functions )

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

结果表明,如果在隐藏层上使用函数 tanh函数效果总是优于sigmoid 函数因为函数值域在-1 和+1 的激活函数,其均值是更接近零均值的。在训练一个算法模型时,如果使用 tanh 函数代替 sigmoid 函数中心化数据,使得数据的平均值更接近 0而不是 0.5.

但有一个例外:在二分类的问题中,对于输出层,因为y的值是 0 或 1,所以想让y^ 的数值介于 0 和 1 之间,而不是在-1 和+1 之间。

所以需要使用 sigmoid 激活函数。对隐藏层使用 tanh 激活函数,输出层使用 sigmoid 函数。

所以,在不同的神经网络层中,激活函数可以不同。

sigmoid 函数和 tanh 函数两者共同的缺点是,在𝑨特别大或者特别小的情况下,导数的梯度或者函数的斜率会变得特别小,最后就会接近于 0,导致降低梯度下降的速度。

3.7 为什么需要非线性激活函数?(why need a nonlinear activation function? )

总而言之,不能在隐藏层用线性激活函数,可以用 ReLU 或者 tanh 或者 leaky ReLU 或者其他的非线性激活函数,唯一可以用线性激活函数的通常就是输出层;除了这种情况,会在隐层用线性函数的,除了一些特殊情况,比如与压缩有关的,那方面在这里将不深入讨论。在这之外,在隐层使用线性激活函数非常少见。因为房价都是非负数,所以我们也可以在输出层使用 ReLU 函数这样你的y^ 都大于等于 0。

3.8 激活函数的导数(Derivatives of activation functions)

计算激活函数的斜率或者导数

 3.9 神经网络的梯度下降(Gradient descent for neural networks )

3.10 (选修)直观理解反向传播(Backpropagation intuition )

主要是推导反向传播,在前面博客已经手动推导一次了,不再 重复,以下是吴恩达老师的上课PPT

3.11 随机初始化(Random+Initialization)

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

如果你把权重或者参数都初始化为 0,那么这两个隐含单元就会完全一样,因此他们完全对称,也就意味着计算同样的函数,并且肯定的是最终经过每次训练的迭代,这两个隐含单元仍然是同一个函数,令人困惑。

如果你把权重都初始化为 0,那么由于隐含单元开始计算同一个函数,所有的隐含单元就会对输出单元有同样的影响。一次迭代后同样的表达式结果仍然是相同的,即隐含单元仍是对称的。

如果你要初始化成 0,由于所有的隐含单元都是对称的,无论你运行梯度下降多久,他们一直计算同样的函数。这没有任何帮助,因为你想要两个不同的隐含单元计算不同的函数,这个问 题 的 解 决 方 法 就 是 随 机 初 始 化 参 数 。np.random.randn(2,2) (生成高斯分布),通常再乘上一个小的数,比如 0.01,这样把它初始化为很小的随机数。因为如果W很大,那么你很可能最终停在(甚至在训练刚刚开始的时候)z很大的值,这会造成 tanh/Sigmoid 激活函数饱和在龟速的学习上,如果你没有 sigmoid/tanh 激活函数在你整个的神经网络里,就不成问题。但如果你做二分类并且你的输出单元是 Sigmoid函数,那么你不会想让初始参数太大,因此这就是为什么乘上 0.01 或者其他一些小数是合理的尝试。

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Clark-dj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值