功能性模块:(8)一文理解常用激活函数(Sigmoid,ReLU,ELU,GELU...)
一文理解常用激活函数
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...)相关推荐
- SMU激活函数 | 超越ReLU、GELU、Leaky ReLU让ShuffleNetv2提升6.22%
点击上方"计算机视觉工坊",选择"星标" 干货第一时间送达 作者丨ChaucerG 来源丨集智书童 选择一个好的激活函数可以对提高网络性能产生重要的影响.Han ...
- 神经网络的激活函数sigmoid RELU
日常 coding 中,我们会很自然的使用一些激活函数,比如:sigmoid.ReLU等等.不过好像忘了问自己一(n)件事: 为什么需要激活函数? 激活函数都有哪些?都长什么样?有哪些优缺点? 怎么选 ...
- 神经网络激活函数sigmoid relu tanh 为什么sigmoid 容易梯度消失
什么是激活函数 为什么要用 都有什么 sigmoid ,ReLU, softmax 的比较 如何选择 1. 什么是激活函数 如下图,在神经元中,输入的 inputs 通过加权,求和后,还被作用了一个函 ...
- CNN 基本部件-常用激活函数详解
背景知识 反向传播算法 梯度消失与梯度爆炸 激活函数的作用 七种常用激活函数 Sigmoid型函数 tanh(x)型函数 修正线性单元(ReLU) Leaky ReLU 参数化 ReLU 总结 参考资 ...
- 从ReLU到GELU,一文概览神经网络的激活函数
点击视学算法标星,更快获取CVML新技术 本文转载自机器之心. 选自mlfromscratch 作者:Casper Hansen 机器之心编译 参与:熊猫.杜伟 激活函数对神经网络的重要性自不必多言, ...
- relu函数_从 ReLU 到 GELU,一文概览神经网络的激活函数
点击"机器学习算法与Python实战","置顶"公众号 重磅干货,第一时间送达 选自 | mlfromscratch 作者 | Casper Hansen ...
- Keras深度学习实战(4)——深度学习中常用激活函数和损失函数详解
Keras深度学习实战(4)--深度学习中常用激活函数和损失函数详解 常用激活函数 Sigmoid 激活函数 Tanh 激活函数 ReLU 激活函数 线性激活函数 Softmax 激活函数 损失函数 ...
- 【Python--torch(激活函数说明+代码讲解)】激活函数(sigmoid/softmax/ELU/ReLU/LeakyReLU/Tanh)
[Python–torch]激活函数(sigmoid/softmax/ELU/ReLU/LeakyReLU/Tanh) 文章目录 [Python--torch]激活函数(sigmoid/softmax ...
- 一篇文章理解深度神经网络5个常用激活函数
一篇文章理解深度神经网络5个常用激活函数 1.Sigmoid 2.Tanh 3.ReLU 4.Leaky ReLU 5.Maxout 小结 1.Sigmoid Sigmoid非线性激活函数的数学表达式 ...
最新文章
- 电大2007计算机机考专科试题,中央电大2007-2008学年度第一学期期末考试计算机网络专业计算机网络试题2008年1月...
- java 判断精度_随笔⑦ Java中的比较 ==,equals以及精度对比较的影响
- OpenGL ES之GLSL实现仿抖音“缩放”“灵魂出窍”“抖动”“闪白”“毛刺”“幻觉”等动态滤镜效果
- vue 新窗口打开外链接
- rsa 返回值 验签 失败_解析蛋糕、面包制作失败的原因
- lambda表达式之进化
- 删除高频分量matlab,关于FFT之后怎么提出该频率分量
- 利用kaggle训练模型
- 德江多措施推进大数据应用“智慧德江”建设
- springboot-01
- 遇险哪里还有空报警?求救app告诉你,有的
- js中常用的Math函数方法
- 经营收款限制个人收款码,商户的个税会受影响吗?
- linux系统安装达梦数据库
- SpringBoot 启动类 @SpringBootApplication 注解 以及执行流程
- quartus ii 13.0下载地址
- #Ubuntu 历程# guest账户管理
- c语言用hash方式数组去重,利用set实现去重
- 《数据结构与抽象:Java语言描述(原书第4版)》一1.2 说明一个包
- 闪聚支付项目-项目总结
热门文章
- type II补偿器的误差放大和跨导放大
- 十个适合壁纸动漫的网站,知乎超100万人知道,以后壁纸不求人
- CMD的基本使用方法
- 等保测评之安全运维管理
- Pandas DataFrame数据遍历的三种方式 iteritems iterrows itertuples
- 最新方法VScode中html代码自动补全(超清晰详细,保证能用)
- 一个.java源文件中可以有多个类吗?(内部类除外)有什么条件?
- 直方图(亮度)正规化及直方图均衡化
- 挂羊头卖狗肉蓄意欺骗读者——谭浩强《C程序设计(第四版)》中所谓的“按照C99”(二)...
- PASCAL VOC数据集