深度学习常用激活函数

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

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

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()
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值