深度学习有两个非常重要的特性——多层和非线性

  • 线性模型的局限性:只通过线性变换,任意层的全连接神经网络(Neural Network, NN)和单层NN模型的表达能力没有任何区别,而且它们都是线性模型。但是线性模型能解决的问题有限。
  • 未使用激活函数时,每一层输出都是上层输入的线性函数,无论NN有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机了。

一、激活函数

1、含义

  • 激活函数:指如何把“激活的神经元的特征”通过函数把特征保留并映射出来(保留特征,去除一些数据中是的冗余),这是NN能解决非线性问题的关键。

    • 激活函数是用来加入非线性因素的,因为线性模型的表达力不够。
    • (针对Relu的)构建稀疏矩阵(0较多),也就是稀疏性,这个特性可以去除数据中的冗余,最大可能保留数据的特征。
      • 激活函数的作用:能够给神经网络加入一些非线性因素,使得神经网络可以更好地解决较为复杂的问题。

2、性质

  • 一般激活函数有如下一些性质:
  • 非线性: 当激活函数是线性的,一个两层的神经网络就可以基本上逼近所有的函数。但如果激活函数是恒等激活函数的时候,即f(x)=x,就不满足这个性质,而且如果MLP使用的是恒等激活函数,那么其实整个网络跟单层神经网络是等价的;
  • 可微性: 当优化方法是基于梯度的时候,就体现了该性质;
  • 单调性: 当激活函数是单调的时候,单层网络能够保证是凸函数;
  • 输出值的范围: 当激活函数输出值是有限的时候,基于梯度的优化方法会更加稳定,因为特征的表示受有限权值的影响更显著;当激活函数的输出是无限的时候,模型的训练会更加高效,不过在这种情况小,一般需要更小的Learning Rate。

二、常见的非线性激活函数

  • 常见的激活函数有 sigmoid 、 tanh、 relu 和 softplus 这4种。前两个最常用。

1、sigmoid函数

公式和图形:S(x)=11+e−xS(x) = \dfrac{1}{1 + e^{-x}}


- 使用方法:tf.nn.sigmoid(features, name = None)

