深度学习常用激活函数

2023-10-27

神经网络构架过程中常用的激活函数表达式,函数图像和优缺点

激活函数决定输入信号是否或多大程度上应该通过节点(或神经元)传递到下一层。众所周知,神经网络的运算是线性的,引入非线性的激活函数,可以提高神经网络的拟合能力。下面讲解释一些常见的激活函数。

1. Logistic Sigmoid Function (逻辑S形函数)

数学表达式: σ ( x ) = 1 1 + e x p ( − x ) \sigma(x)=\frac{1}{1+exp(-x)} σ(x)=1+exp(x)1
函数图像:
在这里插入图片描述Sigmoid函数将输入数据转化到 0~1 之间的输出。具体而言,当输入为负数时,输入越小,输出越接近0;当输入为正数时,输入越大,输出越接近1;
缺点:(1)造成梯度消失,靠近1和0两端时,梯度几乎为0,无法更新参数;
   (2)输出不是以0为均值,导致下一层输入为非0均值,影响更新参数。

2. Hyperbolic Tangent Function (双曲正切函数)

数学表达式: t a n h ( x ) = 2 1 + e x p ( − 2 x ) − 1 = 2 ⋅ σ ( 2 x ) − 1 tanh(x)=\frac{2}{1+exp(-2x)}-1 = 2\cdot\sigma(2x)-1 tanh(x)=1+exp(2x)21=2σ(2x)1
函数图像:
在这里插入图片描述
tanh函数是Sigmoid函数的变形,将输入数据转化到 -1~1 之间,具体的输入与输出趋势可以从图像中观察。总之,这两个激活函数,面临着相同的饱和问题,即当输入是非常大的正数或者非常小的负数的时候,它们的梯度都无限趋近于0,只有当输入在0附近时,两个激活函数才比较敏感,这极大影响了梯度训练方法的实用性。也正是由于这个原因,使得Sigmoid和tanh函数在激活函数中的受欢迎程度越来越低。
缺点:解决了Sigmoid函数的第二个问题,即输出不以0为均值,但仍然存在梯度消失问题。

3. Rectifier Linear Unit (ReLU , 整流线性单元)

整流函数(Rectifier Function)类似于线性函数,唯一的区别是当输入是负数时,其输出为0。在神经网络中,采用这种激活函数的单元被称为整流线性单元(Rectifier Linear Unit )
数学表达式: R e L U ( x ) = m a x { 0 , x } ReLU(x)=max\{ 0,x\} ReLU(x)=max{0,x}
函数图像:
在这里插入图片描述
当输入是正值时,整流函数的输出和输入是相等的,当时输入是负值时,函数的输出为0。在神经网络的每一层中,一般只有少数节点被激活,这确保了计算的高效性。
优点:(1)相比于sigmoid 和 tanh 函数而言,加速梯度下降的收敛速度,不存在梯度消失的问题 ;
   (2)计算方法更加简单,只需一个阈值过滤就可得到结果。
缺点:
训练时“脆弱”,函数本质上是不可逆的,直接去掉输入小于0的部分,会使梯度为 0 ,导致参数无法更新。但是可以通过设置较小的学习率来避免这个小问题,因此,ReLU函数也成为神经网络结构普遍常用的函数。

4. LeakyReLU (带泄露整流线性单元)

