神经网络中使用激活函数来加入非线性因素,提高模型的表达能力。

ReLU(Rectified Linear Unit,修正线性单元)

形式如下:

ReLU公式近似推导::

下面解释上述公式中的softplus,Noisy ReLU.

softplus函数与ReLU函数接近,但比较平滑, 同ReLU一样是单边抑制,有宽广的接受域(0,+inf), 但是由于指数运算,对数运算计算量大的原因,而不太被人使用.并且从一些人的使用经验来看(Glorot et al.(2011a)),效果也并不比ReLU好.
softplus的导数恰好是sigmoid函数.softplus 函数图像:

Noisy ReLU1
ReLU可以被扩展以包括高斯噪声(Gaussian noise):
f(x)=max(0,x+Y),Y∼N(0,σ(x))f(x)=max(0,x+Y),Y∼N(0,σ(x))
Noisy ReLU 在受限玻尔兹曼机解决计算机视觉任务中得到应用.

ReLU上界设置: ReLU相比sigmoid和tanh的一个缺点是没有对上界设限.在实际使用中,可以设置一个上限,如ReLU6经验函数: f(x)=min(6,max(0,x))f(x)=min(6,max(0,x)). 参考这个上限的来源论文: Convolutional Deep Belief Networks on CIFAR-10. A. Krizhevsky

ReLU的稀疏性(摘自这里):

当前,深度学习一个明确的目标是从数据变量中解离出关键因子。原始数据(以自然数据为主)中通常缠绕着高度密集的特征。然而,如果能够解开特征间缠绕的复杂关系,转换为稀疏特征,那么特征就有了鲁棒性(去掉了无关的噪声)。稀疏特征并不需要网络具有很强的处理线性不可分机制。那么在深度网络中,对非线性的依赖程度就可以缩一缩。一旦神经元与神经元之间改为线性激活,网络的非线性部分仅仅来自于神经元部分选择性激活。
对比大脑工作的95%稀疏性来看,现有的计算神经网络和生物神经网络还是有很大差距的。庆幸的是,ReLu只有负值才会被稀疏掉,即引入的稀疏性是可以训练调节的,是动态变化的。只要进行梯度训练,网络可以向误差减少的方向,自动调控稀疏比率,保证激活链上存在着合理数量的非零值。

ReLU 缺点

  • 坏死: ReLU 强制的稀疏处理会减少模型的有效容量(即特征屏蔽太多,导致模型无法学习到有效特征)。由于ReLU在x < 0时梯度为0,这样就导致负的梯度在这个ReLU被置零,而且这个神经元有可能再也不会被任何数据激活,称为神经元“坏死”。
  • 无负值: ReLU和sigmoid的一个相同点是结果是正值,没有负值.

ReLU变种

Leaky ReLU

当x<0x<0时,f(x)=αxf(x)=αx,其中αα非常小,这样可以避免在x<0x<0时,不能够学习的情况:

称为Parametric Rectifier(PReLU),将 αα 作为可学习的参数.

当 αα 从高斯分布中随机产生时称为Random Rectifier(RReLU)。

当固定为α=0.01α=0.01时,是Leaky ReLU

优点:

  • 不会过拟合(saturate)
  • 计算简单有效
  • 比sigmoid/tanh收敛快

指数线性单元ELU

exponential linear unit, 该激活函数由Djork等人提出,被证实有较高的噪声鲁棒性,同时能够使得使得神经元
的平均激活均值趋近为 0,同时对噪声更具有鲁棒性。由于需要计算指数,计算量较大。
ReLU family:

Leaky ReLU αα是固定的;PReLU的αα不是固定的,通过训练得到;RReLU的αα是从一个高斯分布中随机产生,并且在测试时为固定值,与Noisy ReLU类似(但是区间正好相反)。

ReLU系列对比:

SELU

论文: 自归一化神经网络(Self-Normalizing Neural Networks)中提出只需要把激活函数换成SELU就能使得输入在经过一定层数之后变成固定的分布. 参考对这篇论文的讨论.

SELU是给ELU乘上系数 λλ, 即 SELU(x)=λ⋅ELU(x)

Swish

paper Searching for Activation functions(Prajit Ramachandran,Google Brain 2017)

