首先需要知道为什么要引入激活函数:激活函数是用来加入非线性因素的,因为线性模型的表达能力不够。引入非线性激活函数,可使深层神经网络的表达能力更加强大。

在深度学习中,线性模型只需要简单的全连接层就能实现,神经网络中每一层的输入输出都是一个线性求和的过程,下一层的输出只是承接了上一层输入函数的线性变换,所以如果没有激活函数,那么无论你构造的神经网络多么复杂,有多少层,最后的输出都是输入的线性组合,纯粹的线性组合并不能够解决更为复杂的问题,哪怕有100个全连接层叠加,也只能表示出线性关系:

h ( x ) = w n T ( ⋯ ( w 2 T ( w 1 T x + b 1 ) + b 2 ) ⋯ ) + b n = w n T w n − 1 T ⋯ w 2 T w 1 T x + ( w n T w n − 1 T ⋯ w 2 T b 1 + w n T w n − 1 T ⋯ w 3 T b 2 + ⋯ + b 3 ) \begin{aligned}h(x)&=w_n^T\Bigl(\cdots\bigl(w_2^T(w_1^Tx+b_1)+b_2\bigr)\cdots\Bigr)+b_n\\&=w_n^Tw_{n-1}^T\cdots w_2^Tw_1^Tx+(w_n^Tw_{n-1}^T\cdots w_2^Tb_1+w_n^Tw_{n-1}^T\cdots w_3^Tb_2+\cdots+b_3)\end{aligned} h(x)​=wnT​(⋯(w2T​(w1T​x+b1​)+b2​)⋯)+bn​=wnT​wn−1T​⋯w2T​w1T​x+(wnT​wn−1T​⋯w2T​b1​+wnT​wn−1T​⋯w3T​b2​+⋯+b3​)​

令 W = w 1 w 2 ⋯ w n , B = w n T w n − 1 T ⋯ w 2 T b 1 + w n T w n − 1 T ⋯ w 3 T b 2 + ⋯ + b 3 W=w_1w_2\cdots w_n,B=w_n^Tw_{n-1}^T\cdots w_2^Tb_1+w_n^Tw_{n-1}^T\cdots w_3^Tb_2+\cdots+b_3 W=w1​w2​⋯wn​,B=wnT​wn−1T​⋯w2T​b1​+wnT​wn−1T​⋯w3T​b2​+⋯+b3​,

则 h ( x ) = W T x + B h(x)=W^Tx+B h(x)=WTx+B 仍是线性关系

线性模型所能拟合的变量关系十分受限,甚至连最简单的二次函数关系式 y = x 2 y=x^2 y=x2也是非线性的,无法用线性模型的叠加去拟合,因此引入非线性的激活函数用以拟合更复杂的非线性关系

激活函数需要满足如下条件:

  • 非线性:Nonlinear,激活函数非线性时,多层神经网络可逼近所有函数

  • 连续可微性:Continuously differentiable,优化器大多用梯度下降更新参数,不可微则无法求梯度

  • 单调性:Monotonic,当激活函数是单调的,能保证单层网络的损失函数是凸函数

  • 原点近似恒等性:Approximates identity near the origin,若激活函数有这一特性,神经网络在随机初始化较小的权重时学习更高效。若激活函数不具备这一特性,初始化权重时必须特别小心。

    这一点比较抽象哈,我个人的理解是,激活函数在原点附近几乎是个恒等映射,也就是说,当激活函数的输入值接近原点时,其输出值约等于输入值

    那么此时激活函数是个恒等映射有什么好处?

    首先我们需要知道,神经网络中每一层(hidden layer)的输入输出都是一个线性关系(全连接层),当参数初始化较小时,输入值经过某个hidden layer与其参数相乘,得到的输出值自然也较小,此时在经过激活函数时,很有可能直接将输出判定为0,如ReLU在原点左侧,那么反向传播时传回该hidden layer的梯度值就为0,参数就不会得到更新

    而当激活函数具有原点近似恒等性时,当参数初始化较小,相当于不存在激活函数(因为是恒等映射关系),那么该hidden layer的输出就等价于一个线性变换,此时反向传播就相当于直接对全连接层进行梯度下降,自然不存在梯度消失的情况

