第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > 一文详解激活函数

一文详解激活函数

时间:2022-10-07 02:45:39

相关推荐

一文详解激活函数

1. 什么是激活函数?

所谓激活函数(Activation Function),就是在人工神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端。然后这里也给出维基百科的定义:在计算网络中, 一个节点的激活函数(Activation Function)定义了该节点在给定的输入或输入的集合下的输出。标准的计算机芯片电路可以看作是根据输入得到开(1)或关(0)输出的数字电路激活函数。这与神经网络中的线性感知机的行为类似。然而,只有非线性激活函数才允许这种网络仅使用少量节点来计算非平凡问题。 在人工神经网络中,这个功能也被称为传递函数。具体详见激活函数 。

激活函数对于人工神经网络模型去学习、理解非常复杂和非线性的函数来说具有十分重要的作用。它们将非线性特性引入到我们的网络中。如图,在神经元中,输入(inputs )通过加权,求和后,还被作用在一个函数上,这个函数就是激活函数。

2. 为什么要用激活函数?

如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合,这种情况就是最原始的感知机(Perceptron)。没有激活函数的每层都相当于矩阵相乘。就算你叠加了若干层之后,无非还是个矩阵相乘罢了。

如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。

3. 激活函数为什么是非线性的?

如果使用线性激活函数,那么输入跟输出之间的关系为线性的,无论神经网络有多少层都是线性组合。

使用非线性激活函数是为了增加神经网络模型的非线性因素,以便使网络更加强大,增加它的能力,使它可以学习复杂的事物,复杂的表单数据,以及表示输入输出之间非线性的复杂的任意函数映射。

输出层可能会使用线性激活函数,但在隐含层都使用非线性激活函数

4. 常用的激活函数:sigmoid,Tanh,ReLU,Leaky ReLU,PReLU,ELU,Maxout,selu

(1) sigmoid函数

sigmoid函数又称 Logistic函数,用于隐层神经元输出,取值范围为(0,1),可以用来做二分类。

sigmoid函数表达式:

σ ( x ) = 1 1 + e x \sigma\left(x\right) = \frac{1}{1+e^x} σ(x)=1+ex1​

sigmoid函数的几何形状是一条S型曲线,图像如下:

优点:

Sigmoid函数的输出在(0,1)之间,输出范围有限,优化稳定,可以用作输出层。连续函数,便于求导。

缺点:

sigmoid函数在变量取绝对值非常大的正值或负值时会出现饱和现象,意味着函数会变得很平,并且对输入的微小改变会变得不敏感。在反向传播时,当梯度接近于0,权重基本不会更新,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练。

sigmoid函数的输出不是0均值的,会导致后层的神经元的输入是非0均值的信号,这会对梯度产生影响。

计算复杂度高,因为sigmoid函数是指数形式。

(2) Tanh函数

Tanh函数也称为双曲正切函数,取值范围为[-1,1]。

Tanh函数定义如下:

tanh ⁡ ( x ) = e x − e − x e x + e − x \tanh\left(x\right) = \frac{e^x-e^{-x}}{e^x+e^{-x}} tanh(x)=ex+e−xex−e−x​

函数图像如下:

实际上,Tanh函数是 sigmoid 的变形:

tanh ⁡ ( x ) = 2 σ ( x ) − 1 \tanh\left(x\right) = 2\sigma(x)-1 tanh(x)=2σ(x)−1

Tanh函数是 0 均值的,因此实际应用中 Tanh 会比 sigmoid 更好。但是仍然存在梯度饱和与exp计算的问题。

(3) ReLU函数

整流线性单元(Rectified linear unit,ReLU)是现代神经网络中最常用的激活函数,大多数前馈神经网络默认使用的激活函数。

ReLU函数定义如下:

f ( x ) = m a x ( 0 , x ) f(x)=max(0,x) f(x)=max(0,x)

函数图像如下:

优点:

使用ReLU的SGD算法的收敛速度比 sigmoid 和 tanh 快。在x>0区域上,不会出现梯度饱和、梯度消失的问题。计算复杂度低,不需要进行指数运算,只要一个阈值就可以得到激活值。

缺点:

ReLU的输出不是0均值的。Dead ReLU Problem(神经元坏死现象):ReLU在负数区域被kill的现象叫做dead relu。ReLU在训练的时很“脆弱”。在x<0时,梯度为0。这个神经元及之后的神经元梯度永远为0,不再对任何数据有所响应,导致相应参数永远不会被更新。

产生这种现象的两个原因:参数初始化问题;learning rate太高导致在训练过程中参数更新太大。

解决方法:采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。

(4) Leaky ReLU函数

渗漏整流线性单元(Leaky ReLU),为了解决dead ReLU现象。用一个类似0.01的小值来初始化神经元,从而使得ReLU在负数区域更偏向于激活而不是死掉。这里的斜率都是确定的。

leakyrelu激活函数是relu的衍变版本,主要就是为了解决relu输出为0的问题。如图所示,在输入小于0时,虽然输出值很小但是值不为0。

leakyrelu激活函数一个缺点就是它有些近似线性,导致在复杂分类中效果不好。

(5) PReLU

参数整流线性单元(Parametric Rectified linear unit,PReLU),用来解决ReLU带来的神经元坏死的问题。

