机器学习10:Tips of DNN——激活函数选择

一、Training和Testing情形

overfitting:Training Data上表现良好,Testing Data表现不好。

Training失败:梯度消失等情形。

如下的例子属于Training失败,并非overfitting:

虽然层数增加导致训练结果变差,但测试集得到同样的结果,所以并没有过度学习训练集的特征,其实是没有训练好;

二、调整方案

Training表现不好时,应该调整学习模型和策略,Training表现好而Testing表现不好时,考虑采用Dropout、regularization、Early Stopping

三、Training失败举例

早期手写字母辨识采用sigmod函数作为激活函数,该模型采用更多层时,反而会被Training坏,如下图所示:

问题可以归结于梯度消失:使用sigmod函数,在模型很深的情况下,靠近输入的几个层的微分对整个Loss Function的作用比较小,越靠近输出的层的微分对Loss Function的影响较大。造成靠近输出的层参数更新较快,靠近输入的层参数更新慢,当靠近输出的层已经收敛的时候,输入层还处于随机更新参数的状态。最终,造成局部最优。这也是由sigmod函数的特性决定的,每一层的梯度通过sigmod函数之后会变得很小,而通过很多层之后,会导致这个梯度变得特别小,导致改一次参数或者调整输入之后,系统的输出会特别小。

四、改善方法

1、使用ReLU作为激活函数,使得每一层都能够得到单独的训练,不会造成梯度消失。

使用ReLU的时候,有些neural会变成0,有些neural会变成线性的,如图:

去掉0的neural,模型会变成一个瘦长的线性模型:

可以看出该模型会避免梯度消失,但是简单的线性模型叠加不会导致模型的性能变得很弱吗?

答案:模型依然是非线性模型,当输入变化很小的情况下,整个模型还处于同一个线性模型;但是,当输入变化较大是,会使得神经元改变(有些神经元变成0,另外的却变成了线性)。因此,模型会在各种不同的线性模型中切换,整个模型依然是非线性的

2、ReLU变种

3、Maxout

通过Maxout,可以自己学出激活函数,Maxout同样可以学出ReLU,因此ReLU是Maxout的一个特例。

类似于Pooling,只是将Pooling放到了每一个neural。

Maxout与ReLU的关系如下

左图:ReLU在直线z=wx+b(蓝色)大于零的部分取ax,小于0的部分取0,得到绿色线的情形;而Maxout在z2=0(红色)的情况下,就会取z1=wx+b(蓝色)这条线,此时与ReLU一致

右图:当z1和z2的参数都是可调整时,就会出现右图(绿色)可变化的激活函数,所以称它是可学习的激活函数

Maxout模型对于每一组输入,最终得到的依然是瘦长的线性模型,与ReLU类似,不同输入最终组合成了非线性模型,在Training的过程中,将max的输出乘以对应的斜率即可。

五、总结

1、随着DNN层数的增加,sigmod函数会出现梯度下降的情形,导致Training结果变差,此时,引入ReLU作为激活函数,使得Training结果得到改善。

2、为了得到更好的效果,衍生出变种的ReLU函数,模型参数因此会增加。

3、进一步衍生出可以自己学习的激活函数Maxout,但模型的参数又进一步增加。

综合以上分析:对于部分分类,当不需要使用特别深层的模型时,sigmod函数就可以达到好的效果;而对于浅层模型无法达到恨到的Training效果时,考虑使用ReLU函数,甚至使用Maxout,视训练情况而定。

猜你喜欢

转载自blog.csdn.net/qqqinrui/article/details/84885476
今日推荐