常见的激活函数如Sigmoid、Tanh、ReLU、Leaky ReLU、Softmax等,我们逐一认识并分析其优缺点

sigmoid

Sigmoid函数也叫Logistic函数,也就是机器学习中逻辑回归所使用的函数:

f ( x ) = Sigmoid ( x ) = 1 1 + e − x f(x)=\text{Sigmoid}(x)=\frac{1}{1+e^{-x}} f(x)=Sigmoid(x)=1+e−x1​

图像是一个S型曲线,值域为 ( 0 , 1 ) (0,1) (0,1),将一个实数映射到 ( 0 , 1 ) (0,1) (0,1)的区间,当 x = 0 x=0 x=0时 y = 1 2 y=\frac{1}{2} y=21​

  • 优点:

    1. 函数单调连续可微,这意味着可以找到任意两个点的 sigmoid 曲线的斜率
    2. 出值限定在 0 到1,因此它对每个神经元的输出进行了归一化
    3. 可用于最终输出是个概率值的模型。因为概率的取值范围也是 0 到 1,因此 Sigmoid 函数非常合适
  • 缺点:
    1. 非中心化,当 x = 0 x=0 x=0时 y = 1 2 y=\frac{1}{2} y=21​,输出恒大于0,非零中心化的输出会使得其后一层的神经元的输入发生偏置偏移(Bias Shift),并进一步使得梯度下降的收敛速度变慢
    2. 计算复杂,涉及 e x e^x ex
    3. 梯度消失(这也是很多激活函数的通病),注意看函数图像,在 x ∈ ( − 5 , 5 ) x\in(-5,5) x∈(−5,5)时,图像斜率较大,此时的梯度也相应大,但是在 x ∈ ( − ∞ , − 5 ) ∪ ( 5 , + ∞ ) x\in(-\infty,-5)\cup (5,+\infty) x∈(−∞,−5)∪(5,+∞)时,图像斜率很小,Sigmoid函数在大部分取值范围内梯度趋近于 0,神经网络使用 Sigmoid 激活函数进行反向传播时,输出接近 0 或 1 的神经元其梯度趋近于 0。这些神经元叫作饱和神经元。因此,这些神经元的权重不会更新。此外,与此类神经元相连的神经元的权重也更新得很慢。该问题叫作梯度消失。因此,想象一下,如果一个大型神经网络包含 Sigmoid 神经元,而其中很多个都处于饱和状态,那么该网络无法执行反向传播。

Tanh

也叫双曲正切函数(hyperbolic tangent activation function):

f ( x ) = tanh ( x ) = e x − e − x e x + e − x = 2 1 + e − 2 x − 1 f(x)=\text{tanh}(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}=\frac{2}{1+e^{-2x}}-1 f(x)=tanh(x)=ex+e−xex−e−x​=1+e−2x2​−1

我们可以发现tanh函数可以看作放大并平移的sigmoid函数,二者的关系是:

tanh ( x ) = 2 ⋅ sigmoid ( 2 x ) − 1 \text{tanh}(x)=2\cdot \text{sigmoid}(2x)-1 tanh(x)=2⋅sigmoid(2x)−1

与sigmoid相似,tanh图像也是一个S型曲线,但是值域为 ( − 1 , 1 ) (-1,1) (−1,1):

从图像可以清楚的看出,相比于sigmoid,tanh显然是中心化的,不会发生偏置偏移(负数输入被当作负值,零输入值的映射接近零,正数输入被当作正值)

同时,tanh图像中斜率较大的范围仍局限于 ( − 2.5 , 2.5 ) (-2.5,2.5) (−2.5,2.5),其余值处的斜率均较小,所以和sigmoid类似,Tanh 函数也会有梯度消失的问题,因此在饱和时(x很大或很小时)也会「杀死」梯度。

这里要注意,既然tanh和sigmoid如此相似,那么它们到底在功能上有什么区别呢?可以互换使用吗?

