吴恩达【深度学习】笔记02——浅层神经网络(Shallow neural networks)

文章目录

      • 一、神经网络表示
      • 二、计算神经网络的输出
      • 三、激活函数(Activation functions)
        • 1. sigmoid函数
        • 2. tanh函数
        • 3. ReLu函数(修正线性单元)
        • 4. Leaky ReLu函数
        • 5. 激活函数总结
        • 6. Why need a nonlinear activation function?
      • 四、神经网络的梯度下降法
        • 1. 正向传播
        • 2. 反向传播
      • 五、随机初始化

一、神经网络表示

竖向堆叠起来的输入特征被称作神经网络的输入层(the input layer)。
神经网络的隐藏层(a hidden layer)。“隐藏”的含义是在训练集中,这些中间节点的真正数值是无法看到的。
输出层(the output layer)负责输出预测值。
吴恩达【深度学习】笔记02——浅层神经网络(Shallow neural networks)_第1张图片
如图是一个双层神经网络,也称作单隐层神经网络(a single hidden layer neural network)。当我们计算网络的层数时,通常不考虑输入层,因此图中隐藏层是第一层,输出层是第二层。

约定俗称的符号表示:
吴恩达【深度学习】笔记02——浅层神经网络(Shallow neural networks)_第2张图片

二、计算神经网络的输出

吴恩达【深度学习】笔记02——浅层神经网络(Shallow neural networks)_第3张图片
其中, x x x表示输入特征, a a a表示每个神经元的输出, W W W表示特征的权重。上标表示神经网络的层数(隐藏层为1),下标表示该层的第几个神经元。

实际上,神经网络只不过是将Logistic 回归的计算步骤重复很多次。对于隐藏层的第一个节点,有
在这里插入图片描述
隐藏层的第二个神经元以及后面的神经元计算过程一样,只是符号表示不同,最终得到a。详细过程如下:
吴恩达【深度学习】笔记02——浅层神经网络(Shallow neural networks)_第4张图片
如果你执行神经网络的程序,用for循环来做这些看起来真的很低效。所以,我们可以将四个等式向量化。向量化的过程是将神经网络中的一层神经元参数纵向堆积起来,例如隐藏层中的 W W W纵向堆积起来变成一个维度(4,3)的矩阵,用符号 W [1] 表示。

类推可得,对于第一个隐藏层有下列公式:
在这里插入图片描述
展开来看,如下图所示:
吴恩达【深度学习】笔记02——浅层神经网络(Shallow neural networks)_第5张图片
同理,对于输出层有:
在这里插入图片描述
在这里,需要特别注意的是层与层之间参数矩阵的维度。
吴恩达【深度学习】笔记02——浅层神经网络(Shallow neural networks)_第6张图片
多样本向量化

逻辑回归是将各个训练样本组合成矩阵,对矩阵的各列进行计算。神经网络是通过对逻辑回归中的等式简单的变形,让神经网络计算出输出值。这种计算式所有的训练样本同时进行的。

对于 m 个训练样本,在书写标记上用 (i) 表示第 i 个样本。对于每个样本 i ,可以使用for循环来求解其正向输出:
吴恩达【深度学习】笔记02——浅层神经网络(Shallow neural networks)_第7张图片
若不用for循环,而是利用矩阵运算的思想:
吴恩达【深度学习】笔记02——浅层神经网络(Shallow neural networks)_第8张图片
其中,行表示神经元个数n,列表示样本数目m。
吴恩达【深度学习】笔记02——浅层神经网络(Shallow neural networks)_第9张图片
吴恩达【深度学习】笔记02——浅层神经网络(Shallow neural networks)_第10张图片
从水平上看,矩阵A代表了各个训练样本。从竖直上看,矩阵A的不同索引对应于不同的隐藏层单元。
吴恩达【深度学习】笔记02——浅层神经网络(Shallow neural networks)_第11张图片

三、激活函数(Activation functions)

使用一个神经网络时,需要决定使用哪种激活函数用在隐藏层上,哪种用在输出层上。之前我们都是选用 sigmoid 函数,但有时其他函数的效果会好得多。

1. sigmoid函数

吴恩达【深度学习】笔记02——浅层神经网络(Shallow neural networks)_第12张图片
其导数为:
吴恩达【深度学习】笔记02——浅层神经网络(Shallow neural networks)_第13张图片
【注意】在讨论优化算法时,一般情况下是不再使用sigmoid函数的,因为tanh在所有场合都由优于sigmoid函数。但是有一个例外,在二分类问题中,对于输出层,因为y的值是0或1,我们想让y_hat的值介于0、1之间,而不是-1和+1之间,此时用sigmoid函数会更好。

2. tanh函数

吴恩达【深度学习】笔记02——浅层神经网络(Shallow neural networks)_第14张图片
其导数为:
吴恩达【深度学习】笔记02——浅层神经网络(Shallow neural networks)_第15张图片
【补充】tanh的效果总是优于sigmoid函数。因为函数值域在-1和+1的激活函数,其均值是更接近零均值的。在训练一个算法模型时,如果使用tanh函数代替sigmoid函数中心化数据,能够使得数据的平均值更接近0而不是0.5。

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

