文章目录
激活函数
sigmoid,tanh,ReLU,Leaky ReLU,EReLU,PReLU,Softmax,Swish,Maxout,Softplus
什么是激活函数?
激活函数(Activation Function)是一种添加到人工神经网络中的函数,旨在帮助网络学习数据中的复杂模式。类似于人类大脑中基于神经元的模型,激活函数最终决定了要发射给下一个神经元的内容。
在人工神经网络中,一个节点的激活函数定义了该节点在给定的输入或输入集合下的输出。标准的计算机芯片电路可以看作是根据输入得到开(1)或关(0)输出的数字电路激活函数。因此,激活函数是确定神经网络输出的数学方程式。
典型的阶跃函数作为激活函数为例,下图展示了一个神经元是如何喂入激活函数以及如何得到该神经元最终的输出:
1. Sigmod
函数表达形式
σ ( x ) = 1 1 + e − x \sigma(x)=\frac{1}{1+e^{-x}} σ(x)=1+e−x1
导数
σ ′ ( x ) = σ ( x ) ( 1 − σ ( x ) ) \sigma^\prime(x)=\sigma(x)(1-\sigma(x)) σ′(x)=σ(x)(1−σ(x))
什么情况下适合使用Sigmoid?
- sigmoid函数的输出范围是0到1。由于输出值在0和1之间,它相当于将每个神经元的输出归一化。
- 特别适合用于需要将预测概率作为输出的模型。因为任何概率值的范围是[0,1],而且我们往往希望概率值尽量确定(即概率值远离0.5),所以s型曲线是最理想的选择。
- 平滑梯度。显然,sigmoid函数在定义域上处处可导。
- sigmoid函数是可微的,这意味着我们可以找到任意两点之间的斜率。
- 明确的预测值。也就是说倾向于接近0或1。
Sigmoid有哪些缺点?
- 倾向于梯度消失。当输入值z zz的绝对值过大时,导数很小(远小于1),这将导致梯度消失以及深度神经网络学习能力变差。
- 函数输出不以0为中心,这会降低权值更新的效率。具体证明可以参考文章谈谈激活函数以零为中心的问题
- sigmoid需要指数运算,计算机运算较慢。
2. Tanh - 双曲正切函数
函数表达性质
t a n h ( x ) = 2 σ ( 2 x ) − 1 = e x − e − x e x + e − x tanh(x)=2\sigma(2x)-1=\frac{e^x-e^{-x}}{e^x+e^{-x}} tanh(x)=2σ(2x)−1=ex+e−xex−e−x
导数
t a n h ′ ( x ) = 1 − t a n h 2 ( x ) tanh^\prime(x)=1-tanh^2(x) tanh′(x)=1−tanh2(x)
tanh函数的函数图像和sigmoid的曲线很想,但tanh有一些优点。
- 当输入过大或过小时,输出几乎是平滑的,梯度小,不利于权值的更新。区别在于输出间隔。tanh的输出区间为1,整个函数以0为中心,优于sigmoid。
- 其主要优点是负数输入将被映射为接近-1,而零输入将被映射为tanh图中接近零的地方。
Note: 在二分类问题中,一般tanh被用在隐层,而sigmoid被用在输出层。但这不是一成不变的,应当根据网络结构以及问题的特点进行灵活调整。
3. ReLU (Rectified Linear Unit)
函数表达形式
R e L U ( x ) = { x x ≥ 0 0 x < 0 ReLU(x)=\begin{cases}x&x\ge 0 \\ 0 &x<0 \end{cases} ReLU(x)={
x0x≥0x<0
ReLU (Rectified Linear Unit) 函数是目前在深度学习中较其他激活函数更受欢迎的激活函数。与sigmoid和tanh相比,ReLU有如下优点:
- 当输入值为正时,不存在梯度饱和问题(训练过程中,梯度逐渐接近0,导致权重几乎不更新)。
- 计算速度快。
缺点:
- Dead ReLU问题。当输入值为负数时,将直接舍弃该输入值并用0代替,这样就导致使用链式求导法则求导时,求到这就中断了(或者说梯度为0)。这个问题在有些领域是敏感的,有些是不敏感的。但是在反向传播过程中,如果输入一个负数,梯度将完全为零,这与sigmoid函数和tanh函数的问题是一样的。
- ReLU函数的输出要么为0,要么为正数,这意味着ReLU函数不是以0为中心的函数。
4. Leaky ReLU - 有漏洞的ReLU
Leaky ReLU试图解决ReLU的缺点。如上图右边图像即为Leaky ReLU。
R e L U ( x ) = { x x ≥ 0 a x x < 0 , 0 < a < 1 ReLU(x)=\begin{cases}x&x\ge 0 \\ ax &x<0,0<a<1 \end{cases} ReLU(x)={
xaxx≥0x<0,0<a<1
- Leaky ReLU通过给负数输入一个非常小的线性分量(如 0.01 x 0.01x 0.01x)来调整负数输入的梯度为零的问题。
- 漏洞增加了ReLU的范围 ( − ∞ , + ∞ ) (-\infty,+\infty) (−∞,+∞),通常 a = 0.01 a=0.01 a=0.01
5. ELU (Exponential Linear Units)
E L U ( x ) = { x x ≥ 0 α ( e x − 1 ) x < 0 , 0 < a < 1 ELU(x)=\begin{cases}x&x\ge 0 \\ \alpha (e^{x}-1) &x<0,0<a<1 \end{cases} ELU(x)={
xα(ex−1)x≥0x<0,0<a<1
ELU也致力于解决ReLU存在的问题。ELU存在负值并迫使数据均值靠近0,从而避免非0均值带来的降低权值更新效率的问题。
ELU不仅拥有ReLU的所有优点,还有如下:
- 没有Dead ReLU问题。
- 输出均值接近0,像batch normalization一样,但是具有更低的计算复杂度。同时,均值向零移动,使正常梯度更接近单位自然梯度,从而加快学习速度,因为减少了偏移效应。
6. PReLU (Parametric ReLU)
P R e L U ( x ) = { x x ≥ 0 a x x < 0 PReLU(x)=\begin{cases}x&x\ge 0 \\ ax &x<0 \end{cases} PReLU(x)={ xaxx≥0x<0
PReLU是ReLU的一个改进版本。来看看ReLU、Leaky ReLU、PReLU三者的区别:
- 如果a = 0 ,那么上式就是ReLU
- 如果a > 0 ,那么上式就是Leaky ReLU
- 如果a是一个可学习参数,那么上式就是PReLU
PReLU优点如下:
- 在负定义域内,PReLU有斜率(梯度),避免了ReLU的Dead ReLU问题。
- 相比于ELU,PReLU在负定义域内是线性函数,计算复杂度更低并且梯度不会趋近于0。
7. softmax
softmax一般作为多分类模型的输出层,以输出一个关于类别(离散型)的概率分布。例如:
对于第i个类别
f ( x i ) = e x i ∑ k = 1 k = N e x k f(x_i)=\frac{e^{x_i}}{\sum_{k=1}^{k=N}e^{x_k}} f(xi)=∑k=1k=Nexkexi
8. Swish (A Self-Gated)
Swish 函数表达形式
f ( x ) = x ⋅ σ ( x ) f(x)=x\cdot \sigma(x) f(x)=x⋅σ(x)
导数形式
f ′ ( x ) = f ( x ) + σ ( x ) ( 1 − f ( x ) ) f^\prime(x)=f(x)+\sigma(x)(1-f(x)) f′(x)=f(x)+σ(x)(1−f(x))
参考链接
【深度学习激活函数总结2】sigmoid,tanh,ReLU,Leaky ReLU,EReLU,PReLU,Softmax,Swish,Maxout,Softplus - 知乎 (zhihu.com)