第一门课-深度学习和神经网络 第三周(重点总结)


注:图片来源于网络

第三周:浅层神经网络(Shallow neural networks)

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

逻辑回归模型和公式:
在这里插入图片描述
在这里插入图片描述
神经网络:
在这里插入图片描述
首先计算第一层网络中的各个节点相关的数Z[1],接着计算a[1]],在计算下一层网络同理;
符号Z[m]表示第m层网络中节点相关的数,这些节点的集合被称为第m层网络。这样可以保证不会和我们之前用来表示单个的训练样本的X(i)(即我们使用表示第个训练样本)混淆
计算过程:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

不同部分的名字:
在这里插入图片描述
输入层:输入特征x1,x2,x3,它们被竖直地堆叠起来
隐藏层:四个结点
输出层:只由一个结点构成,它负责产生预测值
a表示激活的意思,它意味着网络中不同层的值会传递到它们后面的层中,输入层将x传递给隐藏层,所以我们将输入层的激活值称为a[0]
下一层即隐藏层也同样会产生一些激活值,那么我将其记作a[1],所以具体地,这里的第一个单元或结点我们将其表示为a1[1],第二个结点的值我们记为a2[1]以此类推。所以这里的是一个四维的向量
如下公式,我们有四个结点或者单元,或者称为四个隐藏层单元
在这里插入图片描述
在逻辑回归中我们只有一个输出层,所以我们没有用带方括号的上标。
但是在神经网络中,我们将使用这种带上标的形式[m],来明确地指出这些值来自于哪一层
层数:当我们计算网络的层数时,输入层是不算入总层数内,所以隐藏层是第一层,输出层是第二层。这个神经网络称为一个两层的神经网络,因为我们不将输入层看作一个标准的层
在这里插入图片描述

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

逻辑回归的计算:首先按步骤计算出Z,然后以sigmoid函数为激活函数计算Z
神经网络的计算:用圆圈表示神经网络的计算单元,一个神经网络只是这样子做了好多次重复计算
在这里插入图片描述
只有一个隐藏层的两层神经网络结构的计算:
在这里插入图片描述
符号惯例:其中,x表示输入特征,a表示每个神经元的输出,W表示特征的权重,上标表示神经网络的层数(隐藏层为1),下标表示该层的第几个神经元
在这里插入图片描述
向量化:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

对于所有训练样本,需要让i从1到m实现这四个等式:

在这里插入图片描述
对于上面的这个方程中的(i),是所有依赖于训练样本的变量,即将(i)添加到x,z和a。如果想计算个训练样本上的所有输出,就应该向量化整个计算,以简化这列。
在这里插入图片描述
在这里插入图片描述
从水平上看,矩阵A代表了各个训练样本。从竖直上看,矩阵A的不同的索引对应于不同的隐藏单元。
对于矩阵Z和X情况也类似,水平方向上,对应于不同的训练样本;竖直方向上,对应不同的输入特征,而这就是神经网络输入层中各个节点。

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

在这里插入图片描述

3.6 激活函数(Activation functions)

sigmoid函数
在这里插入图片描述
tanh函数
在这里插入图片描述
ReLu函数
在这里插入图片描述
Leaky Relu函数
在这里插入图片描述
在这里插入图片描述
激活函数比较: tanh函数是sigmoid的向下平移和伸缩后的结果。对它进行了变形后,穿过了点(0,0),并且值域介于+1和-1之间。
tanh函数效果总是优于sigmoid函数:因为函数值域在-1和+1的激活函数,其均值是更接近零均值的。在训练一个算法模型时,如果使用tanh函数代替sigmoid函数中心化数据,使得数据的平均值更接近0而不是0.5,这会使下一层学习简单一点。tanh函数在所有场合都优于sigmoid函数。(除了在二分类问题)
sigmoid函数和tanh函数两者共同的缺点是:在Z特别大或者特别小的情况下,导数的梯度或者函数的斜率会变得特别小,最后就会接近于0,导致降低梯度下降的速度。
Leaky ReLu函数通常比Relu激活函数效果好,尽管在实际中Leaky ReLu使用的并不多。
在Z的区间变动很大的情况下,激活函数的导数或者激活函数的斜率都会远大于0,使用ReLu激活函数神经网络通常会比使用sigmoid或者tanh激活函数学习的更快
sigmoid和tanh函数的导数在正负饱和区的梯度都会接近于0,这会造成梯度弥散,而Relu和Leaky ReLu函数大于0部分都为常数,不会产生梯度弥散现象。
Relu进入负半区的时候,梯度为0,神经元此时不会训练,产生所谓的稀疏性,而Leaky ReLu不会有这问题。
Z在ReLu的梯度一半都是0,但是,有足够的隐藏层使得z值大于0,所以对大多数的训练数据来说学习过程仍然可以很快。

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

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

如果你是用线性激活函数或者叫恒等激励函数,那么神经网络只是把输入线性组合再输出。
如果你使用线性激活函数或者没有使用一个激活函数,那么无论你的神经网络有多少层一直在做的只是计算线性函数,所以不如直接去掉全部隐藏层。
在这里线性隐藏层一点用也没有,因为这两个线性函数的组合本身就是线性函数,所以除非你引入非线性,否则你无法计算更有趣的函数,即使你的网络层数再多也不行。
总而言之,不能在隐藏层用线性激活函数,可以用ReLU或者tanh或者leaky ReLU或者其他的非线性激活函数,唯一可以用线性激活函数的通常就是输出层。
会在隐层用线性函数的,除了一些特殊情况,比如与压缩有关的,那方面在这里将不深入讨论。在这之外,在隐层使用线性激活函数非常少见。

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

在这里插入图片描述
注:通常在Z=0的时候给定其导数1,当然Z=0的情况很少

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

在这里插入图片描述
在这里插入图片描述
axis=1表示水平相加求和,keepdims是防止python输出那些古怪的秩数
计算反向传播dZ时,逐个元素求导

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

3.11 随机初始化(Random+Initialization)

当你训练神经网络时,权重随机初始化是很重要的。
对于逻辑回归,把权重初始化为0当然也是可以的。
对于一个神经网络,如果你把权重或者参数都初始化为0,那么梯度下降将不会起作用。如果你把权重都初始化为0,那么由于隐含单元开始计算同一个函数,所有的隐含单元就会对输出单元有同样的影响。一次迭代后同样的表达式结果仍然是相同的,即隐含单元仍是对称的。通过推导,两次、三次、无论多少次迭代,不管你训练网络多长时间,隐含单元仍然计算的是同样的函数。因此这种情况下超过1个隐含单元也没什么意义,因为他们计算同样的东西。
如果你要初始化成0,由于所有的隐含单元都是对称的,无论你运行梯度下降多久,他们一直计算同样的函数。

这个问题的解决方法就是随机初始化参数
在这里插入图片描述
乘0.01的作用:如果W很大,Z就会很大或者很小,因此这种情况下你很可能停在tanh/sigmoid函数的平坦的地方,这些地方梯度很小也就意味着梯度下降会很慢,因此学习也就很慢

发布了1 篇原创文章 · 获赞 0 · 访问量 293

猜你喜欢

转载自blog.csdn.net/qq_35024702/article/details/104864280