3. ReLu函数(修正线性单元)

吴恩达【深度学习】笔记02——浅层神经网络(Shallow neural networks)_第16张图片
只要 z z z为正值,导数恒等于1。当 z z z为负值时,导数恒等于0。从实际上来说,当使用 z z z的导数时, z = 0 z=0 z=0的导数是没有定义的。但是在编程实现的时候, z z z的取值刚好等于0.0000001,这个值相当小。所以,在实践中,不需要担心这个值, z = 0 z=0 z=0时,假设导数为1或0都是可以的。

选择激活函数的经验法则:
如果输出的值是0和1(二分类问题),则输出层选择sigmoid函数,然后其他的所有单元都选择ReLu函数。
这是很多激活函数的默认选择,如果隐藏层上不确定使用哪个激活函数,那么通常会使用ReLu激活函数。有时,也会使用tanh函数,但ReLuctant的一个优点是:当 z z z是负值时。导数等于0。

4. Leaky ReLu函数

吴恩达【深度学习】笔记02——浅层神经网络(Shallow neural networks)_第17张图片
该函数当 z z z是负值时,函数的值不为0,而是轻微的倾斜。这个函数通常比ReLu激活函数效果好,尽管在实际中使用的不多。

5. 激活函数总结

  1. 在实践中,使用ReLu激活函数的神经网络通常会比使用sigmoid或者tanh激活函数学习的更快。
  2. sigmoid函数和tanh函数的导数在正负饱和区的梯度都会接近于0,这会造成梯度弥散。而ReLu和Leaky ReLu函数大于0的部分都为常数,不会产生梯度弥散现象。
  3. ReLu进入负区域时,梯度为0,神经元此时不会训练,产生所谓的稀疏性,但是Leaky ReLu不会有这个问题。

Tip:如果不确定哪一个激活函数效果更好,可以把它们都试试,然后在验证集或者发展集上进行评价。然后看哪一种表现得更好,就去使用它。

6. Why need a nonlinear activation function?

使用线性激活函数和不使用激活函数、直接使用 Logistic 回归没有区别,那么无论神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,就成了最原始的感知器了。
如果我们使用的是线性激活函数或者叫恒等激励函数,那么神经网络只是把输入线性组合再输出。
【总结】不能在隐藏层用线性激活函数,唯一可以使用线性激活函数的通常就是输出层。

四、神经网络的梯度下降法

1. 正向传播

正向传播是从输入到输出,由神经网络计算得到预测输出的过程。
吴恩达【深度学习】笔记02——浅层神经网络(Shallow neural networks)_第18张图片
正向传播的4个公式如下:
吴恩达【深度学习】笔记02——浅层神经网络(Shallow neural networks)_第19张图片

2. 反向传播

反向传播是从输出到输入,对参数w和b计算梯度的过程。
吴恩达【深度学习】笔记02——浅层神经网络(Shallow neural networks)_第20张图片
在这个例子中,反向传播就是对a、b、c三个输入求偏导:
吴恩达【深度学习】笔记02——浅层神经网络(Shallow neural networks)_第21张图片
神经网络反向梯度下降公式(左)和其代码向量化(右),见下图:
吴恩达【深度学习】笔记02——浅层神经网络(Shallow neural networks)_第22张图片
上述的步骤都是针对所有样本进行过向量化, Y Y Y 1 × m 1×m 1×m的矩阵。这里的np.sum是Python的numpy命令,axis=1表示水平相加求和,keepdims是防止python输出那些古怪的秩数 ( n , ) (n,) (n,),加上这些就可以确保矩阵向量输出的维度为 ( n , 1 ) (n,1) (n,1)这样的标准形式。

五、随机初始化

如果在初始时将两个隐藏神经元的参数设置为相同的大小,那么两个隐藏神经元对输出单元的影响也是相同的,通过反向梯度下降去进行计算的时候,会得到同样的梯度大小,所以在经过多次迭代后,两个隐藏层单位仍然是对称的。无论设置多少个隐藏单元,其最终的影响都是相同的,那么多个隐藏神经元就没有了意义。

在初始化的时候, w w w 参数 要进行随机初始化,不可以设置为 0。 b b b 因为不存在对称性的问题,可以设置为 0。

以 2 个输入,2 个隐藏神经元为例:

W = np.random.randn(2,2) * 0.01
b = np.zeros((2,1))

这里将 W W W 的值乘以 0.01(或者其他的常数值)的原因是为了使得权重 W W W 初始化为较小的值,这是因为使用 sigmoid 函数或者 tanh 函数作为激活函数时, W W W 比较小,则 z = W x + b z=Wx+b z=Wx+b 所得的值趋近于 0,梯度较大,能够提高算法的更新速度。而如果 W W W 设置的太大的话,得到的梯度较小,训练过程因此会变得很慢。

ReLU 和 Leaky ReLU 作为激活函数时不存在这种问题,因为在大于 0 的时候,梯度均为 1。

你可能感兴趣的:(DeepLearning,神经网络,深度学习)