数学表达式: L e a k y R e L U ( x ) = { α   x x < 0 x x ≥ 0 LeakyReLU(x) =\begin {cases} \alpha \ x &\text {$x<0$} \\ x&\text {$x\geq0$} \end{cases} LeakyReLU(x)={α xxx<0x0
函数图像:
在这里插入图片描述
LeakyReLU是ReLU函数的变体,当输入为负值时,该单元会对输入进行一个小幅度的现象变换。
优点:修复了ReLU函数训练“脆弱”的缺点,不将 x < 0 x<0 x<0部分变为0,而是变得很小。
注意:这里并不是说,LeakyReLU ≫ \gg ReLU,只是说,LeakyReLU函数在训练过程中,不会显得那么“脆弱”,具体在神经网络的搭建中,选取激活函数,还是要根据特定的任务来选择。

5. Exponential Linear Unit (ELU , 指数线性单元)

数学表达式: E L U ( x ) = { c   ( e x p ( x ) − 1 ) x < 0 x x ≥ 0 ELU(x) =\begin {cases} c\ (exp(x) - 1) &\text {$x<0$} \\ x&\text {$x\geq0$} \end{cases} ELU(x)={c (exp(x)1)xx<0x0
其中, c ∈ ( 0 , 1 ) c\in(0,1) c(0,1) 表示一个正值的常数,决定了当输入为负数时,对应指数函数的斜率。
函数图像:
在这里插入图片描述
优点:通过减少偏置偏移的影响,使得训练梯度更接近于单位自然梯度,从而使均值向0加速学习。
缺点:含有幂运算,会使得计算成本增加。

补充: Maxout 函数

这里再补充一个maxout函数,这个函数其实很好理解,先看表达式
数学表达式: M a x o u t ( x ) = m a x { w 1 x + b 1 , w 2 x + b 2 } Maxout(x)=max\{ w_{1}x+b_{1},w_{2}x+b_{2}\} Maxout(x)=max{w1x+b1,w2x+b2}
可以发现,当 w 1 , b 1 = 0 w_{1},b_{1} = 0 w1,b1=0的时候,就是ReLU函数。
优点方面和ReLU函数是一样的,作为一个“部分”线性函数,解决了梯度消失问题,但是也存在最致命的缺点就是,相比于ReLU函数训练模型的参数加倍,导致模型的存储变大。

这里给出一个不官方的激活函数排名
ReLU > Maxout > ELU > Tanh > Sigmoid

一般在同一网络中,我们都使用同一类型的激活函数。当然,通俗来讲,是一个模型一般使用一个激活函数,具体到VAE,
AAE, GANs这样会存在两个模型结合的情况,就会存在两个不一样的激活函数了。
但是大家都知道的,任何的激活函数使用都是需要根据自己构建模型的任务需求来的,所以具体问题具体分析了。

#函数可视化的代码也附一下
import numpy as np
import matplotlib.pyplot as plt
import math

plt.rc('font',family='Times New Roman', size=15)

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

def tanh(x):
    result = (math.e ** (x) - math.e ** (-x)) / (math.e ** (x) + math.e ** (-x))
    return result

def relu(x):
    return np.where(x < 0, 0, x)

def leaky_relu(x):
    a = x[x > 0]
    b = 0.1 * x[x < 0]
    result = np.concatenate((b, a), axis=0)
    return result

def elu(x, alpha=1):
    a = x[x > 0]
    b = alpha * (math.e ** (x[x < 0]) - 1)
    result = np.concatenate((b, a), axis=0)
    return result

# 举例sigmoid函数,其他的使用matplotlib可视化就行
x = np.arange(-10, 10, 0.1)
#y = sigmoid(x)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
ax.spines['left'].set_position(('data', 0))
ax.plot(x, y,color="black", lw=1.5)
plt.xticks(fontsize=15)
plt.yticks(fontsize=15)
plt.xlim([-10.05, 10.05])
plt.ylim([-0.02, 1.02])
plt.text(-9, 0.6, '—Sigmoid Function',)
plt.tight_layout()
plt.show()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深度学习常用激活函数 的相关文章

随机推荐

  • npm yarn pnpm 包管理器区别

    npm yarn和pnpm都是JavaScript的包管理工具 它们的主要区别如下 性能 在处理依赖安装时 yarn和pnpm相对于npm会更快 因为它们支持并行安装 但是在其他方面 如缓存等 各自的性能表现可能有所不同 安全性 yarn和
  • 关于Linux内核编译

    关于生成配置文件 1 首先执行以下命令从老的 xxxx defconfig 文件生成临时使用的 config 文件 根据硬件平台生成临时配置文件 config 比如 make xxxx defconfig make vexpress def
  • MacOS下终端可以连接mysql但是MySQLWorkbench无法连接

    亲测有效 很早前安装了mysql 一直在终端里使用 最近安装了MySQLWorkbench但始终无法连接 整个人都给晕了 但是在MySQLWorkbench的连接界面下始终无法连接成功 在终端测试同样的ip和端口是可以连接成功的 mysql
  • 一网打尽时钟树综合Clock Skew

    一网打尽时钟树综合Clock Skew 文章右侧广告为官方硬广告 与吾爱IC社区无关 用户勿点 点击进去后出现任何损失与社区无关 时间过得很快 今天又上班了 最重要的是公众号还得对得起各位粉丝一直以来的支持 所以必须抽时间码字更文 在五一期
  • C++ 自定义QPushButton有参信号

    C 自定义QPushButton有参信号 ifndef MYWINDOW H define MYWINDOW H include
  • 【无奈】Invalid byte 1 of 1-byte UTF-8 sequence解决方案

    今天在eclipse中编写pom xml文件时 注释中的中文被eclipse识别到错误 Invalid byte 1 of 1 byte UTF 8 sequence 曾多次遇到该问题 问题的根源是 The cause of this is
  • Vue路由hash模式下锚点滚动实现

    1 Vue路由在hash模式下 已被占用 无法使用浏览器的锚点功能 使用js实现锚点滚动功能 使用js实现锚点滚动功能 字符串需要是 id 锚点格式 数字的话标识要滚动的位置 param String Number selector exp
  • qt中自定义关闭按钮的时候绑定关闭事件

    qt中自定义了关闭按钮 如何简单的只用绑定信号跟槽就直接调用事件呢 1 首先在界面中放置一个按钮 重命名为CloseBtn 然后接下来就只需要在构造函数中加上如下的这句 connect ui gt CloseBtn SIGNAL click
  • DFS时,出现内存超限 Memory Limit Exceeded

    DFS时 出现内存超限 Memory Limit Exceeded 很大可能由于dfs死循环 比如 vis 数组一定优先赋值再dfs
  • 最小二乘曲线拟合——C语言算法实现一

    最小二乘曲线拟合 给定一组数据 我们要对这组数据进行曲线拟合 假定要拟合的曲线方程为 y a0 a1 x 1 a2 x 2 a3 x 3 an x n x y 0 995119 7 620000 2 001185 2 460000 2 99
  • Java算法之 n个整数中找出连续m个数加和是最大

    为什么80 的码农都做不了架构师 gt gt gt 分析 m个连续的整数加和是最大 那么最简单的实现方式就是 从下标为0查找m个元素 依次n个数组成的容器进行遍历 每次遍历判断当前最大的m个数之和 遍历结束后返回 public class
  • Linux系统下修改mysql数据库密码

    修改mysql数据库的方法有很多种 这个方法适用于忘记root用户密码或者刚安装mysql要进入mysql时发现系统报错及觉得默认密码太复杂想修改密码的 1 修改 etc my cnf 文件 在 mysql 后面任意一个地方添加以下内容 s
  • 常见问题-打不开宝塔面板

    解决方案 打不开宝塔面板 换个Chrome浏览器打开就可以了
  • jsp或html中给选中的a标签改变颜色和背景色(用源生js)

    我们直接看代码 我是循环遍历的a标签 给每个a标签一个class属性 然后在js中进行设置 这里的if比较是比较目前页面的a标签的值和我们点击传递的serlvet是否是同一个 如果是就改变颜色 我打印一下 在终端给看一下 好的 如果还有什么
  • SPSS(十九)SPSS之时间序列模型(图文+数据集)

    SPSS 十九 SPSS之时间序列模型 图文 数据集 时间序列是指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列 正如人们常说 人生的出场顺序很重要 时间序列中隐藏着一些过去与未来的关系 时间序列分析试图通过研究过去来预测未来 时
  • js中请求数据的$post和$ajax区别(同步和异步问题)

    post和 Ajax都为页面上向后台发送请求 请求数据1 post 因为post默认为异步请求 可是有时候我们会发现 本来要求请求马上出现 可是异步会导致后面突然再执行 这样就出很多问题 2 Ajax 最原始的Ajax 可以控制同步或者异步
  • 1.3.1 手写数字识别之数据处理

    文章目录 概述 一 加载类库 二 读入数据并划分数据集 扩展阅读 为什么针对固定数据集的模型总在不断精进呢 三 训练样本乱序 生成批次数据 四 校验数据有效性 机器校验 人工校验 五 封装数据读取与处理函数 六 异步数据读取 七 扩展阅读
  • Python调用GPT3.5接口的最新方法

    GPT3 5接口调用方法主要包括openai安装 api requestor py替换 接口调用 示例程序说明四个部分 1 openai安装 Python openai库可直接通过pip install openai安装 如果已经安装ope
  • 【力扣】第302场周赛记录

    第302场周赛记录 6120 数组能形成多少数对 6164 数位和相等数对的最大和 6121 裁剪数字后查询第 K 小的数字 6122 使数组可以被整除的最少删除次数 6120 数组能形成多少数对 链接 数组能形成多少数对 描述 给你一个下
  • 深度学习常用激活函数

    神经网络构架过程中常用的激活函数表达式 函数图像和优缺点 激活函数决定输入信号是否或多大程度上应该通过节点 或神经元 传递到下一层 众所周知 神经网络的运算是线性的 引入非线性的激活函数 可以提高神经网络的拟合能力 下面讲解释一些常见的激活