一文理解常用激活函数

1. Sigmoid

公式:

Sigmoid(x)=11+exp⁡(−x)\text{Sigmoid}(x) = \frac{1}{1 + \exp(-x)}Sigmoid(x)=1+exp(−x)1​

Sigmoid的函数形状如下图所示:

对应的导数形式如下图所示:

Sigmoid函数的优点:

  • 便于求导,可以看到Sigmoid的梯度是平滑的函数
  • 能够压缩数据,数据会压缩在0-1之间
  • 适合用于前向传播

Sigmoid函数的缺点:

  • 容易出现梯度消失
  • Sigmoid的输出不是0均值
  • 幂函数计算相对比较耗时

2. Tanh

公式:
Tanh(x)=tanh⁡(x)=exp⁡(x)−exp⁡(−x)exp⁡(x)+exp⁡(−x)\text{Tanh}(x) = \tanh(x) = \frac{\exp(x) - \exp(-x)}{\exp(x) + \exp(-x)}Tanh(x)=tanh(x)=exp(x)+exp(−x)exp(x)−exp(−x)​

Tanh的函数形状如下图所示:

对应的导数形式如下图所示:

tanh函数的优点:

  • 将数据收敛到-1~+1之间,并且输出是0均值
  • 收敛速度比Sigmoid函数更快

tanh函数的缺点:

  • 仍然存在梯度消失的问题
  • 仍然存在幂指數运算,计算成本很高

3. ReLU

公式:
f(x)=max⁡(0,x)f(x)=\max(0, x)f(x)=max(0,x)

ReLU的函数形状如下图所示:

对应的导数形式如下图所示:

ReLU函数的优点:

  • 收敛速度更快
  • 解决了一部分梯度消失的问题

ReLU函数的缺点:

  • 没有完全解决梯度消失的问题,在x轴为负的部分神经元的梯度始终为0,相当于神经元一旦失活后,就不会被激活

4. LeakyReLU

公式:

LeakyReLU(x)=max⁡(0,x)+negative_slope∗min⁡(0,x)\text{LeakyReLU}(x) = \max(0, x) + \text{negative\_slope} * \min(0, x)LeakyReLU(x)=max(0,x)+negative_slope∗min(0,x)

LeakyReLU的函数形状如下图所示:

对应的导数形式如下图所示:

LeakyReLU函数的优点:

  • 解决了ReLU中神经一旦失活,就无法再次激活的问题

LeakyReLU函数的缺点:

  • 无法为正负输入值提供一致的关系预测,可以看到不同区间的函数是不一致的

5. ELU

公式:
ELU(x)=max⁡(0,x)+min⁡(0,α∗(exp⁡(x)−1))\text{ELU}(x) = \max(0,x) + \min(0, \alpha * (\exp(x) - 1))ELU(x)=max(0,x)+min(0,α∗(exp(x)−1))

ELU的函数形状如下图所示:

对应的导数形式如下图所示:

ELU函数的优点:

  • 有ReLU所有的优点

ELU函数的缺点:

  • 计算相较ReLU来说会比较复杂,效果也不一定比ELU好

6. GELU

公式:

GELU(x)=x∗Φ(x)\text{GELU}(x) = x * \Phi(x)GELU(x)=x∗Φ(x)

Φ(x)\Phi(x)Φ(x) is the Cumulative Distribution Function for Gaussian Distribution

GELU的函数形状如下图所示:

对应的导数形式如下图所示:


GELU函数的优点:

  • 之前描述的所有的激活函数正则化和激活函数是分开进行的,GELU是同时进行正则化和激活函数

GELU函数的缺点:

  • 暂无,等待补充

PS: 上述图例代码

