干货 | 深度学习之损失函数与激活函数的选择

来源:互联网 发布:淘宝网波西米亚长裙 编辑:程序博客网 时间:2024/05/21 06:33

微信公众号

关键字全网搜索最新排名

【机器学习算法】:排名第一

【机器学习】:排名第二

【Python】:排名第三

【算法】:排名第四

前言

深度神经网络(DNN)反向传播算法(BP)中,我们对DNN的前向反向传播算法的使用做了总结。其中使用的损失函数是均方差,而激活函数是Sigmoid。实际上DNN可以使用的损失函数和激活函数不少。这些损失函数和激活函数如何选择呢?以下是本文的内容


MSE损失+Sigmoid激活函数的问题

先来看看均方差+Sigmoid的组合有什么问题。回顾下Sigmoid激活函数的表达式为:

函数图像如下:

从图上可以看出,对于Sigmoid,当z的取值越来越大后,函数曲线变得越来越平缓,意味着此时的导数σ′(z)也越来越小。同样的,当z的取值越来越小时,也有这个问题。仅仅在z取值为0附近时,导数σ′(z)的取值较大。在均方差+Sigmoid的反向传播算法中,每一层向前递推都要乘以σ′(z),得到梯度变化值。Sigmoid的这个曲线意味着在大多数时候,我们的梯度变化值很小,导致我们的W,b更新到极值的速度较慢,也就是我们的算法收敛速度较慢。那么有什么什么办法可以改进呢?


交叉熵损失+Sigmoid改进收敛速度

Sigmoid的函数特性导致反向传播算法收敛速度慢的问题,那么如何改进呢?换掉Sigmoid?这当然是一种选择。另一种常见的选择是用交叉熵损失函数来代替均方差损失函数。每个样本的交叉熵损失函数的形式:

其中,▪为向量内积。这个形式其实很熟悉,在逻辑回归原理小结中其实我们就用到了类似的形式,只是当时我们是用最大似然估计推导出来的,而这个损失函数的学名叫交叉熵。


使用了交叉熵损失函数,就能解决Sigmoid函数导数变化大多数时候反向传播算法慢的问题吗?我们来看看当使用交叉熵时,我们输出层δL的梯度情况。

对比一下均方差损失函数时在δL梯度

使用交叉熵,得到的的δl梯度表达式没有了σ′(z),梯度为预测值和真实值的差距,这样求得的Wl,bl的梯度也不包含σ′(z),因此避免了反向传播收敛速度慢的问题。通常情况下,如果我们使用了sigmoid激活函数,交叉熵损失函数肯定比均方差损失函数好用。


对数似然损失+softmax进行分类输出

在前面我们都假设输出是连续可导的值,但是如果是分类问题,那么输出是一个个的类别,那我们怎么用DNN来解决这个问题呢?


DNN分类模型要求是输出层神经元输出的值在0到1之间,同时所有输出值之和为1。很明显,现有的普通DNN是无法满足这个要求的。但是我们只需要对现有的全连接DNN稍作改良,即可用于解决分类问题。在现有的DNN模型中,我们可以将输出层第i个神经元的激活函数定义为如下形式:

这个方法很简洁漂亮,仅仅只需要将输出层的激活函数从Sigmoid之类的函数转变为上式的激活函数即可。上式这个激活函数就是我们的softmax激活函数。它在分类问题中有广泛的应用。将DNN用于分类问题,在输出层用softmax激活函数也是最常见的了。


对于用于分类的softmax激活函数,对应的损失函数一般都是用对数似然函数,即:

其中yk的取值为0或者1,如果某一训练样本的输出为第i类。则yi=1,其余的j≠i都有yj=0。由于每个样本只属于一个类别,所以这个对数似然函数可以简化为:

可见损失函数只和真实类别对应的输出有关,这样假设真实类别是第i类,则其他不属于第i类序号对应的神经元的梯度导数直接为0。对于真实类别第i类,它的WiL对应的梯度计算为:

可见,梯度计算也很简洁,也没有第一节说的训练速度慢的问题。当softmax输出层的反向传播计算完以后,后面的普通DNN层的反向传播计算和之前讲的普通DNN没有区别。


梯度爆炸or消失与ReLU

学习DNN,大家一定听说过梯度爆炸和梯度消失两个词。尤其是梯度消失,是限制DNN与深度学习的一个关键障碍,目前也没有完全攻克。

什么是梯度爆炸和梯度消失呢?简单理解,就是在反向传播的算法过程中,由于我们使用了是矩阵求导的链式法则,有一大串连乘,如果连乘的数字在每层都是小于1的,则梯度越往前乘越小,导致梯度消失,而如果连乘的数字在每层都是大于1的,则梯度越往前乘越大,导致梯度爆炸。


