专栏首页wOw的Android小站[MachineLearning] 激活函数Activation Function

[MachineLearning] 激活函数Activation Function

为什么需要激活函数

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

理想的激活函数是阶跃函数,把输入数据映射为激活(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种神经网络激活函数可视化

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [MachineLearning][转载]LSTM

    转载自http://blog.csdn.net/jerr__y/article/details/58598296

    wOw
  • [Java] CountDownLatch 与 CyclicBarrier

    A synchronization aid that allows one or more threads to wait until a set of ope...

    wOw
  • [Objective-C] Block实现回调和简单的学习思考

    关于Objective-C的回调,最常见的应该是用delegate代理实现。不过代理的实现比起Block要更基础,就不介绍了,下面总结一下Block回调的实现。

    wOw
  • 【AI初识境】激活函数:从人工设计到自动搜索

    我们都知道人工神经网络是用于模拟神经元的,那么提起激活函数,自然是要从那里去挖掘原因。

    用户1508658
  • AI知识点(1)--激活函数

    激活函数是神经网络中非常重要的一个内容,神经网络是受到生物神经网络的启发,在生物神经网络中也存在着激活函数,而且激活函数决定了神经元之间是否要传递信号,而在人工...

    材ccc
  • 【DL碎片3】神经网络中的激活(Activation)函数及其对比

    从【DL笔记1】到【DL笔记N】以及【DL碎片】系列,是我学习深度学习一路上的点点滴滴的记录,是从Coursera网课、各大博客、论文的学习以及自己的实践中总结...

    beyondGuo
  • 起底软银千亿美元基金:“疯狂”加杠杆,这是孙正义的信心和贪婪

    李杉 问耕 编译整理 量子位 出品 | 公众号 QbitAI 孙正义又一次站在风口浪尖。 去年10月14日,日本软银董事长兼CEO孙正义发起成立愿景基金(Vis...

    量子位
  • 【机器学习】对数线性模型之Logistic回归、SoftMax回归和最大熵模型

    本文介绍对数线性分类模型,在线性模型的基础上通过复合函数(sigmoid,softmax,entropy )将其映射到概率区间,使用对数损失构建目标函数。首先以...

    yuquanle
  • 靶场搭建—bWAPP

    bWAPP是一个检测错误的Web应用程序,旨在帮助安全爱好者,开发人员和学生发现和防止Web漏洞。这个安全学习平台可以帮助您为成功的渗透测试和道德黑客项目做好准...

    字节脉搏实验室
  • [译] Room 🔗 Coroutines

    Room 2.1(目前为 alpha 版本)添加了对 Kotlin 协程的支持。DAO 方法现在可以被标记为挂起以确保他们不会在主线程执行。默认情况下,Room...

    Android 开发者

扫码关注云+社区

领取腾讯云代金券