import torch
import matplotlib.pylab as plt
import torch.nn.functional as F
import osfunc_pic_res = "./func_pic_res/"
if not os.path.exists(func_pic_res):os.makedirs(func_pic_res)def xyplot(x_vals, y_vals, name):plt.figure()plt.rcParams['figure.figsize'] = (5, 3.5)plt.plot(x_vals.detach().numpy(), y_vals.detach().numpy(), label=name, linewidth=1.5, color='#FF0000')plt.grid(True, linestyle=':')plt.legend(loc='upper left')# dark_background, seaborn, ggplotplt.style.use("seaborn")ax = plt.gca()ax.spines['right'].set_color("none")ax.spines['top'].set_color("none")ax.spines['bottom'].set_position(("data", 0))ax.spines['left'].set_position(("data", 0))ax.spines['bottom'].set_linewidth(0.5)ax.spines['left'].set_linewidth(0.5)ax.xaxis.set_ticks_position('bottom')ax.yaxis.set_ticks_position('left')plt.savefig(func_pic_res + "{}.jpg".format(name))# sigmoid激活函数
def test_Sigmoid():x = torch.arange(-10.0, 10.0, 0.1, requires_grad=True)y = x.sigmoid()xyplot(x, y, 'Sigmoid')# 导数y.sum().backward()xyplot(x, x.grad, 'grad of Sigmoid')def test_Tanh():x = torch.arange(-10.0, 10.0, 0.1, requires_grad=True)y = x.tanh()xyplot(x, y, 'Tanh')# 导数y.sum().backward()xyplot(x, x.grad, 'grad of Tanh')def test_ReLU():x = torch.arange(-10.0, 10.0, 0.1, requires_grad=True)y = x.relu()xyplot(x, y, 'ReLU')# 导数y.sum().backward()xyplot(x, x.grad, 'grad of ReLU')def test_LeakyReLU():x = torch.arange(-10.0, 10.0, 0.1, requires_grad=True)y = F.leaky_relu(x, negative_slope=0.1, inplace=False)xyplot(x, y, 'LeakyReLU(negative_slope=0.1)')# 导数y.sum().backward()xyplot(x, x.grad, 'grad of LeakyReLU(negative_slope=0.1)')def test_ELU():x = torch.arange(-10.0, 10.0, 0.1, requires_grad=True)y = F.elu(x, alpha=0.3, inplace=False)xyplot(x, y, 'ELU(alpha=0.3)')# 导数y.sum().backward()xyplot(x, x.grad, 'grad of ELU(alpha=0.3)')def test_GELU():x = torch.arange(-10.0, 10.0, 0.1, requires_grad=True)y = F.gelu(x)xyplot(x, y, 'GELU')# 导数y.sum().backward()xyplot(x, x.grad, 'grad of GELU')if __name__ == "__main__":test_Sigmoid()test_Tanh()test_ReLU()test_LeakyReLU()test_ELU()test_GELU()