β是个常数或可训练的参数.Swish 具备无上界有下界、平滑、非单调的特性。
Swish 在深层模型上的效果优于 ReLU。例如,仅仅使用 Swish 单元替换 ReLU 就能把 Mobile NASNetA 在 ImageNet 上的 top-1 分类准确率提高 0.9%,Inception-ResNet-v 的分类准确率提高 0.6%。

导数:

当β = 0时,Swish变为线性函数f(x)=x2f(x)=x2.
β → ∞, σ(x)=(1+exp(−x))−1σ(x)=(1+exp⁡(−x))−1为0或1. Swish变为ReLU: f(x)=2max(0,x)
所以Swish函数可以看做是介于线性函数与ReLU函数之间的平滑函数.

工程实现:
在TensorFlow框架中只需一行代码: x * tf.sigmoid(beta * x)tf.nn.swish(x).
在Caffe中使用Scale+Sigmoid+EltWise(PROD)来实现或者合并成一个层.代码参考.

Maxout

论文Maxout Networks(Goodfellow,ICML2013)

Maxout可以看做是在深度学习网络中加入一层激活函数层,包含一个参数k.这一层相比ReLU,sigmoid等,其特殊之处在于增加了k个神经元,然后输出激活值最大的值.

我们常见的隐含层节点输出:

而在Maxout网络中,其隐含层节点的输出表达式为:

其中

以如下最简单的多层感知器(MLP)为例:

图片来源:slides

maxout-networks-4-1024

假设网络第i层有2个神经元x1、x2,第i+1层的神经元个数为1个.原本只有一层参数,将ReLU或sigmoid等激活函数替换掉,引入Maxout,将变成两层参数,参数个数增为k倍.

优点:

  • Maxout的拟合能力非常强,可以拟合任意的凸函数。
  • Maxout具有ReLU的所有优点,线性、不饱和性。
  • 同时没有ReLU的一些缺点。如:神经元的死亡。

缺点:
从上面的激活函数公式中可以看出,每个神经元中有两组(w,b)参数,那么参数量就增加了一倍,这就导致了整体参数的数量激增。

Maxout激活函数

与常规激活函数不同的是,它是一个可学习的分段线性函数.

然而任何一个凸函数,都可以由线性分段函数进行逼近近似。其实我们可以把以前所学到的激活函数:ReLU、abs激活函数,看成是分成两段的线性函数,如下示意图所示:

maxout-convex-func-approximate!

实验结果表明Maxout与Dropout组合使用可以发挥比较好的效果。

那么,前边的两种ReLU便是两种Maxout,函数图像为两条直线的拼接,

sigmoid & tanh

sigmoid/logistic 激活函数:

tanh 函数是sigmoid函数的一种变体,以0点为中心。取值范围为 [-1,1] ,而不是sigmoid函数的 [0,1] 。

tanh 是对 sigmoid 的平移和收缩: tanh(x)=2⋅σ(2x)−1tanh⁡(x)=2⋅σ(2x)−1.
你可能会想平移使得曲线以0点为中心,那么为什么还要收缩呢? 如果不拉伸或收缩得到 f(x)=ex−1ex+1f(x)=ex−1ex+1 不行吗? 我猜想是因为 tanh 更加著名吧。

那么 tanh 这个双曲正切函数与三角函数 tan 之间是什么关系呢?

hard tanh 限界: g(z) = max(-1, min(1,z))

sigmoid & tanh 函数图像如下:

sigmoid作激活函数的优缺点

历史上很流行(Historically popular since they have nice interpretation as a saturating “firing rate” of a neuron),梯度计算较为方便:

优势是能够控制数值的幅度,在深层网络中可以保持数据幅度不会出现大的变化;而ReLU不会对数据的幅度做约束.

存在三个问题:

  1. 饱和的神经元会"杀死"梯度,指离中心点较远的x处的导数接近于0,停止反向传播的学习过程.
  2. sigmoid的输出不是以0为中心,而是0.5,这样在求权重w的梯度时,梯度总是正或负的.
  3. 指数计算耗时

