激活函数的意义与选择

激活函数的意义与选择

激活函数的定义

首先,什么是激活函数(activation functions),维基百科上给出的定义是这样的:
激活函数的定义
激活函数即为:对给定输入或输入集定义了相关输出的函数(一个计算机芯片回路即可视为一个激活函数,有on和off两种状态)

一个更为具体的定义给出了其其在神经网络中的一般形式:
一般形式
可以看出,激活函数以 一个节点对给定输入做出相应操作之后的输出 为 输入,决定这个输入是否加入到下一层的网络中。
但是这个时候我们会很自然的想到,为什么要使用激活函数呢?既然节点已经计算出了相应的输出?何必又加一次计算呢?

为什么要使用激活函数?

最直观的回答是,如果不使用激活函数,神经网络的学习效果会很差,甚至学不到东西。原因就在于,不使用激活函数,权重和偏差就只会进行线性变换。线性方程很简单,但是解决复杂问题的能力非常有限。没有激活函数的神经网络实质上只是一个线性回归模型。激活函数对输入进行非线性变换,使其能够学习和执行更复杂的任务。
这样的表述仍然较为抽象,让我们用几个例子来建立一个更加直观的印象

激活函数应用举例

example #1 线性不可分

在处理最简单的分类问题时,比如如下:
线性可分
这是一个最简单的线性可分的分类问题,我们可以很直观的用一个直线解决掉,但是有时候,问题就不是那么简单了,比如下面这个:
线性不可分
这就是一组线性不可分的问题,这可咋办呢?
有同学数学能力比较强,说我可以做一个线性变化,比如把x,y变成x^2, y^2,就变成了下面这个样子
线性变化
于是它又变成了一个可分的问题
但是,我们可不可以直接用一个非线性的函数来区分他们呢?
答案当然是可以的,而且这就是我们的激活函数派上用场的地方

example #2 异或

这个例子来自于上面例子的具体化,即:依据异或的运算规则,对给定的输入给出正确的输出,真值表如下所示
异或
图画出来大概是这样子的
异或
这也是一组线性不可分的数据,但我们可以通过设计一个神经网络,通过激活函数使其变成可分的。
这里我们选择阀值函数(threshold function)作为激活函数,也就是大于某个值输出1(被激活了),小于等于则输出0(没有激活)。这就是一个非线性函数。
神经网络结构如下:
神经网络结构
其中直线上的数字为权重。圆圈中的数字为阀值。第二层,如果输入大于1.5则输出1,否则0;第三层,如果输入大于0.5,则输出1,否则0。
首先,第一层到第二层:
layer #1
第二成到第三层
layer #2
可以看到第三层输出就是我们所要的xor的答案。
这样,我们就把一个线性不可分的问题,通过激活函数,转化成了一个线性可分的问题。
但是进行到这里,不知道大家有没有这样的感受,就是虽然这个激活函数看起来很厉害,但是似乎整个这个问题的解决需要非常trick的手段,比如这个激活函数的选择,对应激活函数的参数选择(比如这个阈值函数的两个参数1.5和0.5),然后还有对应神经网络的weight,似乎需要三个方面都对应的严丝合缝才能达到这个效果,那对应一般问题上,有没有一个普适的选择激活函数及其参数的方法呢?一共都有哪些激活函数可供选择呢?

激活函数的选择

激活函数分类

激活函数根据是否收敛有以下的几种分类方法。
通俗地讲,饱和的激活函数,就是其导数为0,定义如下:
当一个激活函数h(x)满足:
右饱和
时称为右饱和,同样的,当激活函数满足下面的式子称为左饱和
左饱和
当一个激活函数,既满足左饱和又满足又饱和时,我们称之为饱和。
根据在何处饱和,饱和又分为硬饱和和软饱和。对任意的x如果存在常数c,使得x>c时恒有 h′(x)=0则称其为右硬饱和,当x<c时恒有h′(x)=0则称其为左硬饱和。若既满足左硬饱和,又满足右硬饱和,则称这种激活函数为硬饱和。但如果只有在极限状态下偏导数等于0的函数,称之为软饱和。