a = tf.constant([[1.0, 2.0], [1.0, 2.0], [1.0, 2.0]])
sess = tf.Session()
print(sess.run(tf.sigmoid(a)))
# 输出:[[ 0.7310586  0.88079703]
#             [ 0.7310586  0.88079703]
#             [ 0.7310586  0.88079703]]
  • sigmoid函数的优缺点:

    • 优点:它的输出映射在(0, 1)内,单调连续,非常适合用作输出层,井且求导比较容易。
    • 缺点:由于其软饱和性,一旦输入落入饱和区,f′(x){f^{'}}(x)就会变得接近于0,很容易产生梯度消失。

2、tanh函数

公式和图形:S(x)=1−e−2x1+e−2xS(x) = \dfrac{1 - e^{-2x}}{1 + e^{-2x}}

  • 使用方法:tf.nn.tanh(features, name = None)
  • 特点:
    • 具有软饱和性
    • 由于其输出以0位中心,收敛速度比sigmoid要快
    • 仍无法解决梯度消失的问题

      饱和是指激活函数h(x)在取值趋于无穷大时,它的一阶导数趋于0。硬饱和是指当|x|>c时,其中c为常数,

      f′(x)=0

      f'(x)=0。relu就是一类左侧硬饱和激活函数。

梯度消失是指在更新模型参数时采用 链式求导法则反向求导,越往前梯度越小。最终的结果是到达一定深度后梯度对模型的更新就没有任何贡献了 。

3、relu函数

  • 目前最受欢迎的激活函数。softplus可以看作是 ReLU 的平滑版本。

    • relu 定义为f(x)=max(x,0)f(x)= max(x,0)。(下)
    • softplus 定义为f(x)=log(l+exp(x))f(x)=log(l + exp(x))。(上)
    • 使用方法:
    • tf.nn.relu(features, name = None)
    • tf.nn.relu6(features, name = None)
    • 如图所示:
    • relu在 x<0 时硬饱和。
    • x>0时导数为1,rule能够在x>0时保持梯度不衰减,从而缓解梯度消失问题,还能够更快地收敛,并提供了神经网络的稀疏表达能力。
    • 缺点:随着训练的进行,部分输入会落到硬饱和区,导致对应的权重无法更新,称为“神经元死亡”。
a = tf.constant([-1.0, 2.0])
with tf.Session() as sess:b = tf.nn.relu(a)print(sess.run(b))
# 输出:[ 0.  2.]

除了relu 本身外,TensorFlow 还定义了relu6,也就是定义在min(max(features, 0), 6)的tf.nn.relu6(features, name=None),以及 crelu ,即tf.nn.crelu(features, name=None)。

4、dropout函数

  • 一个神经元将以概率keep_prob决定是否被抑制。

    • 若被抑制,该神经元的输出就为0
    • 若不被抑制,该神经元的输出值将被放大到原来的 1/keep_prob 倍
  • 在默认情况下,每个神经元是否被抑制是相互独立的。但是否被抑制也可以通过 noise_shape 来调节。
    • 当 noise_shape[i] == shape(x)[i]时, x 中的元素是相互独立的。
    • 若shape(x) = [k, l, m, n],x中的维度的顺序分别为批、行、列和通道
    • 若noise_shape = [k, l, l, n],那么每个批和通道都是相互独立的,但是每行和每列的数据都是关联的(即要不都为0, 要不都还是原来的值)。
  • 使用方法:tf.nn.dropout(x, keep_prob, noise_shape = None, seed = None, name = None)
    • x: 一个Tensor。
    • keep_prob: 一个 Python 的 float 类型。是否被抑制。
    • noise_shape: 一个一维的Tensor,数据类型是int32。代表元素是否独立的标志。
    • seed: 一个Python的整数类型。设置随机种子。
    • name: (可选)为这个操作取一个名字。
a = tf.constant([[-1.0, 2.0, 3.0, 4.0]])
with tf.Session() as sess:b = tf.nn.dropout(a, 0.5, noise_shape=[1, 4])print(sess.run(b))b = tf.nn.dropout(a, 0.5, noise_shape=[1, 1])print(sess.run(b))
# 输出:[[-0.  4.  0.  0.]]
#      [[-0.  0.  0.  0.]]

5、激活函数的选择

  • 当输入数据特征相差明显时,用tanh的效果会很好,且在循环过程中会不断扩大特征效果并显示出来。
  • 当特征相差不明显时,sigmoid效果比较好。
  • 用sigmoid和 tanh作为激活函数时,需要对输入进行规范化,否则激活后的值全部都进入平坦区,隐层的输出会全部趋同,丧失原有的特征表达。而 relu 会好很多,有时可以不需要输入规范化来避免上述情况。
  • 现在大部分的卷积神经网络都采用relu 作为激活函数。估计大概有 85%~90%的神经网络会采用 ReLU, 10%~ 15%的神经网络会采用 tanh,尤其用在自然语言处理上。

6、为什么要引入 ReLU 而不是其他的非线性函数(例如 Sigmoid 函数)?

  • 采用 sigmoid 等函数,激活函数时(指数运算),计算量大,反向传播求误差梯度时,求导涉及除法,计算量相对大,而采用Relu激活函数,整个过程的计算量节省很多。
  • 对于深层网络,sigmoid 函数反向传播时,很容易就会出现梯度消失的情况(在sigmoid接近饱和区时,变换太缓慢,导数趋于0,这种情况会造成信息丢失),从而无法完成深层网络的训练。
  • Relu 会使一部分神经元的输出为 0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。

神经网络基础之激活函数相关推荐

  1. 神经网络基础知识、常用激活函数及其Python图形绘制

    在人工智能与机器学习研究与应用领域,神经网络占有重要地位.神经网络(Neural Networks, NNs),又称人工神经网络(Artificial Neural Networks, ANNs),是 ...

  2. Coursera吴恩达《神经网络与深度学习》课程笔记(2)-- 神经网络基础之逻辑回归...

    转至:https://blog.csdn.net/red_stone1/article/details/77851177 上节课我们主要对深度学习(Deep Learning)的概念做了简要的概述.我 ...

  3. 深度学习:神经网络基础知识总结

    [神经网络基础知识总结]: 定义: 人工神经网络(Artificial Neural Networks,简写为ANNs)也简称为神经网络(NNs)或称作连接模型(Connection Model),它 ...

  4. 【阿里云课程】图神经网络基础:图的应用、表示与图卷积

    大家好,继续更新有三AI与阿里天池联合推出的深度学习系列课程,本次更新内容为第9课中的一节,介绍如下: 图神经网络基础 本次课程是阿里天池联合有三AI推出的深度学习系列课程第9期,讲述图神经网络,图的 ...

  5. Coursera吴恩达《神经网络与深度学习》课程笔记(2)-- 神经网络基础之逻辑回归

    红色石头的个人网站:redstonewill.com 上节课我们主要对深度学习(Deep Learning)的概念做了简要的概述.我们先从房价预测的例子出发,建立了标准的神经网络(Neural Net ...

  6. 计算机视觉:卷积神经网络基础

    计算机视觉:卷积神经网络基础 计算机视觉概述 计算机视觉的发展历程 卷积神经网络 卷积(Convolution) 卷积计算 填充(padding) 步幅(stride) 感受野(Receptive F ...

  7. 自然语言处理之神经网络基础(四)

    1.1神经网络的基本概念 神经网络(neural network,NN),是一种模仿生物神经网络的结构和功能的数学模型或计算模型.神经网络由大量的人工神经元联结进行计算. 前馈神经网络基础 卷积神经网 ...

  8. 深度学习导论(4)神经网络基础

    深度学习导论(4)神经网络基础 一. 训练深度学习模型的步骤 二. 线性层(或叫全链接层)(Linear layer(dense or fully connected layers)) 1. 定义一个 ...

  9. 01.神经网络和深度学习 W2.神经网络基础

    文章目录 1. 二分类 2. 逻辑回归 3. 逻辑回归损失函数 4. 梯度下降 5. 导数 6. 计算图导数计算 7. 逻辑回归中的梯度下降 8. m个样本的梯度下降 9. 向量化 10. 向量化的更 ...

最新文章

  1. CVPR 2021 Oral|只用静态图像,就能实时渲染出丝滑3D效果
  2. 【转】一文掌握 Linux 性能分析之网络篇(续)
  3. POJ 2485-Highways
  4. Github 2020 年度报告:你以为新冠击溃了开发者?不!他们创造了更多代码...
  5. PostgreSQL进程结构
  6. 【java】抽象类下有两个具体子类,子类下有两个实例
  7. 大华管理平台用户名_助力制造苏州紫光云引擎携手大华精密,共建精密机加数字化样板工厂...
  8. Unity 3D下载安装教程
  9. 读取json本地js处理输出html,JavaScript 通过浏览器导出和读取本地 JSON 文件
  10. 135编辑器使用教程
  11. Android实战 - 音心音乐播放器 (开启篇)
  12. 江城子 . 程序员之歌
  13. 大话设计模式6—模板方法模式(考试抄题)
  14. 5G.gNB——eNB的变身
  15. 在拉勾网对职位的数据爬取与分析
  16. java switch语句_Java switch语句
  17. 【matplotlib】可视化解决方案——共享绘图区域问题
  18. 几道经典的SQL笔试题目(有答案)
  19. 华为服务器2288h v5安装系统,华为2288装系统
  20. 学员故事:老男孩Linux运维班学习五个月,让我实现月薪万元+

热门文章

  1. 微信企业号 苹果ios 返回页面不刷新 h5
  2. 如何在电脑/手机上将JPEG图片保存为PDF?
  3. 服务器、存储和网络设备介绍
  4. MacOs在线重装系统教程
  5. LeetCode/LintCode 题解丨一周爆刷字符串:旋转字符数组
  6. StarUML如何将背景变成空白
  7. 利用html 和css模仿必应搜索主页。(一)
  8. H5页面 禁止微信分享转发按钮
  9. 关于Boost电感的问题
  10. 怎么写安卓手机脚本_干货!最火短视频脚本 分镜头教程合集40份