为什么tanh相比sigmoid收敛更快:

  1. 梯度消失问题程度

    可以看出tanh(x)的梯度消失问题比sigmoid要轻.梯度如果过早消失,收敛速度较慢.
  2. 以零为中心的影响
    如果当前参数(w0,w1)的最佳优化方向是(+d0, -d1),则根据反向传播计算公式,我们希望 x0 和 x1 符号相反。但是如果上一级神经元采用 Sigmoid 函数作为激活函数,sigmoid不以0为中心,输出值恒为正,那么我们无法进行最快的参数更新,而是走 Z 字形逼近最优解。4

激活函数的作用

  1. 加入非线性因素
  2. 充分组合特征

下面说明一下为什么有组合特征的作用.

一般函数都可以通过泰勒展开式来近似计算, 如sigmoid激活函数中的指数项可以通过如下的泰勒展开来近似计算:

其中有平方项,立方项及更更高项, 而 z=wx+bz=wx+b, 因此可以看作是输入特征 x 的组合. 以前需要由领域专家知识进行特征组合,现在激活函数能起到一种类似特征组合的作用. (思想来源: 微博@算法组)

为什么ReLU,Maxout等能够提供网络的非线性建模能力?它们看起来是分段线性函数,然而并不满足完整的线性要求:加法f(x+y)=f(x)+f(y)和乘法f(ax)=a×f(x)或者写作。非线性意味着得到的输出不可能由输入的线性组合重新得到(重现)。假如网络中不使用非线性激活函数,那么这个网络可以被一个单层感知器代替得到相同的输出,因为线性层加起来后还是线性的,可以被另一个线性函数替代。

梯度消失与梯度爆炸

梯度消失/爆炸原因及解决办法

原因,浅层的梯度计算需要后面各层的权重及激活函数导数的乘积,因此可能出现前层比后层的学习率小(vanishing gradient)或大(exploding)的问题,所以具有不稳定性.那么如何解决呢?

