淘先锋技术网

首页 1 2 3 4 5 6 7

概述

“激活函数”能分成两类——“饱和激活函数”和“非饱和激活函数”。
参考:
https://blog.csdn.net/tyhj_sf/article/details/79932893
中心化/零均值化 (Zero-centered)

饱和激活函数

Tanh

tanh读作Hyperbolic Tangent,它解决了Sigmoid函数的不是zero-centered输出问题,然而,梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在。

sigmoid

特点:
它能够把输入的连续实值变换为0和1之间的输出,特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1。

sigmoid函数曾经被使用的很多,不过近年来,用它的人越来越少了。主要是因为它固有的一些 缺点。

  1. 在深度神经网络中梯度反向传递时导致梯度爆炸和梯度消失,其中梯度爆炸发生的概率非常小,而梯度消失发生的概率比较大。
  2. Sigmoid 的 output 不是0均值(即zero-centered)。这是不可取的,因为这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。 产生的一个结果就是:如果数据进入神经元的时候是正的(e.g. elementwise in ),那么计算出的梯度也会始终都是正的。 当然了,如果按batch去训练,那么那个batch可能得到不同的信号,所以这个问题还是可以缓解一下的。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的梯度消失问题相比还是要好很多的。
  3. 其解析式中含有幂运算,计算机求解时相对来讲比较耗时。对于规模比较大的深度网络,这会较大地增加训练时间。其解析式中含有幂运算,计算机求解时相对来讲比较耗时。对于规模比较大的深度网络,这会较大地增加训练时间。

Softmax

公式:
S i = e V i ∑ i C e V i S_i=\frac{e^{V_i}}{\sum_i^Ce^{V_i}} Si=iCeVieVi
参考:
https://blog.csdn.net/red_stone1/article/details/80687921
Softmax 激活函数。一般用作最后的结果输出。其输出的结果为不同情况的概率
输入尺寸
可以是任意的。如果将这一层作为模型的第一层, 则需要指定 input_shape 参数 (整数元组,不包含样本数量的维度)。
输出尺寸
与输入相同。
参数
axis: 整数,应用 softmax 标准化的轴。

非饱和激活函数

sigmoid和tanh是“饱和激活函数”,而ReLU及其变体则是“非饱和激活函数”。使用“非饱和激活函数”的优势在于两点:
1.首先,“非饱和激活函数”能解决所谓的“梯度消失”问题。
2.其次,它能加快收敛速度。
Sigmoid函数需要一个实值输入压缩至[0,1]的范围
σ(x) = 1 / (1 + exp(−x))
tanh函数需要讲一个实值输入压缩至 [-1, 1]的范围
tanh(x) = 2σ(2x) − 1

ReLU

在这里插入图片描述

ReLU 激活函数。一般用作激活用,
ReLU函数其实就是一个取最大值函数,注意这并不是全区间可导的,但是我们可以取sub-gradient,如上图所示。ReLU虽然简单,但却是近几年的重要成果,有以下几大优点:

  1. 解决了gradient vanishing问题 (在正区间)
  2. 计算速度非常快,只需要判断输入是否大于0
  3. 收敛速度远快于sigmoid和tanh
    ReLU也有几个需要特别注意的问题:
  4. ReLU的输出不是zero-centered
  5. Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 (2) learning rate(学习率)太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。
    尽管存在这两个问题,ReLU目前仍是最常用的activation function,在搭建人工神经网络的时候推荐优先尝试!
    输入尺寸
    可以是任意的。如果将这一层作为模型的第一层, 则需要指定 input_shape 参数 (整数元组,不包含样本数量的维度)。
    输出尺寸
    与输入相同。
    参数
    max_value: 浮点数,最大的输出值。

LeakyReLU和PReLU

keras.layers.LeakyReLU(alpha=0.3)
keras.layers.PReLU(alpha_initializer='zeros', alpha_regularizer=None, alpha_constraint=None, shared_axes=None)

带泄漏的修正线性单元。
在这里插入图片描述

当神经元未激活时,它仍可以赋予其一个很小的梯度:
f ( x ) = m a x ( α x , x ) f(x)=max(\alpha x,x) f(x)=max(αx,x)
人们为了解决Dead ReLU Problem,提出了将ReLU的前半段设为 α x \alpha x αx而非0,通常 α = 0.01 \alpha=0.01 α=0.01。另外一种直观的想法是基于参数的方法,即 P a r a m e t r i c R e L U : f ( x ) = max ⁡ ( α x , x ) Parametric ReLU:f(x) = \max(\alpha x, x) ParametricReLU:f(x)=max(αx,x),其中α可由方向传播算法学出来。理论上来讲,Leaky ReLU有ReLU的所有优点,外加不会有Dead ReLU问题,但是在实际操作当中,并没有完全证明Leaky ReLU总是好于ReLU。
输入尺寸
可以是任意的。如果将该层作为模型的第一层, 则需要指定 input_shape 参数 (整数元组,不包含样本数量的维度)。
输出尺寸
与输入相同。
参数
alpha: float >= 0。负斜率系数。

PReLU

参数化的修正线性单元。
形式: f ( x ) = α ∗ x , f o r x &lt; 0 f(x)=\alpha * x ,for x &lt; 0 f(x)=αx,forx<0, f(x) = x for x >= 0, 其中 α \alpha α 是一个可学习的数组,尺寸与 x x x 相同。
输入尺寸
可以是任意的。如果将这一层作为模型的第一层, 则需要指定 input_shape 参数 (整数元组,不包含样本数量的维度)。
输出尺寸
与输入相同。
参数
alpha_initializer: 权重的初始化函数。
alpha_regularizer: 权重的正则化方法。
alpha_constraint: 权重的约束。
shared_axes: 激活函数共享可学习参数的轴。 例如,如果输入特征图来自输出形状为 (batch, height, width, channels) 的 2D 卷积层,而且你希望跨空间共享参数,以便每个滤波器只有一组参数, 可设置 shared_axes=[1, 2]。

ELU

指数线性单元。
表达式:
f ( x ) = { x , if  x &gt; 0 α ( e x − 1 ) , otherwise f(x)= \begin{cases}x,&amp; \text{if } x &gt; 0\\ \alpha(e^x - 1), &amp; \text{otherwise} \end{cases} f(x)={x,α(ex1),if x>0otherwise
在这里插入图片描述
ELU也是为解决ReLU存在的问题而提出,显然,ELU有ReLU的基本所有优点,以及:
不会有Dead ReLU问题
输出的均值接近0,zero-centered

  1. 不会有Dead ReLU问题
  2. 输出的均值接近0,zero-centered
    它的一个小问题在于计算量稍大。类似于Leaky ReLU,理论上虽然好于ReLU,但在实际使用中目前并没有好的证据ELU总是优于ReLU。

输出尺寸
与输入相同。
参数
alpha: 负因子的尺度。

ThresholdedReLU

带阈值的修正线性单元。
形式: f(x) = x for x > theta, f(x) = 0 otherwise.
f ( x ) = { x , if  x &gt; θ 0 , otherwise f(x)= \begin{cases}x,&amp; \text{if } x &gt; θ\\ 0, &amp; \text{otherwise} \end{cases} f(x)={x,0,if x>θotherwise
输入尺寸
可以是任意的。如果将这一层作为模型的第一层, 则需要指定 input_shape 参数 (整数元组,不包含样本数量的维度)。
输出尺寸
与输入相同。
参数
theta: float >= 0。激活的阈值位。