跳转至

深度学习的激活函数 :sigmoid、tanh、ReLU 、Leaky Relu、RReLU、softsign 、softplus、GELU

tensorflow中文文档:tensorflow 的激活函数有哪些

激活函数可以分为 两大类

  • 饱和 激活函数: sigmoid、 tanh
  • 非饱和 激活函数: ReLU 、Leaky Relu 、ELU【指数线性单元】、PReLU【 参数化的 ReLU 】、RReLU【随机ReLU】

相对于饱和激活函数,使用“ 非饱和激活函数”的优势 在于两点:
1.首先,“非饱和激活函数”能解决深度神经网络【层数非常多!!】的“ 梯度消失”问题 ,浅层网络【三五层那种】才用sigmoid 作为激活函数。
2.其次,它能 加快收敛速度

(1) **sigmoid 函数 **

\[\begin{equation} S(x) = \frac{1}{1 + e^{- \theta x}} \end{equation}\]

参数 \( \theta > 0 \)可控制其斜率。 sigmoid 将一个实值输入压缩至[0,1]的范围,也可用于 二分类的输出层 。 Sigmoid 是一个可微的有界函数,在各点均有非负的导数。当 𝑥→∞ 时,𝑆(𝑥)→1;当 𝑥→−∞ 时,𝑆(𝑥)→0。常用于二元分类(Binary Classification)问题,以及神经网络的激活函数(Activation Function)(把线性的输入转换为非线性的输出)

技术分享

(2)tanh (双曲正切函数 ;Hyperbolic tangent function)

将一个实值输入压缩至 [-1, 1]的范围,这类函数具有平滑和渐近性,并保持单调性.

(3) relu ( Rectified linear unit; 修正线性单元 )

深度学习目前最常用的激活函数

# Relu在tensorflow中的实现: 直接调用函数 
tf.nn.relu( features, name= None )

与Sigmoid/tanh函数相比, ReLu激活函数的优点 是:

  • 使用梯度下降(GD)法时, 收敛速度更快
  • 相比Relu只需要一个门限值,即可以得到激活值, 计算速度更快

缺点 是: Relu的输入值为负的时候,输出始终为0,其一阶导数也始终为0,这样会导致神经元不能更新参数,也就是神经元不学习了,这种现象叫做“ Dead Neuron ”。

为了解决Relu函数这个缺点,在Relu函数的负半区间引入一个泄露(Leaky)值,所以称为 Leaky Relu函数

(4) Leaky Relu (带泄漏单元的relu )

数学表达式: y = max(0, x) + leak*min(0,x)

与 ReLu 相比 ,leak 给所有负值赋予一个非零斜率, leak是一个很小的常数 ai ,这样保留了一些负轴的值,使得负轴的信息不会全部丢失)

leaky ReLU

#leakyRelu在tennsorflow中的简单实现
tf.maximum(leak * x, x)

比较高效的写法为:

1
2
3
4
5
6
import tensorflow as tf
def LeakyReLU(x,leak=0.2,name="LeakyReLU"):
    with tf.variable_scope(name):
        f1 = 0.5*(1 + leak)
        f2 = 0.5*(1 - leak)
        return f1*x+f2*tf.abs(x)

(5) RReLU(随机ReLU)

在训练时使用RReLU作为激活函数,则需要从均匀分布U(I,u)中随机抽取的一个数值aji ,作为负值的斜率。

(6) softsign

\large f\left ( x \right )= \frac{x}{1+\left | x \right |}

(7) softplus

Softplus函数是Logistic-Sigmoid函数原函数 Softplus(x)=log(1+ex) ,加了1是为了保证非负性。Softplus可以看作是强制非负校正函数max(0,x)平滑版本。红色的即为ReLU。

技术分享

(8)Softmax 函数

\[ \begin{equation} S(x_j) = \frac{e^{x_j}}{\sum_{k=1}^K e^{x_k}}, j = 1, 2, …, K \end{equation} \]

对于一个长度为 K 的任意实数矢量,Softmax 可以把它压缩为一个长度为 K 的、取值在 (0, 1) 区间的实数矢量,且矢量中各元素之和为 1。它在多元分类(Multiclass Classification)和神经网络中也有很多应用。Softmax 不同于普通的 max 函数:max 函数只输出最大的那个值,而 Softmax 则确保较小的值也有较小的概率,不会被直接舍弃掉,是一个比较“Soft”的“max”。softmax 用于多分类神经网络输出。

在二元分类的情况下,对于 Sigmod,有:

\[ \begin{equation} p(y = 1 | x) = \frac{1}{1 + e^{-\theta^Tx}} \end{equation} \]
\[ \begin{equation} p(y = 0 | x) = 1 – p(y = 1 | x) = \frac{e^{-\theta^Tx}}{1 + e^{-\theta^Tx}} \end{equation} \]

而对 𝐾=2 的 Softmax ,有:

\[ \begin{equation} p(y = 1|x) = \frac{e^{\theta_1^Tx}}{e^{\theta_0^Tx} + e^{\theta_1^Tx}} = \frac{1}{1 + e^{(\theta_0^T – \theta_1^T)x}} = \frac{1}{1 + e^{-\beta x}} \end{equation} \]
\[ \begin{equation} p(y = 0|x) = \frac{e^{\theta_0^Tx}}{e^{\theta_0^Tx} + e^{\theta_1^Tx}} = \frac{e^{(\theta_0^T-\theta_1^T)x}}{1 + e^{(\theta_0^T-\theta_1^T)x}} = \frac{e^{-\beta x}}{1 + e^{-\beta x}} \end{equation} \]
\[ \begin{equation} \beta = -(\theta_0^T – \theta_1^T) \end{equation} \]

可见在二元分类的情况下,Softmax 退化为了 Sigmoid。

(11)GELU :高斯误差线性单元

这篇论文中,作者展示了几个使用GELU的神经网络优于使用ReLU作为激活的神经网络的实例。GELU也被用于BERT。

GELU、ReLU和LeakyReLU的函数

1
2
3
4
5
6
def gelu(x):
   return 0.5 * x * (1 + math.tanh(math.sqrt(2 / math.pi) * (x + 0.044715 * math.pow(x, 3))))
def relu(x):
   return max(x, 0)
def lrelu(x):
   return max(0.01*x, x)

以下两个是以前使用的:

(9)阈值函数 、阶梯函数

相应的输出 yk

(10)分段线性函数

function-relu-silent-moon-cold-gelu_-sof_21Mar05214507553449_1.png

它类似于一个放大系数为 1 的非线性放大器,当工作于线性区时它是一个线性组合器, 放大系数趋于无穷大时变成一个阈值单元。

凡本网注明"来源:XXX "的文/图/视频等稿件,本网转载出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如涉及作品内容、版权和其它问题,请与本网联系,我们将在第一时间删除内容!
作者: wamg潇潇
来源: https://blog.csdn.net/qq_29831163/article/details/89887655