转载-聊一聊深度学习的activation function
目录
文章来源于夏飞-聊一聊深度学习的activation function;
文章核心内容未作改变,部分排版会有少许变化;
1. 背景
深度学习的基本原理是基于人工神经网络,信号从一个神经元进入,经过非线性的activation function,传入到下一层神经元;再经过该层神经元的activate,继续往下传递,如此循环往复,直到输出层。正是由于这些非线性函数的反复叠加,才使得神经网络有足够的capacity来抓取复杂的pattern,再各个领域取得state-of-the-art的结果。显而易见,activate function在深度学习中举足轻重,也是很活跃的研究领域之一。目前来讲,选择怎样的activation function不在于它能否模拟真正的神经元,而是在于能够便于优化整个神经网络。下面我们简单聊一下各类函数的特点以及为什么现在优先推荐ReLU函数。
2. 深度学习中常见的激活函数
2.1 Sigmoid函数
\[
\sigma = \dfrac{1}{1+e^{-x}}
\]

Sigmoid函数是深度学习领域开始时使用频率较高的activation function。它是便于求导的平滑函数,其导数为\(\sigma(x)(1-\sigma(x))\),这是优点。然而,Sigma有三大缺点:
- 容易出现gradient vanishing
- 函数输出并不是zero-centered
- 幂运算相对来讲比较耗时
2.1.1 Gradient Vanishing
优化神经网络的方法是Back Propagation,即导数的后向传递:先计算输出层对应的loss,然后将loss以导数的形式不断向上一层网络传递,修正相应的参数,达到降低loss的目的。Sigmoid函数在深度网络中常常会导致导数逐渐变为0,使得参数无法被更新,神经网络无法被优化。原因在于两点:
(1)在上图中容易看出,\(\sigma(x)\)中\(x\)较大或较小时,导数接近于0,而后向传递的数学依据时微积分求导的链式法则,当前层的导数需要之前各层导数的乘积,几个小数的相乘,结果会很接近于0;
(2)Sigmoid导数的最大值时0.25,这意味着导数在每一层至少会被压缩为原来的1/4,通过两层后被变为1/16,...,通过10层后为1/1048576。请注意这里时“至少”,导数达到最大值这种情况还是很少见的。
2.1.2 输出不是zero-centered
Sigmoid函数的输出值恒大于0,这会导致模型训练的收敛速度变慢。举例来讲,对\(\sigma(\sum_iw_ix_i+b)\),如果所有\(x_i\)均为正数或负数,那么其对\(w_i\)的导数总是正数或负数,这会导致如下图红色箭头所示的阶梯式更新,这显然并非一个好的优化路径。深度学习往往需要大量时间来处理大量数据,模型的收敛速度时尤为重要的。所以,总体上来讲,训练深度学习网络尽量使用zero-centered数据(可以通过数据预处理实现)和zero-centered输出。

2.1.3 幂运算相对耗时
相对于前两项,这其实并不是一个大问题,我们目前是具备相应计算能力的,但面对深度学习中庞大的计算量,最好能省则省 :-)。之后我们会看到,在ReLu函数中,需要做的仅仅是一个thresholding,相对幂运算来讲会快很多。
2.2 tanh函数
\[
tanh(x) = \dfrac{e^x-e^{-x}}{e^x+e^{-x}}
\]

tanh读作Hyperbolic Tangent,如上图所示,它解决了zero-centered的输出问题,然而,gradient vanishing的问题和幂运算的问题仍然存在。
2.3 ReLU函数
\[
ReLU = max(0, x)
\]

ReLU函数其实就是一个取最大值函数,注意这并不是全区间可导的,但是我们可以取sub-gradient,如上图所示。ReLU虽然简单,但是确实近几年的重要成果,有以下几大优点:
- 解决了gradient vanishing的问题(在正区间)
- 计算速度非常快,只需要判断输入是否大于0
- 收敛速度快于Sigmoid和tanh
ReLU也有几个需要特别注意的问题:
(1)ReLU的输出不是zero-centered
(2)Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生:
- 非常不幸的参数初始化,这种情况比较少见;
- learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法;
尽管存在这两个问题,ReLU目前仍是最常用的activation function,在搭建人工神经网络的时候推荐优先尝试;
2.4 Leaky ReLu函数
\[
f(x) = max(0.01x, x)
\]

人们为了解决Dead ReLU Problem,提出了将ReLU的前半段设为\(0.01x\)而非0。另外一种直观的想法是基于参数的方法,即Parametric ReLU:\(f(x)=max(\alpha x,x)\),其中\(\alpha\)可由back propagation学出来。理论上来讲,Leaky ReLU有ReLU的所有优点,外加不会有Dead ReLU问题,但是实际操作当中,并没有完全证明Leaky ReLU总是好于ReLU。
2.5 ELU(Exponential Linear Units)函数
\[
f(x)=\begin{cases}x, &if\ x > 0 \cr\alpha(e^x-1), &otherwise\end{cases}
\]

