深度学习笔记(4) 浅层神经网络


1. 神经网络概述

神经网络看起来是如下:
在这里插入图片描述
有输入特征x1、x2、x3,它们被竖直地堆叠起来,包含了神经网络的输入,这叫做神经网络的输入层
然后这里有另外一层,他的数据无法在训练集中看到,称之为隐藏层
最后一层只由一个结点构成,它负责产生预测值,而这个只有一个结点的层被称为输出层

在这里插入图片描述每个神经元的计算与逻辑回归一样分为两步
小圆圈神经元代表了计算的两个步骤:
第一步,计算 z1[1] , z1[1] =w1[1]T x+b1[1]
第二步,通过激活函数计算a1[1], a1[1]=σ(z1[1])
隐藏层的第二个以及后面两个神经元的计算过程一样

最终分别得到 a2[1] 、a3[1] 、a4[1],结果见下:
在这里插入图片描述
把等式向量化:
在这里插入图片描述


2. 激活函数

  • sigmoid 函数
    在这里插入图片描述如果没有非线性的激活函数,再多的神经网络只是计算线性函数,或者叫恒等激励函数
    在神经网路的前向传播中, a[1] =σ(z[1]) 和 a[2] =σ(z[2]) 这两步中使用的激活函数是:
    在这里插入图片描述更通常的情况下,使用不同的函数g(z[1]),g可以是除了 sigmoid 函数以外的非线性函数

  • tanh 函数
    在这里插入图片描述
    tanh 函数或者双曲正切函数是总体上都优于 sigmoid 函数的激活函数
    tanh 函数是 sigmoid 的向下平移和伸缩后的结果,穿过了(0,0)点
    并且值域介于+1和-1之间,斜率[0, 1),并且使得数据的平均值更接近0而不是0.5

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

  • ReLu 函数
    在这里插入图片描述
    这是在机器学习中另一个很流行的函数:
    修正线性单元的函数( ReLu ):a = max (0, z)
    只要z是正值的情况下,导数恒等于1,当z是负值的时候,导数恒等于0

但有一个例外:
在二分类的问题中,对于输出层,因为y的值是0或1
所以想让 y ^ \hat{y} y^ 的数值介于0和1之间,而不是在-1和+1之间
所以需要使用 sigmoid 激活函数作为最后一层
所以可以在隐藏层使用 g(z[1]) = relu(z[1]) 或者 tanh⁡(z[1]),输出层使用 g(z[2]) = σ(z[2])
如果在隐藏层上不确定使用哪个激活函数,那么通常会使用Relu激活函数

  • Leaky Relu 函数
    在这里插入图片描述
    这是另一个版本的Relu,被称为 Leaky Relu :a = max(0.01z, z)
    当z是负值时,轻微的倾斜,也不一定是0.01
    这个函数通常比Relu激活函数效果要好,尽管在实际中Leaky ReLu使用的并不多

两者的优点是:

  1. 在 z 的区间变动很大的情况下,激活函数的导数或者激活函数的斜率都会远大于0
    在程序实现就是一个if-else语句,而sigmoid函数需要进行浮点四则运算
    在实践中,使用ReLu激活函数神经网络通常会比使用sigmoid或者tanh激活函数学习的更快
  2. sigmoid和tanh函数的导数在正负饱和区的梯度都会接近于0,这会造成梯度弥散
    而Relu和Leaky ReLu函数大于0部分都为常熟,不会产生梯度弥散现象

但Relu进入负半区的时候,梯度为0,神经元此时不会训练,产生所谓的稀疏性
而Leaky ReLu不会有这问题
z 在ReLu的梯度一半都是0,但是有足够的隐藏层使得z大于0
所以对大多数的训练数据来说学习仍然可以很快

  • 总结:

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


3. 激活函数的导数

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

  • sigmoid 函数在这里插入图片描述

  • tanh 函数在这里插入图片描述

  • ReLu 函数
    在这里插入图片描述

  • Leaky ReLu 函数
    在这里插入图片描述


4. 神经网络的梯度下降

一个神经网络的成本函数,假设在做二分类任务,
那么成本函数Cost function:
在这里插入图片描述
loss functionlogistic回归完全一样
每次梯度下降都会循环:

  1. 计算预测值:在这里插入图片描述
  2. 正向传播:在这里插入图片描述
  3. 反向传播: 在这里插入图片描述
  4. 更新权重:在这里插入图片描述

5. 随机初始化

对于一个神经网络,如果把权重或者参数都初始化为 0,那么梯度下降将不会起作用

把偏置项 b 初始化为0是合理的,但是把 w 初始化为 0 就有问题了
如果按照这样初始化的话,总是会发现 a1[1] 和 a2[1] 相等,这个激活单元和这个激活单元就会一样
因为两个隐含单元计算同样的函数,反向传播计算时,这会导致 d d da1[1] d d da2[1] 也会一样
对称这些隐含单元会初始化得一样,这样输出的权值也会一模一样,W[2] 等于 0
通过推导,两次、三次、无论多少次迭代,不管训练网络多长时间,隐含单元仍然计算的是同样的函数

这个问题的解决方法就是随机初始化参数:
W[1] 设为 np.random.randn(3,4) (生成高斯分布),通常再乘上一个小的数
比如0.01,初始化为很小的随机数

b 没有这个对称的问题(叫做symmetry breaking problem)
所以可以把 b 初始化为0

如果用tanh或者sigmoid激活函数,或者说只在输出层有一个Sigmoid
如果(数值)波动太大,当计算激活值时z[1] =W[1] x+b[1]  , a[1] =σ(z[1])=g[1] (z[1])
如果W很大,z就会很大,a就会很大或者很小
因此这种情况下很可能停在 tanh / sigmoid 函数的平坦的地方这些地方梯度很小也就意味着梯度下降会很慢,因此学习也就很慢
所以,通常倾向于初始化为很小的随机数


参考:

《神经网络和深度学习》视频课程


相关推荐:

深度学习笔记(3) 向量化逻辑回归
深度学习笔记(2) 神经网络基础
深度学习笔记(1) 深度学习简介


谢谢!

氢键H-H CSDN认证博客专家 机器人软件 运动控制 深度学习
一位永远相信美好的事情即将发生,从事自动化机器人软件开发,不忘初心,牢记使命,为实现中华民族伟大复兴而奋斗的社会主义接班人。
©️2020 CSDN 皮肤主题: 我行我“速” 设计师:Amelia_0503 返回首页
实付 49.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值