本文作者专注于AI进阶算法,正在推出AI疯狂进阶之基础理论进阶篇,如有兴趣可持续关注我。
核心导读:
1. 神经网络激活函数的作用是什么?
2. 如何评价激活函数的好坏?
3. ReLU存在哪些问题?
4. 存在替换万年ReLU的激活函数吗?
1. 激活函数的作用是什么?
激活函数对于人工神经网络模型学习、理解非常复杂的数据来说具有十分重要的作用。激活函数给神经元引入了非线性因素,使得神经网络可以逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。目前最常见的激活函数当属ReLU以及在其基础上改进的如PReLU,RReLU,LeakyReLU等。本文在激活函数上进行了进阶总结,下面一一阐述:
2.如何评价激活函数的好坏?
目前学术界总计有50+类型的激活函数,但没有统一的或者明确的标准去衡量激活函数的好坏,最根本的原因是因为神经网络通过训练本质上是去拟合训练数据的非线性分布,然而现实中数据的分布是无法统计的,所以采用哪种激活函数能拟合的更好是无法通过理论去推导出来,因此大部分论文都是通过在几十种不同的任务上做实验去看准确率以及准确率浮动的范围(稳定性)来评判激活函数的好坏。从最近研究出的一些比较好的激活函数中可以总结出好的激活函数必须拥有以下三个特点:
(1) Unboundedness(x>0无饱和区域):传统的激活函数如sigmoid和tanh函数都有饱和区域,所以必须依赖较好的初始化让输入数据处于非饱和区域,否则饱和区域产生的梯度过小会影响收敛速度,而Relu系列都是x>0无饱和区域。
(2)NegativeOutputs(x<0产生非0值):Relu在x<0的值全都是0,而PReLU,RReLU,LeakyReLU最大的共同改进点就是在x<0产生非0值,少量的NegativeOutputs能减少神经元训练过程中出现"die"的概率,提升模型的鲁棒性。
(3)Smoothness(平滑性):Relu,PReLU,RReLU都是在x=0点都是不连续的,最明显的现象是在特征响应图上产生断层,平滑的激活函数更利于梯度信息的回传。
3.ReLU存在哪些问题?
(1)Dead ReLU Problem:《Applying Deep Learning to Airbnb Search》中解释了这个问题,神经网络接受异于常值范围的输入时,在反向传播过程中会产生大的梯度,这种大的梯度,会因梯度消失而永久关闭诸如 ReLU 的激活函数,这主要是ReLU没有NegativeOutputs所带来的问题。下面举了个简单的例子说明这个现象。
(2)High-Confidence Predictions:《Why ReLU Networks Yield High-Confidence Predictions Far Away From the Training Dataand How to Mitigate》中针对例如将一个在CIFAR 10数据集(10类普通物体)上训练的神经网络,放到SVHN数据集(街景门牌)上做测试,该模型竟然能够以100%的置信度将门牌识别为狗、鸟和飞机等这种现象,通过理论建模,解释ReLU带来的高置信度问题,并提出CEDA和ACET来缓解这种不良情况。
4.存在替换万年ReLU的激活函数吗?
答案是肯定的。本文作者在这里给大家推荐2个激活函数。这2个激活函数在自己的工程项目中都尝试过,相比Relu均有稳定0.5%左右的提升。仅仅改变激活函数就能带来白给的提升,何乐而不为?第一个是Google Brain提出的Swish函数,其形式为f(x) = x · sigmoid(x) ,《SWISH: A SELF-GATED ACTIVATION FUNCTION 》论文在多个任务上实验精度都超过Relu,同时在2019年推出的端侧引擎MobilenetV3中,也是直接用Swish替换掉Relu。另一个是Mish函数,其形式为f(x) = x⋅ tanh(ln(1 + exp(x)),《Mish: A Self Regularized Non-Monotonic Neural Activation Function 》也是在多个任务上实验最终准确度上比Swish(+.494%)和ReLU(+ 1.671%)都有提高。从下图可以看出Swish和Mish在特征图上数据分布比Relu更加平滑。由于激活函数替换的成本较低,所以当你看到这篇文章的时候,可以尝试在自己的项目中采用这2个激活函数试一试,说不定就能带来一定的提升。
5.小结
激活函数一直是神经网络研究中的一个重要方向,未来也会有更多更好的激活函数出现,如果不知道采用哪个激活函数好,可以采用Auto ML进行搜索。
如需转载,请注明出处。