前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[MachineLearning] 激活函数Activation Function

[MachineLearning] 激活函数Activation Function

作者头像
wOw
发布2018-09-18 14:57:57
9850
发布2018-09-18 14:57:57
举报
为什么需要激活函数

神经网络中激活函数的主要作用是提供网络的非线性建模能力,如不特别说明,激活函数一般而言是非线性函数。假设一个示例神经网络中仅包含线性卷积和全连接运算,那么该网络仅能够表达线性映射,即便增加网络的深度也依旧还是线性映射,难以有效建模实际环境中非线性分布的数据。加入(非线性)激活函数之后,深度神经网络才具备了分层的非线性映射学习能力。因此,激活函数是深度神经网络中不可或缺的部分。

理想的激活函数是阶跃函数,把输入数据映射为激活(1)和抑制(0)。但阶跃函数的问题是不连续不光滑。这个问题主要反映在计算梯度(求偏导)的过程中。

激活函数常用上图右边的Sigmoid函数。它可以把输入值挤压到(0,1)的范围中。

从Sigmoid能看出一些激活函数的特点,同时还有一些其他特点:

  • 非线性:当激活函数是线性的时候,一个两层的神经网络就可以逼近基本上所有的函数了。但是,如果激活函数是恒等激活函数的时候(即$f(x) = x$ ),就不满足这个性质了,而且如果MLP使用的是恒等激活函数,那么其实整个网络跟单层神经网络是等价的。
  • 可微性:当优化方法是基于梯度的时候,这个性质是必须的。
  • 单调性: 当激活函数是单调的时候,单层网络能够保证是凸函数。
  • $f(x) \approx x$:当激活函数满足这个性质的时候,如果参数的初始化是random的很小的值,那么神经网络的训练将会很高效;如果不满足这个性质,那么就需要很用心的去设置初始值。
  • 输出值的范围: 当激活函数输出值是 有限 的时候,基于梯度的优化方法会更加 稳定,因为特征的表示受有限权值的影响更显著;当激活函数的输出是 无限 的时候,模型的训练会更加高效,不过在这种情况小,一般需要更小的learning rate.
激活函数
Sigmoid

最常见的激活函数。

Sigmoid在定义域内处处可导,两侧的倒数逐渐趋近于0,即:$\displaystyle \lim_{x \to \infty}f’(x)=0$.(也称作软饱和激活函数)

Sigmoid导数:

优点:

  • 物理意义上最接近神经元
  • (0,1)的输出可以表示作概率
  • 用于输入的归一化

缺点:

  • 函数不是0均值,而是以(0, 0.5)为中心。这会导致后一层神经元将得到上一层输出的非0均值的信号作为输入。所以数据进入神经元是正的,w计算出的梯度也始终是正的。用batch去训练可以得到不同信号,可以缓解。
  • 在后向传播过程中,sigmoid向下传导的梯度包含了 $f’(x)$ 因子,因此一旦输入落入饱和区,$f’(x)$ 就接近于0,导致向底层传递的梯度变得非常小。这就是所谓的梯度消失。(在反向传播中,会计算每一层的梯度,链式法则相乘。)

一般来说,sigmoid网络在5层之内就产生梯度消失。(sigmoid导数的最大值是0.25,意味着导数每一层至少压缩到原来的1/4,经过5层就非常小了。) 优化办法:后续会发出来介绍

  • DBN的预训练
  • Batch Normalization逐层归一化
  • Xavier和MSRA权重初始化

代表:sigmoid交叉熵损失函数

tanh

tanh实际上是sigmoid的变形:

tanh(x) = 2sigmoid(2x) - 1

tanh也有软饱和性,所以也有梯度消失的问题。

由于tanh的输出均值比sigmoid更接近0,SGD会更接近natural gradient,从而降低所需的迭代次数,所以tanh收敛速度比sigmoid更快。

ReLU

ReLU的导数:

虽然2006年Hinton教授提出通过分层无监督预训练解决深层网络训练困难的问题(比如DBN?),但是深度网络的直接监督式训练的最终突破,最主要的原因是采用了新型激活函数ReLU

优点:

  • ReLU函数其实就是max(x, 0)函数,所以计算量比前两者小,计算速度也快。
  • ReLU 在x\<0 时硬饱和。由于="" x\="">0时导数为 1,所以,ReLU 能够在x>0时保持梯度不衰减,从而缓解梯度消失问题。
  • 在x<0时结果取0,提供神经网络的稀疏表达能力。(类似dropout缓解过拟合?不过实验验证,ReLU的稀疏性与网络性能之间并不存在绝对正负比关系。)
  • Relu激活函数可以极大地加快收敛速度,相比tanh函数,收敛速度可以加快6倍

缺点:

  • 随着训练推进,部分输入会落入硬饱和区,导致对应权重无法更新。这种现象被称为神经元死亡
  • 输出具有偏移现象,即输出均值恒大于0

本文作者公开在arxiv的文章中的实验表明,如果不采用Batch Normalization,即使用 MSRA 初始化30层以上的ReLU网络,最终也难以收敛。 关于神经元死亡: 比如计算出一个很大的梯度 $\nabla w $,反向传播后 $w - \nabla w$ 使得优化后的 $w$ 变成负数,接着正向传播这个神经元就不会对任何数据有激活现象了。实际操作中,如果你的learning rate 很大,那么很有可能你网络中的40%的神经元都”dead”了。 当然,如果你设置了一个合适的较小的learning rate,这个问题发生的情况其实也不会太频繁。

激活函数的选择

由于sigmoid可以看做概率,所以在输出层使用sigmoid比较多。

隐藏层中,ReLU的优秀的计算速度和收敛速度都让其成为一个首选。

ReLU还有很多其他变种,可以参考最后的链接阅读学习。

参考和阅读:

【机器学习】神经网络-激活函数-面面观(Activation Function) 激活函数导引 26种神经网络激活函数可视化

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-03-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么需要激活函数
  • 激活函数
    • Sigmoid
      • tanh
        • ReLU
        • 激活函数的选择
        • 参考和阅读:
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档