公式:

f ( x ) = m a x ( α x , x ) f(x)=max(\alpha x,x) f(x)=max(αx,x)

其中不是固定的,是通过反向传播学习出来的。

(6) ELU

指数线性单元(ELU):具有relu的优势,没有Dead ReLU问题,输出均值接近0,实际上PReLU和Leaky ReLU都有这一优点。有负数饱和区域,从而对噪声有一些鲁棒性。可以看做是介于ReLU和Leaky ReLU之间的一个函数。当然,这个函数也需要计算exp,从而计算量上更大一些。

(7) Maxout

maxout是一个函数逼近器,对于一个标准的MLP网络来说,如果隐藏层的神经元足够多,那么理论上我们是可以逼近任意的函数的。类似的,对于maxout 网络也是一个函数逼近器。

Maxout隐藏层每个神经元的计算公式如下:

h i ( x ) = max ⁡ j ∈ [ 1 , k ] z i j h_i(x)=\max_{j\in [1,k]} z_ij hi​(x)=j∈[1,k]max​zi​j

上面的公式就是maxout隐藏层神经元i的计算公式。其中,k就是maxout层所需要的参数了,由我们人为设定大小。就像dropout一样,也有自己的参数p(每个神经元dropout概率),maxout的参数是k。公式中Z的计算公式为:

z i j = x T W . . i j + b i j z_ij=x^T W_..ij + b_ij zi​j=xTW.​.ij+bi​j

权重w是一个大小为(d,m,k)三维矩阵,b是一个大小为(m,k)的二维矩阵,这两个就是我们需要学习的参数。如果我们设定参数k=1,那么这个时候,网络就类似于以前我们所学普通的MLP网络。

Maxout是通过分段线性函数来拟合所有可能的凸函数来作为激活函数的,但是由于线性函数是可学习,所以实际上是可以学出来的激活函数。具体操作是对所有线性取最大,也就是把若干直线的交点作为分段的边界,然后每一段取最大。

优点:

Maxout的拟合能力非常强,可以拟合任意的凸函数。Maxout具有ReLU的所有优点,线性、不饱和性。不会出现神经元坏死的现象。

缺点:

增加了参数量。

关于maxout的讲解可以参看这篇文章Maxout网络学习。

(8) SELU

扩展型指数线性单元激活函数比较新,介绍它的论文包含长达 90 页的附录(包括定理和证明等)。当实际应用这个激活函数时,必须使用 lecun_normal 进行权重初始化。如果希望应用 dropout,则应当使用 AlphaDropout。

论文作者已经计算出了公式的两个值:α 和 λ,SELU示例图:

可以看到,它们的小数点后还有很多位,这是为了绝对精度。而且它们是预先确定的,也就是说我们不必担心如何为这个激活函数选取合适的 α 值。

说实话,这个公式看起来和其它公式或多或少有些类似。所有新的激活函数看起来就像是其它已有的激活函数的组合。

也就是说,如果输入值 x 大于 0,则输出值为 x 乘以 λ;如果输入值 x 小于 0,则会得到一个奇异函数——它随 x 增大而增大并趋近于 x 为 0 时的值 0.0848。本质上看,当 x 小于 0 时,先用 α 乘以 x 值的指数,再减去 α,然后乘以 λ 值。

SELU 激活能够对神经网络进行自归一化(self-normalizing)。这是什么意思?

首先,我们先看看什么是归一化(normalization)。简单来说,归一化首先是减去均值,然后除以标准差。因此,经过归一化之后,网络的组件(权重、偏置和激活)的均值为 0,标准差为 1。而这正是 SELU 激活函数的输出值。

均值为 0 且标准差为 1 又如何呢?在初始化函数为 lecun_normal 的假设下,网络参数会被初始化一个正态分布(或高斯分布),然后在 SELU 的情况下,网络会在论文中描述的范围内完全地归一化。本质上看,当乘或加这样的网络分量时,网络仍被视为符合高斯分布。我们就称之为归一化。反过来,这又意味着整个网络及其最后一层的输出也是归一化的。

下面引述一段论文的解释,说明了他们得到这个激活函数的方式,我认为这很重要:

SELU 允许构建一个映射 g,其性质能够实现 SNN(自归一化神经网络)。SNN 不能通过(扩展型)修正线性单元(ReLU)、sigmoid 单元、tanh 单元和 Leaky ReLU 实现。这个激活函数需要有:(1)负值和正值,以便控制均值;(2)饱和区域(导数趋近于零),以便抑制更低层中较大的方差;(3)大于 1 的斜率,以便在更低层中的方差过小时增大方差;(4)连续曲线。后者能确保一个固定点,其中方差抑制可通过方差增大来获得均衡。我们能通过乘上指数线性单元(ELU)来满足激活函数的这些性质,而且 λ>1 能够确保正值净输入的斜率大于 1。

优点:

内部归一化的速度比外部归一化快,这意味着网络能更快收敛;不可能出现梯度消失或爆炸问题,见 SELU 论文附录的定理 2 和 3。

缺点:

这个激活函数相对较新——需要更多论文比较性地探索其在 CNN 和 RNN 等架构中应用。

关于selu函数的更多介绍可以参考:概览激活函数。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。