功能性模块:(8)一文理解常用激活函数(Sigmoid,ReLU,ELU,GELU...)相关推荐

  1. SMU激活函数 | 超越ReLU、GELU、Leaky ReLU让ShuffleNetv2提升6.22%

    点击上方"计算机视觉工坊",选择"星标" 干货第一时间送达 作者丨ChaucerG 来源丨集智书童 选择一个好的激活函数可以对提高网络性能产生重要的影响.Han ...

  2. 神经网络的激活函数sigmoid RELU

    日常 coding 中,我们会很自然的使用一些激活函数,比如:sigmoid.ReLU等等.不过好像忘了问自己一(n)件事: 为什么需要激活函数? 激活函数都有哪些?都长什么样?有哪些优缺点? 怎么选 ...

  3. 神经网络激活函数sigmoid relu tanh 为什么sigmoid 容易梯度消失

    什么是激活函数 为什么要用 都有什么 sigmoid ,ReLU, softmax 的比较 如何选择 1. 什么是激活函数 如下图,在神经元中,输入的 inputs 通过加权,求和后,还被作用了一个函 ...

  4. CNN 基本部件-常用激活函数详解

    背景知识 反向传播算法 梯度消失与梯度爆炸 激活函数的作用 七种常用激活函数 Sigmoid型函数 tanh(x)型函数 修正线性单元(ReLU) Leaky ReLU 参数化 ReLU 总结 参考资 ...

  5. 从ReLU到GELU,一文概览神经网络的激活函数

    点击视学算法标星,更快获取CVML新技术 本文转载自机器之心. 选自mlfromscratch 作者:Casper Hansen 机器之心编译 参与:熊猫.杜伟 激活函数对神经网络的重要性自不必多言, ...

  6. relu函数_从 ReLU 到 GELU,一文概览神经网络的激活函数

    点击"机器学习算法与Python实战","置顶"公众号 重磅干货,第一时间送达 选自 | mlfromscratch    作者 | Casper Hansen ...

  7. Keras深度学习实战(4)——深度学习中常用激活函数和损失函数详解

    Keras深度学习实战(4)--深度学习中常用激活函数和损失函数详解 常用激活函数 Sigmoid 激活函数 Tanh 激活函数 ReLU 激活函数 线性激活函数 Softmax 激活函数 损失函数 ...

  8. 【Python--torch(激活函数说明+代码讲解)】激活函数(sigmoid/softmax/ELU/ReLU/LeakyReLU/Tanh)

    [Python–torch]激活函数(sigmoid/softmax/ELU/ReLU/LeakyReLU/Tanh) 文章目录 [Python--torch]激活函数(sigmoid/softmax ...

  9. 一篇文章理解深度神经网络5个常用激活函数

    一篇文章理解深度神经网络5个常用激活函数 1.Sigmoid 2.Tanh 3.ReLU 4.Leaky ReLU 5.Maxout 小结 1.Sigmoid Sigmoid非线性激活函数的数学表达式 ...

最新文章

  1. 电大2007计算机机考专科试题,中央电大2007-2008学年度第一学期期末考试计算机网络专业计算机网络试题2008年1月...
  2. java 判断精度_随笔⑦ Java中的比较 ==,equals以及精度对比较的影响
  3. OpenGL ES之GLSL实现仿抖音“缩放”“灵魂出窍”“抖动”“闪白”“毛刺”“幻觉”等动态滤镜效果
  4. vue 新窗口打开外链接
  5. rsa 返回值 验签 失败_解析蛋糕、面包制作失败的原因
  6. lambda表达式之进化
  7. 删除高频分量matlab,关于FFT之后怎么提出该频率分量
  8. 利用kaggle训练模型
  9. 德江多措施推进大数据应用“智慧德江”建设
  10. springboot-01
  11. 遇险哪里还有空报警?求救app告诉你,有的
  12. js中常用的Math函数方法
  13. 经营收款限制个人收款码,商户的个税会受影响吗?
  14. linux系统安装达梦数据库
  15. SpringBoot 启动类 @SpringBootApplication 注解 以及执行流程
  16. quartus ii 13.0下载地址
  17. #Ubuntu 历程# guest账户管理
  18. c语言用hash方式数组去重,利用set实现去重
  19. 《数据结构与抽象:Java语言描述(原书第4版)》一1.2 说明一个包
  20. 闪聚支付项目-项目总结

热门文章

  1. type II补偿器的误差放大和跨导放大
  2. 十个适合壁纸动漫的网站,知乎超100万人知道,以后壁纸不求人
  3. CMD的基本使用方法
  4. 等保测评之安全运维管理
  5. Pandas DataFrame数据遍历的三种方式 iteritems iterrows itertuples
  6. 最新方法VScode中html代码自动补全(超清晰详细,保证能用)
  7. 一个.java源文件中可以有多个类吗?(内部类除外)有什么条件?
  8. 直方图(亮度)正规化及直方图均衡化
  9. 挂羊头卖狗肉蓄意欺骗读者——谭浩强《C程序设计(第四版)》中所谓的“按照C99”(二)...
  10. PASCAL VOC数据集