在一般的二元分类问题中,tanh 函数用于隐藏层,而 sigmoid 函数用于输出层,但这并不是固定的,需要根据特定问题进行调整。

ReLU、Leaky ReLU

ReLU是Rectified Linear Unit的缩写,意为修正线性单元,是一种分段线性函数,其弥补了sigmoid函数以及tanh函数的梯度消失问题,在目前的深度神经网络中被广泛使用:

f ( x ) = ReLU ( x ) = max ⁡ ( 0 , x ) = { x , x ≥ 0 0 , x < 0 f(x)=\text{ReLU}(x)=\max(0,x)=\begin{cases}x&,x\geq0\\0&,x<0\end{cases} f(x)=ReLU(x)=max(0,x)={x0​,x≥0,x<0​

  • ReLU 函数是深度学习中较为流行的一种激活函数,相比于 sigmoid 函数和 tanh 函数,它具有如下优点:

    1. 当输入为正时,导数为1,一定程度上改善了梯度消失问题,加速梯度下降的收敛速度
    2. 计算速度快得多。ReLU 函数中只存在线性关系,因此它的计算速度比 sigmoid 和 tanh 更快
    3. 被认为具有生物学合理性(Biological Plausibility),比如单侧抑制、宽兴奋边界(即兴奋程度可以非常高)
  • 缺点:
    1. Dead ReLU 问题。当输入为负时,ReLU 完全失效,在正向传播过程中,这不是问题。有些区域很敏感,有些则不敏感。但是在反向传播过程中,如果输入负数,则梯度将完全为零
    2. 非中心化,和 Sigmoid 激活函数类似,ReLU 函数的输出不以零为中心,ReLU 函数的输出为 0 或正数,给后一层的神经网络引入偏置偏移,会影响梯度下降的效率。

为了解决ReLU激活函数中负值的梯度消失问题,当 x < 0 x<0 x<0时,我们使用Leaky ReLU:

f ( x ) = Leaky-ReLU ( x ) = max ⁡ ( 0 , x ) + γ min ⁡ ( 0 , x ) = max ⁡ ( x , γ x ) = { x , x ≥ 0 γ x , x < 0 f(x)=\text{Leaky-ReLU}(x)=\max(0,x)+\gamma\min(0,x)=\max(x,\gamma x)=\begin{cases}x&,x\geq0\\\gamma x&,x<0\end{cases} f(x)=Leaky-ReLU(x)=max(0,x)+γmin(0,x)=max(x,γx)={xγx​,x≥0,x<0​

其中 γ \gamma γ是一个小于1的值,例如 γ = 0.1 \gamma=0.1 γ=0.1(下图),保证在 x < 0 x<0 x<0时不会出现梯度消失

为什么使用Leaky ReLU会比ReLU效果要好呢?

  1. Leaky ReLU 通过把 x 的非常小的线性分量给予负输入来调整负值的零梯度(zero gradients)问题,当 x < 0 时,它得到 0.1 倍的正梯度。该函数一定程度上缓解了 dead ReLU 问题
  2. 扩大 ReLU 函数的范围,使其值域扩大到 ( − ∞ , + ∞ ) (-\infty,+\infty) (−∞,+∞)

尽管Leaky ReLU具备 ReLU 激活函数的所有特征(如计算高效、快速收敛、在正区域内不会饱和),但并不能完全证明在实际操作中Leaky ReLU 总是比 ReLU 更好。

Softmax

Softmax是用于多分类问题的激活函数,对于一个任意的 n n n维实向量,Softmax可以将其压缩为各元素值在 [ 0 , 1 ] [0,1] [0,1]之间且和为1的 n n n维实向量:

f ( x i ) = Softmax ( x i ) = e x i ∑ j e x j f(x_i)=\text{Softmax}(x_i)=\frac{e^{x_i}}{\sum_je^{x_j}} f(xi​)=Softmax(xi​)=∑j​exj​exi​​

相当于对输出值做归一化,它的作用是对神经网络全连接层输出进行变换,使其服从概率分布,即每个值都位于 [ 0 , 1 ] [0,1] [0,1]区间且和为1

可以将它和sigmoid的作用进行联系,区别在于sigmoid用于二分类,softmax用于多分类,最终结果的呈现形式都是以概率值输出

Softmax 与正常的 max 函数不同:max 函数仅输出最大值,但 Softmax 确保较小的值具有较小的概率,并且不会直接丢弃。我们可以认为它是 argmax 函数的概率版本或「soft」版本。

Softmax 函数的分母结合了原始输出值的所有因子,这意味着 Softmax 函数输出的各种概率彼此相关。

然而,softmax激活函数在零点不可微,负输入的梯度为零,这意味着对于该区域的激活,权重不会在反向传播期间更新,因此会产生永不激活的死亡神经元。

参考:如何理解激活函数、激活函数篇

附上激活函数图像的画图代码:

import numpy as np
from matplotlib import pyplot as pltx = np.linspace(-10, 10, 500)
sigmoid = 1 / (1 + np.exp(-x))
tanh = (2 / (1 + np.exp(-2 * x))) - 1
relu = [max(0, i) for i in x]
leaky_relu = [max(0.1 * i, i) for i in x]fig = plt.figure(figsize=(17.2, 9.6), layout='tight')  # 画布ax1 = fig.add_subplot(2, 2, 1)  # 画布上添加第一行第一列的第一张子图像
ax1.plot(x, sigmoid, color='#9AC8E2')
ax1.axvline(0, color='k', linestyle='--')  # 画出x=0这条垂直线(虚线)
ax1.axhline(0.5, color='k', linestyle='--')  # 画出y=0.5这条水平线(虚线)
ax1.set_title('Sigmoid')ax2 = fig.add_subplot(2, 2, 2)
ax2.plot(x, tanh, color='#9AC8E2')
ax2.axvline(0, color='k', linestyle='--')
ax2.axhline(0, color='k', linestyle='--')
ax2.set_title('Tanh')ax3 = fig.add_subplot(2, 2, 3)
ax3.plot(x, relu, color='#9AC8E2')
ax3.axvline(0, color='k', linestyle='--')
ax3.axhline(0, color='k', linestyle='--')
ax3.set_title('ReLU')ax4 = fig.add_subplot(2, 2, 4)
ax4.plot(x, leaky_relu, color='#9AC8E2')
ax4.axvline(0, color='k', linestyle='--')
ax4.axhline(0, color='k', linestyle='--')
ax4.set_title('Leaky ReLU')# 单独保存各个子图
for idx, ax in enumerate([ax1, ax2, ax3, ax4]):extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())fig.savefig(f'fig{idx+1}.png', bbox_inches=extent.expanded(1.2, 1.25))plt.show()

【深度学习】激活函数:原理+常见激活函数(Sigmoid\Tanh\ReLU\Leaky ReLU\Softmax)相关推荐

  1. 深度学习中的sigmod函数、tanh函数、ReLU函数

    1. sigmod核函数  sigmod函数的数学公式为:    函数取值范围(0,1),函数图像下图所示:  二. tanh(x) 函数  tanh(x)函数的数学公式为:  函数取值范围(-1,1 ...

  2. DL之AF:机器学习/深度学习中常用的激活函数(sigmoid、softmax等)简介、应用、计算图实现、代码实现详细攻略

    DL之AF:机器学习/深度学习中常用的激活函数(sigmoid.softmax等)简介.应用.计算图实现.代码实现详细攻略 目录 激活函数(Activation functions)相关配图 各个激活 ...

  3. 激活函数总结sigmoid,tanh,relu,Leaky ReLU,RRelu,ELU,PRelu,SELU,swish

    本文总结深度学习的损失函数及其优缺点. 激活函数是深度学习模型的重要成分,目的是将线性输入转换为非线性.常见的激活函数有sigmoid,tanh,ReLU等 1.sigmoid Sigmoid 非线性 ...

  4. Python大数据综合应用 :零基础入门机器学习、深度学习算法原理与案例

    机器学习.深度学习算法原理与案例实现暨Python大数据综合应用高级研修班 一.课程简介 课程强调动手操作:内容以代码落地为主,以理论讲解为根,以公式推导为辅.共4天8节,讲解机器学习和深度学习的模型 ...

  5. python原理书籍_python书籍推荐:《深入浅出深度学习:原理剖析与Python实践》

    在过去的这十年,深度学习已经席卷了整个科技界和工业界,2016年谷歌阿尔法狗打败围棋世界冠军李世石,更是使其成为备受瞩目的技术焦点. 今日,小编就为大家推荐一本能让初学者和"老司机" ...

  6. TensorFlow深度学习算法原理与编程实战 人工智能机器学习技术丛书

    作者:蒋子阳 著 出版社:中国水利水电出版社 品牌:智博尚书 出版时间:2019-01-01 TensorFlow深度学习算法原理与编程实战 人工智能机器学习技术丛书 ISBN:97875170682 ...

  7. 深度学习算法原理_用于对象检测的深度学习算法的基本原理

    深度学习算法原理 You just got a new drone and you want it to be super smart! Maybe it should detect whether ...

  8. 没人说得清深度学习的原理 只是把它当作一个黑箱来使

    没人说得清深度学习的原理 只是把它当作一个黑箱来使 人类正在慢慢接近世界的本质--物质只是承载信息模式的载体.人脑之外的器官都只是保障这一使命的给养舰队. 自从去年AlphaGo 完虐李世乭,深度学习 ...

  9. 基于阈值和深度学习的玉米常见锈病严重程度自动模糊逻辑预测(工具+综述+玉米锈病严重程度数据集)

    基于阈值和深度学习的玉米常见锈病严重程度自动模糊逻辑预测 Abstract 人工智能(AI)的发展使植物病理学的许多应用成为可能.例如,许多研究人员使用了预先训练的卷积神经网络(CNNs),如VGG- ...

  10. [Pytorch 常用函数] 激活函数Relu, Leaky Relu

    修正线性单元(Rectified linear unit,ReLU)是神经网络中最常用的激活函数.它保留了 step 函数的生物学启发(只有输入超出阈值时神经元才激活),不过当输入为正的时候,导数不为 ...

最新文章

  1. 正则表达式判断号码靓号类型
  2. python外星人入侵游戏代码大全-Python外星人入侵游戏开发—重构键盘鼠标响应代码...
  3. Angular应用 vendor.js里的magic number 16384是什么含义
  4. 单片机的 FIFO循环队列实现
  5. 潜伏研发群一个月,我发现了程序员不为人知的秘密!这也太可爱了吧
  6. Java SSM框架学习之Mybatis篇
  7. Windows Devcpp配置MYSQL
  8. Android Studio 配置Git,移动端h5页面开发教程百度云资源
  9. 论文翻译(上):Deep Learning Based Semantic Labelling of 3D Point Cloud in Visual SLAM
  10. 计算机硬盘图标ico,LaCie 硬盘图标
  11. 一文读懂阿里云直播技术是如何实现的
  12. QT MPlayer播放器
  13. aspectsof的意思_aspect of是什么意思
  14. linux向日葵无法启动, 提示错误 connect is error
  15. log buffer及日志管理深入分析及性能调整(七)
  16. 乐视:基于Docker的RDS,我们是这样做的
  17. 跨越新数字鸿沟,懂行共识激发共振效应,成就数字化转型最短路径
  18. Left 4 Dead 2如何局域网联机
  19. Vue 输入框禁止贴贴
  20. Android 集成Facebook分享功能

热门文章

  1. 【心理咨询师考试笔记】操作技能(三)——咨询基本技能
  2. JAVA基础--java简单知识04(类与对象,封装,继承,多态)
  3. NCC eclipse启动配置
  4. 中国电子商务网经的盈利策略
  5. 快速让网站内容可以复制
  6. gpu显示off_GPU常见故障及排查方法
  7. linux 2.6内核镜像,Linux2.6内核镜像的构建过程
  8. 李珣同款爱心特效代码,加DIY教程,快拿去送给你喜欢的那个ta吧。
  9. 反向代理haproxy用法详解
  10. 观众关注人数超4万,CIOE信息通信展热度持续高涨