常用激活函数

sigmoid


sigmoid及其梯度(红色曲线为梯度)

优点
  1. Sigmoid函数的输出映射在(0,1)之间单调连续,输出范围有限,优化稳定,可以用作输出层
  2. 求导简单
缺点
  1. 由于其软饱和性,容易产生梯度消失,导致训练出现问题
  2. 其输出并不是以0为中心的,会导致zigzag现象(??)
tanh

大家是不是发现它和sigmoid非常像?确实是这样的,tanh对sigmoid的输出改到了[-1, 1]之间,这样输出就是和0对称的了,同时我们可以看到,它的梯度,会有一个较sigmoid更大的峰值(x = 0时,为1),但是下降很快,还是会出现梯度消失的问题

RELU(家族老首领)

RELU
ReLU及其梯度(红色折线为梯度)
RELU是现在CNN经常使用的一种激励函数,它处理了sigmoid、tanh中常见的梯度消失问题,同时也是计算梯度最快的激励函数。

优点
  1. 相较于Sigmoid和tanh在SGD下收敛更快(线性非饱和)
  2. Sigmoid和tanh涉及了很多开销很大的操作(比如指数),ReLU可以更加简单的实现
  3. 有效缓解了梯度消失的问题
  4. 在没有无监督预训练的时候也能有较好的表现
  5. 提供了神经网络的稀疏表达能力
缺点

随着训练的进行,可能会出现神经元死亡(为0),权重无法更新的情况。如果发生这种情况,那么流经神经元的梯度从这一点开始将永远是0。也就是说,ReLU神经元在训练中不可逆地死亡了。

Leaky-ReLU(家族少壮派)

leaky-ReLU
这里就是为了解决ReLU中神经元死亡的问题,当x < 0时,取一个a值(比如0.01)让它不至于完全死亡,但是这个a值必须经过重复训练,不断尝试后谨慎地选取,它表现出的结果才比ReLU好。

PReLU (家族技术派)

这里PReLU的函数形式和Leaky-ReLU一致,只不过这里的a值是自适应地从数据中学习得出的

Maxout(家族统一派)

Maxout
简单来说就是取线性组合的最大值。
Maxout 具有 ReLU 的优点(计算简单,不会饱和),同时又没有 ReLU 的一些缺点 (比如容易死掉),同时增加了参数量。

类似的激活函数还有很多,这里就不一一列举了,在维基百科(https://en.wikipedia.org/wiki/Activation_function)上,列出了全部29种激活函数,供大家参考

如何选择合适的激活函数

这个时候我们迎来了我们的终极问题,这么多激活函数,到底该怎么选呢?
通过网上搜索,加上几次初步尝试,总结几条小规律:

  1. 用于分类器时,Sigmoid函数及其组合通常效果更好(但基本上很少使用sigmoid了)
  2. 如果发现运行较慢,结果较差,可能是sigmoid或者tanh出现了梯度消失问题。
  3. ReLU函数是一个通用的激活函数,目前在大多数情况下使用。(但ReLU只在隐藏层中使用)
  4. 如果神经网络中出现死神经元,那么PReLU函数就是最好的选择。

具体地,可以从ReLU函数开始,如果ReLU函数没有提供最优结果,再尝试其他激活函数。

最后放一个文章地址,里面总结了一些神经网络中常用到的一些小技巧,包括激活函数的选择(https://www.tuicool.com/articles/Z7VVre2)

参考:

https://blog.csdn.net/edogawachia/article/details/80043673
https://www.jianshu.com/p/71819140ca11
https://blog.csdn.net/edogawachia/article/details/80043673
https://zhuanlan.zhihu.com/p/30510596

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值