需要考虑几个方面:

  • 权重初始化
    使用合适的方式初始化权重, 如ReLU使用MSRA的初始化方式, tanh使用xavier初始化方式.
  • 激活函数选择
    激活函数要选择ReLU等梯度累乘稳定的.
  • 学习率
    一种训练优化方式是对输入做白化操作(包括正规化和去相关), 目的是可以选择更大的学习率. 现代深度学习网络中常使用Batch Normalization(包括正规化步骤,但不含去相关). (All you need is a good init. If you can't find the good init, use Batch Normalization.)

由于梯度的公式包含每层激励的导数以及权重的乘积,因此让中间层的乘积约等于1即可.但是sigmoid这种函数的导数值又与权重有关系(最大值1/4,两边对称下降),所以含有sigmoid的神经网络不容易解决,输出层的activation大部分饱和,因此不建议使用sigmoid.
ReLU在自变量大于0时导数为1,小于0时导数为0,因此可以解决上述问题.

梯度爆炸
由于sigmoid,ReLU等函数的梯度都在[0,1]以内,所以不会引发梯度爆炸问题。 而梯度爆炸需要采用梯度裁剪、BN、设置较小学习率等方式解决。

激活函数选择

  1. 首先尝试ReLU,速度快,但要注意训练的状态.
  2. 如果ReLU效果欠佳,尝试Leaky ReLU或Maxout等变种。
  3. 尝试tanh正切函数(以零点为中心,零点处梯度为1)
  4. sigmoid/tanh在RNN(LSTM、注意力机制等)结构中有所应用,作为门控或者概率值.
  5. 在浅层神经网络中,如不超过4层的,可选择使用多种激励函数,没有太大的影响。

激活函数详解(ReLU/Leaky ReLU/ELU/SELU/Swish/Maxout/Sigmoid/tanh)相关推荐

  1. 激活函数总结sigmoid,tanh,relu,Leaky ReLU,RRelu,ELU,PRelu,SELU,swish

    本文总结深度学习的损失函数及其优缺点. 激活函数是深度学习模型的重要成分,目的是将线性输入转换为非线性.常见的激活函数有sigmoid,tanh,ReLU等 1.sigmoid Sigmoid 非线性 ...

  2. R语言使用自定义函数编写深度学习Leaky ReLU激活函数、并可视化Leaky ReLU激活函数

    R语言使用自定义函数编写深度学习Leaky ReLU激活函数.并可视化Leaky ReLU激活函数 目录

  3. 花书+吴恩达深度学习(二)非线性激活函数(ReLU, maxout, sigmoid, tanh)

    目录 0. 前言 1. ReLU 整流线性单元 2. 绝对值整流线性单元 3. 渗漏整流线性单元 4. 参数化整流线性单元 5. maxout 单元 6. logistic sigmoid 单元 7. ...

  4. 【卷积神经网络】12、激活函数 | Tanh / Sigmoid / ReLU / Leaky ReLU / ELU / SiLU / Mish

    文章目录 一.Tanh 二.Sigmoid 三.ReLU 四.Leaky ReLU 五.ELU 六.SiLU 七.Mish 本文主要介绍卷积神经网络中常用的激活函数及其各自的优缺点 最简单的激活函数被 ...

  5. 深度学习中的一些常见的激活函数集合(含公式与导数的推导)sigmoid, relu, leaky relu, elu, numpy实现

    文章目录 Sigmoid(x) 双曲正切 线性整流函数 rectified linear unit (ReLu) PReLU(Parametric Rectified Linear Unit) Lea ...

  6. [Pytorch 常用函数] 激活函数Relu, Leaky Relu

    修正线性单元(Rectified linear unit,ReLU)是神经网络中最常用的激活函数.它保留了 step 函数的生物学启发(只有输入超出阈值时神经元才激活),不过当输入为正的时候,导数不为 ...

  7. 【深度学习】激活函数:原理+常见激活函数(Sigmoid\Tanh\ReLU\Leaky ReLU\Softmax)

    首先需要知道为什么要引入激活函数:激活函数是用来加入非线性因素的,因为线性模型的表达能力不够.引入非线性激活函数,可使深层神经网络的表达能力更加强大. 在深度学习中,线性模型只需要简单的全连接层就能实 ...

  8. 深度学习中常用的激活函数详解及对比分析(sigmoid)

    Sigmoid函数: 特性: 1.当变量值远离中心轴时,梯度几乎为0,在神经网络的反向传播过程中,链式求导导致经过sigmoid函数之后的梯度 很小,权重值更新较慢 2.计算机执行指数运算较慢 3.s ...

  9. CNN 基本部件-常用激活函数详解

    背景知识 反向传播算法 梯度消失与梯度爆炸 激活函数的作用 七种常用激活函数 Sigmoid型函数 tanh(x)型函数 修正线性单元(ReLU) Leaky ReLU 参数化 ReLU 总结 参考资 ...

最新文章

  1. python include函数_python 库函数
  2. intel服务器ssd系列,英特尔发布S3710/S3610服务器SSD新品
  3. Cloudstreams: 云间整合的下一个挑战
  4. pdo_mysql未安装_php pdo_mysql未安装问题解决方法
  5. java url压缩_URL短地址压缩算法 微博短地址原理解析 (Java实现)
  6. cesium 原生抛物线
  7. Kotlin的魔能机甲——KtArmor插件篇(二)
  8. linux ubuntu 11.10 下的android开发环境的搭建!
  9. 计算机软件怎么装,电脑拷贝的软件怎么安装
  10. MySQL--备份还原常用命令
  11. 知乎APP产品结构分析
  12. bilibili level up
  13. 食堂自助点餐系统NABCD
  14. 深度信念网络DBN的一个matlab实例
  15. Python让Excel飞起来—模块
  16. Java高级开发面试题整理
  17. C++中 char* 、string、 char、char[]在各种情况下的输入与输出
  18. 2016word排版小技巧
  19. 正准备换工作的你需要注意哪些面试细节
  20. Imagenomic Portraiture 2.3 Key

热门文章

  1. 04.RPA uipath stadio 使用教程【分支与循环】
  2. 用户态TCP协议栈的调研
  3. thrift如何定义Java中的object类型
  4. Python数据分析之单变量分析
  5. Android 汉语转拼音
  6. Allegro_根据已有BRD绘制新的BRD那些事
  7. 物流一站式查询之快递100篇
  8. 关于android app启动页白屏黑屏和华为手机启动页图片跳跃闪屏的问题
  9. ios和安卓兼容问题(font-weight,new Date)
  10. 将博客迁移到了 Cloudflare Pages