ELU也是为解决ReLU存在的问题而提出,显然,ELU有ReLU的基本所有优点,以及:
- 不会有Dead ReLU问题
- 输出的均值接近于0,zero-centered
它的一个小问题在于计算量稍大。类似于Leaky ReLU,理论上虽然好于ReLU,但在实际使用中目前并没有好的证据ELU总是优于ReLU。
3. 小结
建议使用ReLU函数,但是要注意初始化和learning rate的设置;可以尝试用Leaky ReLU或ELU函数;不建议使用tanh,尤其是Sigmoid函数;
Reference
- Udacity Deep Learning Courses
- Stanford CS231n Course
转载-聊一聊深度学习的activation function的更多相关文章
- (转载)深度学习的weight initialization
本文转自:谷歌工程师:聊一聊深度学习的weight initialization TLDR (or the take-away) Weight Initialization matters!!! 深度 ...
- 转载-【深度学习】深入理解Batch Normalization批标准化
全文转载于郭耀华-[深度学习]深入理解Batch Normalization批标准化: 文章链接Batch Normalization: Accelerating Deep Network T ...
- 【Todo】【转载】深度学习&神经网络 科普及八卦 学习笔记 & GPU & SIMD
上一篇文章提到了数据挖掘.机器学习.深度学习的区别:http://www.cnblogs.com/charlesblc/p/6159355.html 深度学习具体的内容可以看这里: 参考了这篇文章:h ...
- 转载:深度学习在NLP中的应用
之前研究的CRF算法,在中文分词,词性标注,语义分析中应用非常广泛.但是分词技术只是NLP的一个基础部分,在人机对话,机器翻译中,深度学习将大显身手.这篇文章,将展示深度学习的强大之处,区别于之前用符 ...
- [转载]机器学习&深度学习经典资料汇总,全到让人震惊
自学成才秘籍!机器学习&深度学习经典资料汇总 转自:中国大数据: http://www.thebigdata.cn/JiShuBoKe/13299.html [日期:2015-01-27] 来 ...
- 【转载】 深度学习之卷积神经网络(CNN)详解与代码实现(一)
原文地址: https://www.cnblogs.com/further-further-further/p/10430073.html ------------------------------ ...
- 【转载】深度学习中softmax交叉熵损失函数的理解
深度学习中softmax交叉熵损失函数的理解 2018-08-11 23:49:43 lilong117194 阅读数 5198更多 分类专栏: Deep learning 版权声明:本文为博主原 ...
- 【转载】 深度学习与自然语言处理(1)_斯坦福cs224d Lecture 1
版权声明:本文为博主原创文章,未经博主允许不得转载. 原文地址http://blog.csdn.net/longxinchen_ml/article/details/51567960 目录(?)[- ...
- 【转载】 深度学习总结:用pytorch做dropout和Batch Normalization时需要注意的地方,用tensorflow做dropout和BN时需要注意的地方,
原文地址: https://blog.csdn.net/weixin_40759186/article/details/87547795 ------------------------------- ...
随机推荐
- Linux搭建FTP服务器实战
首先准备一台Linux系统机器(虚拟机也可), 检测出是否安装了vsftpd软件: rpm -qa |grep vsftpd 如果没有输出结果,就是没有安装. 使用命令安装,安装过程中会有提示,直接输 ...
- Appium 1.9.1 启动报错 Fatal TypeError: Class constructor BaseDriver cannot be invoked without 'new'
安装了appium 1.9.1后一直报错Fatal TypeError: Class constructor BaseDriver cannot be invoked without 'new',无法 ...
- SPDIF接口细则详解
链接:https://max.book118.com/html/2017/0422/101658483.shtm
- re.sub用法
re.sub功能是对于一个输入的字符串,利用正则表达式,来实现字符串替换处理的功能返回处理后的字符串 re.sub共有五个参数 三个必选参数pattern,repl,string 两个可选参数coun ...
- history显示历史操作记录,并显示操作时间
在查看历史的操作记录有两种方式1.在用户的目录下的.bash_history文件中[root@node1 ~]# vi ~/.bash_history rebootvi /etc/sysconfig/ ...
- [2018-08-25]模板引擎Razor Engine 用法示例
好久没写博客了,回宁波后最近几个月一直忙些线下的事情. 敲代码方面脱产有阵子了,生疏了,回头一看,这行业果然更新飞快. 最近线下的事情基本忙完,准备开始干回老本行,最重要的一件事就是升级abplus库 ...
- empty blank
非nil对象才能调用 empty nil: 对象是否存在empty: ”“ []blank: nil emptypresent: ! blank
- js正則函數 match、exec、test、search、replace、split 使用介紹集合
match 方法 使用正則表達式模式對字元串執行查找,並將包含查找的結果作為數組返回. stringObj.match(rgExp) 參數 stringObj 必選項.對其進行查找的 String 對 ...
- HDU2296 Ring —— AC自动机 + DP
题目链接:https://vjudge.net/problem/HDU-2296 Ring Time Limit: 2000/1000 MS (Java/Others) Memory Limit ...
- 如何让你的手机U盘集PE工具、系统安装、无线破解等众多功能于一身
不久前,手里的U盘坏了,于是乎,又在网上淘了一个Type-C U盘,刚好手机电脑都可以用. 那么现在U有了,我们要做什么呢? 第一:让U盘插在手机上时,可以供手机读写,实现手机存储扩容,随插随用,简单 ...