比如如下的梯度计算:

如果不巧我们的样本导致每一层的梯度都小于1,则随着反向传播算法的进行,我们的δl会随着层数越来越小,甚至接近越0,导致梯度几乎消失,进而导致前面的隐藏层的W,b参数随着迭代的进行,几乎没有大的改变,更谈不上收敛了。这个问题目前没有完美的解决办法。


而对于梯度爆炸,则一般可以通过调整我们DNN模型中的初始化参数得以解决。

对于无法完美解决的梯度消失问题,一个可能部分解决梯度消失问题的办法是使用ReLU(Rectified Linear Unit)激活函数,ReLU在卷积神经网络CNN中得到了广泛的应用,在CNN中梯度消失似乎不再是问题。那么它是什么样子呢?其实很简单,比我们前面提到的所有激活函数都简单,表达式为:

也就是说大于等于0则不变,小于0则激活后为0。


其他激活函数

DNN常用的激活函数还有:

 tanh

这个是sigmoid的变种,表达式为:

tanh激活函数和sigmoid激活函数的关系为:

tanh和sigmoid对比主要的特点是它的输出落在了[-1,1],这样输出可以进行标准化。同时tanh的曲线在较大时变得平坦的幅度没有sigmoid那么大,这样求梯度变化值有一些优势。当然,要说tanh一定比sigmoid好倒不一定,还是要具体问题具体分析。


 softplus

这个其实就是sigmoid函数的原函数,表达式为:

它的导数就是sigmoid函数。softplus的函数图像和ReLU有些类似。它出现的比ReLU早,可以视为ReLU的鼻祖。



PReLU

从名字就可以看出它是ReLU的变种,特点是如果未激活值小于0,不是简单粗暴的直接变为0,而是进行一定幅度的缩小。如下图。


小结

上面我们对DNN损失函数和激活函数做了详细的讨论,重要的点有:

1)如果使用sigmoid激活函数,则交叉熵损失函数一般肯定比均方差损失函数好;

2)如果是DNN用于分类,则一般在输出层使用softmax激活函数和对数似然损失函数;

3)ReLU激活函数对梯度消失问题有一定程度的解决,尤其是在CNN模型中。

欢迎分享给他人让更多的人受益

参考:

  1. Yoshua Bengio《深度学习》

  2. 博客园(作者:刘建平)

    http://www.cnblogs.com/pinard/p/6437495.html

  3. 周志华《机器学习》

  4. 李航《统计学习方法》

加我微信:guodongwe1991,备注姓名-单位-研究方向(加入微信机器学习交流1群)

招募 志愿者

广告、商业合作

请加QQ:357062955@qq.com

喜欢,别忘关注~

帮助你在AI领域更好的发展,期待与你相遇!

阅读全文
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 驾驶证约考帐号与登密码丢失怎么办 考驾照的时候预约密码忘了怎么办 考驾照的预约密码忘了怎么办 摩托车不能挂档不能摘挡了怎么办 身份证丢失了派出所不给挂失怎么办 快递员在中午还送货夏天怎么办啊 驾照一个记分周期扣满12分怎么办 佛山南海车管所怎么办替人消分流程 福州快处中心几流程要怎么办 被对方追尾了对方只有交强险怎么办 摩托车行驶证年检过期一年半怎么办 户口迁到杭州了身份证掉了怎么办 户口已迁至外面要补办结婚证怎么办 汽车年检时间过了1个月怎么办 户口在老家在北京工作怎么办招工 报考驾照时手机号留错了怎么办 合肥驾照换证体检没过怎么办 驾驶证记分周期到了违章未消怎么办 驾照被扣科目一过期没考怎么办 驾驶证暂扣过了换证日期怎么办? 考驾照科目二身份证丢了怎么办 驾照科目一考试身份证丢了怎么办 换驾驶证名下有车辆脱审怎么办 交警把驾驶证和行车证扣了怎么办 连续两天驾照都是扣12分怎么办? 交警开的电动车罚单丢了怎么办 驾驶证b证体检报告拖期怎么办 在中国把美国护照弄丢了怎么办 拿了驾照两年了不敢上高速怎么办 我要移民过香港大陆的驾驶证怎么办 交警开的扣行驶证的单不见了怎么办 行驶证累计记分满12分后怎么办 行车证丢了被交警查到怎么办 手机摔了一下一半黑屏了怎么办 三星手机的显示屏插头坏了怎么办? 被普通的手机维修店骗了怎么办? 手机外屏裂了内屏进水了怎么办 小米2s手机忘了解锁图案怎么办 红米note5手机屏烂了怎么办 网上买好高铁票身份证没带怎么办 高铁票买好了身份证丢了怎么办