深度学习的基本原理是基于人工神经网络,信号从一个神经元进入,经过非线性的activation function,传入到下一层神经元;再经过该层神经元的activate,继续往下传递,如此循环往复,直到输出层。正是由于这些非线性函数的反复叠加,才使得神经网络有足够的capacity来抓取复杂的pattern,在各个领域取得state-of-the-art的结果。显而易见,activation function在深度学习中举足轻重,也是很活跃的研究领域之一。目前来讲,选择怎样的activation function不在于它能否模拟真正的神经元,而在于能否便于优化整个深度神经网络。下面我们简单聊一下各类函数的优缺点以及其适用场景。Pros表示优点,Cons表示缺点。
σ ( x ) = 1 1 + e − x \sigma(x)=\frac{1}{1+e^{-x}} σ(x)=1+e−x1
Sigmoid函数是深度学习领域开始时使用频率最高的activation function
Pros
Cons
适用场景
t a n h ( x ) = e x − e − x e x + e − x tanh(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} tanh(x)=ex+e−xex−e−x
tanh读作Hyperbolic Tangent,双曲正切函数
Pros
解决了Sigmoid函数的不是zero-centered输出问题
Cons
梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在
适用场景
R e L u ( x ) = m a x ( 0 , x ) ReLu(x)=max(0,x) ReLu(x)=max(0,x)
ReLU函数其实就是一个取最大值函数,注意这并不是全区间可导的,但是我们可以取sub-gradient。
Pros
Cons
适用场景
f ( x ) = m a x ( 0.01 x , x ) f(x)=max(0.01x,x) f(x)=max(0.01x,x)
人们为了解决Dead ReLU Problem,提出了将ReLU的前半段设为[公式]而非0。另外一种直观的想法是基于参数的方法,即Parametric ReLU:f(x)=max(ax,x),其中α可由back propagation学出来。
Pros
Cons
适用场景
f ( x ) = { x , if x >0 α ( e x − 1 ) , otherwise f(x)= \begin{cases} x, & \text {if $x$>0} \\ \alpha(e^x-1), & \text{otherwise} \end{cases} f(x)={x,α(ex−1),if x>0otherwise
ELU也是为解决ReLU存在的问题而提出的
Pros
Cons
适用场景
f ( x ) = m a x ( w 1 T x + b 1 , w 2 T x + b 2 ) f(x)=max(w_1^Tx+b_1,w_2^Tx+b_2) f(x)=max(w1Tx+b1,w2Tx+b2)
Maxout可以看做是在深度学习网络中加入一层激活函数层,包含一个参数k
Pros
Cons
适用场景
0-1损失是指预测值和目标值不相等为1,否则为0:
L ( Y , f ( x ) ) = { 1 , Y ≠ f(x) 0 , Y = f(x) L(Y,f(x))= \begin{cases} 1, & \text {Y$\neq$f(x)} \\ 0, & \text{Y$=$f(x)} \end{cases} L(Y,f(x))={1,0,Y=f(x)Y=f(x)
特点:
a.0-1损失函数直接对应分类判断错误的个数,但是它是一个非凸函数,不太适用
b.感知机就是用的这种损失函数。但是相等这个条件太过严格,因此可以放宽条件,即满足 ∣ Y − f ( x ) ∣ < T |Y-f(x)|
L ( Y , f ( x ) ) = { 1 , ∣ Y − f ( x ) ∣ ≥ T 0 , ∣ Y − f ( x ) ∣ < T L(Y,f(x))= \begin{cases} 1, & \text {$|Y-f(x)|\geq T$} \\ 0, & \text{$|Y-f(x)|
绝对值损失函数是计算预测值与目标值的差的绝对值:
L ( Y , f ( x ) ) = ∣ Y − f ( x ) ∣ L(Y,f(x))=|Y-f(x)| L(Y,f(x))=∣Y−f(x)∣
log对数损失函数的标准形式如下:
L ( Y , P ( Y ∣ X ) ) = − l o g P ( Y ∣ X ) L(Y,P(Y|X))=-logP(Y|X) L(Y,P(Y∣X))=−logP(Y∣X)
特点:
a. log对数损失函数能非常好的表征概率分布,在很多场景尤其是多分类,如果需要知道结果属于每个类别的置信度,那它非常适合。
b. 鲁棒性不强,相比于hinge loss对噪声更敏感。
c. 逻辑回归的损失函数就是log对数损失函数。
平方损失函数标准形式如下:
L ( Y ∣ f ( X ) ) = ∑ N ( Y , f ( X ) ) 2 L(Y|f(X))=\sum_{N}(Y,f(X))^2 L(Y∣f(X))=N∑(Y,f(X))2
特点:
经常应用于回归问题
指数损失函数标准形式如下:
L ( Y │ f ( X ) ) = e x p [ − y f ( x ) ] L(Y│f(X) )=exp[-yf(x)] L(Y│f(X))=exp[−yf(x)]
特点:
对离群点、噪声非常敏感。经常用在AdaBoost算法中。
Hinge损失函数标准形式如下:
L ( y │ f ( x ) ) = m a x ( 0 , 1 − y f ( x ) ) L(y│f(x) )=max(0,1-yf(x)) L(y│f(x))=max(0,1−yf(x))
特点:
a.hinge损失函数表示如果被分类正确,损失为0,否则损失就为1-yf(x)。SVM就是使用这个损失函数。
b.一般的f(x)是预测值,在-1到1之间, y是目标值(-1或1)。其含义是,f(x)的值在-1和+1之间就可以了,并不鼓励|f(x)|>1,即并不鼓励分类器过度自信,让某个正确分类的样本距离分割线超过1并不会有任何奖励,从而使分类器可以更专注于整体的误差。
c.鲁棒性相对较高,对异常点、噪声不敏感,但它没太好的概率解释。
感知损失函数的标准形式如下:
L ( Y , f ( x ) ) = m a x ( 0 , 1 − f ( x ) ) L(Y,f(x))=max(0,1-f(x)) L(Y,f(x))=max(0,1−f(x))
特点:
是Hinge损失函数的一个变种,Hinge loss对判定边界附近的点(正确端)惩罚力度很高。而perceptron loss只要样本的判定类别正确的话,它就满意,不管其判定边界的距离。它比Hinge loss简单,因为不是max-margin boundary,所以模型的泛化能力没 hinge loss强。
交叉熵损失函数的标准形式如下:
C = − 1 n ∑ x [ y l n a + ( 1 − y ) l n ( 1 − a ) ] C=-\frac{1}{n}\sum_{x}[y lna+(1-y)ln(1-a)] C=−n1x∑[ylna+(1−y)ln(1−a)]
其中,x表示样本, y表示预测的输出, a表示实际的输出,n表示样本总数量。
特点:
a.本质上也是一种对数似然函数,可用于二分类和多分类任务中。
二分类问题中的loss函数(输入数据是softmax或者sigmoid函数的输出):
l o s s = − 1 n ∑ x [ y l n a + ( 1 − y ) l n ( 1 − a ) ] loss=-\frac{1}{n}\sum_{x}[y lna+(1-y)ln(1-a)] loss=−n1x∑[ylna+(1−y)ln(1−a)]
多分类问题中的loss函数(输入数据是softmax或者sigmoid函数的输出):
l o s s = − 1 n ∑ x y i ln a i loss=-\frac{1}{n}\sum_{x}y_i\ln a_i loss=−n1x∑yilnai
b.当使用sigmoid作为激活函数的时候,常用交叉熵损失函数而不用均方误差损失函数,因为它可以完美解决平方损失函数权重更新过慢的问题,具有“误差大的时候,权重更新快;误差小的时候,权重更新慢”的良好性质。
[1] Nwankpa C, Ijomah W, Gachagan A, et al. Activation functions: Comparison of trends in practice and research for deep learning[J]. arXiv preprint arXiv:1811.03378, 2018.
[2] 聊一聊深度学习的activation function [EB/OL].(2017-02-12)[2019-11-13]. https://zhuanlan.zhihu.com/p/25110450
[3] 常用激活函数(激励函数)理解与总结[EB/OL].(2018-05-13)[2019-11-13]. https://blog.csdn.net/tyhj_sf/article/details/79932893
[4] 深度学习中的激活函数汇总[EB/OL].(2018-08-25)[2019-11-13]. http://spytensor.com/index.php/archives/23/
[5] 激活函数(ReLU, Swish, Maxout) [EB/OL].(2017-02-18)[2019-11-13]. https://www.cnblogs.com/makefile/p/activation-function.html
[6] 各种激活函数整理总结[EB/OL].(2018-10-27)[2019-11-13]. https://hellozhaozheng.github.io/z_post/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0-%E5%90%84%E7%A7%8D%E6%BF%80%E6%B4%BB%E5%87%BD%E6%95%B0%E6%B7%B1%E5%85%A5%E8%A7%A3%E6%9E%90/
[7] 常见的损失函数(loss function)总结[EB/OL].(2019-07-19)[2019-11-13].
https://zhuanlan.zhihu.com/p/58883095
码字不易,如果您觉得有帮助,欢迎点赞和收藏~~