张有健,陈 晨,王再见*
(1.安徽师范大学 物理与电子信息学院,安徽 芜湖241002;2.安徽省智能机器人信息融合与控制工程实验室,安徽 芜湖241002)
近年来,深度学习(Deep Learning)算法渐渐成为人工智能热点研究领域。因此如何改进深度学习算法,优化现有算法的性能是众多学者一直致力解决的问题。其中激活函数可以将非线性因素引入深度神经网络中,以此模拟非线性函数使得神经网络可以任意逼近任何非线性函数[1],这样神经网络就可以应用到众多的非线性模型中,大大提高了模型的泛化能力。
由于激活函数的重要性,众多学者通过对神经网络的研究,提出了多种不同类型的激活函数[2]。例如Sigmoid,Tanh,ReLU等经典激活函数及其改进结构。然而至今为止,对激活函数研究还没有明确的指导性原则。
为了使读者能够更加深入了解激活函数的性能、工作原理以及激活函数存在的不足。本文调研了现阶段主流的几种激活函数Sigmoid,Tanh,ReLU,P-ReLU,L-ReLU,并在不同的深度学习算法下测试激活函数的效果。在卷积神经网络(Covolutional Neural Network,CNN)[3-4]中使用MNIST,CIFAR-10经典数据集测试不同激活函数,并在循环神经网络(Recurrent Neural Network,RNN)[5-6]中使用大豆粮油数据集对大豆的产值进行预警,由实验结果可知,S系激活函数比ReLU系激活函数收敛更快,而ReLU系激活函数则在精度上优于S系激活函数。
深度学习网络中,激活函数受中枢神经系统中的生物神经元[7]启发而设计。如图1所示,v1,v2,…,vi是神经元的输入值,wj1wj2,…,wji为神经元传递的权值,bi为神经元传递的函数偏置向量。
图1 人工神经元结构图Fig.1 Structure of artificial neurons
根据生物神经元的特性将输入值vi与权值wji相乘,加上函数偏置向量bi得到神经元输出x,量化后通过相应的激活函数f(·),最后由激活函数f(·)来决定特定神经元是否被激活。
为了挖掘数据之间的复杂关系,深度学习将激活层加入到之前隐藏层的非线性输出中[7],原理如式(1)所示。
y=f(wx+b),
(1)
式中,f(·)为w内核的权值加上b的偏差,x为当前隐藏层的输入,y为当前隐藏层输出,同样也是下一个隐藏层的输入。
S系激活函数是神经网络中最早提出的一批激活函数,由于它与生物神经元的激活率[8]有相似的表达,因此广泛应用于早期的神经网络中。S系激活函数主要有两种类型:Sigmoid函数和双曲正切函数(Tanh)函数。S系激活函数是一个增长函数,它在线性和非线性行为之间保持平衡,如图2所示。Sigmoid函数的取值范围为0~1,Tanh函数则关于零点对称,取值范围为-1~1。
图2 常用的激活函数示意图Fig.2 Commonly used activation function diagram
由Sigmoid为代表的有一些众所周知的激活函数,如Sigmoid,Tanh,如图2 (a),式(2)~(3)所示。
(2)
(3)
如图2(a)所示,Sigmoid激活函数存在饱和区域和非原始对称的缺点,当数据处于饱和区域时,反向传播的梯度更新非常缓慢,非原点对称的问题会阻碍和减慢训练。激活函数克服了非原点对称的缺点,但也存在饱和区的缺点。Sigmoid和Tanh的激活函数在反向传播时也会出现梯度爆炸或梯度丢失的问题,因为它们的梯度相乘可能很大,也可能很小。基本激活函数的导数如式(4)~(5)所示。
(4)
(5)
通过导数计算得到激活函数Sigmoid 导数最大值为0.25,激活函数Tanh导数最大值为1。通过梯度的叠加计算,由于Sigmoid的导数小于1,因此多个小于1的导数相乘导致梯度非常小。同理,Tanh函数虽然要优于Sigmoid,然而其梯度仍然小于1,因此难以避免的存在梯度消失的问题,导致模型难以收敛。
针对上述问题,研究者提出了ReLU激活函数[9-10],ReLU是一个分段函数,当输入为负时,输出为0;否则,输出等于输入。ReLU的梯度为1,如式(6)所示,不会导致梯度爆炸或梯度丢失的问题,但会导致另一个问题,输出总是大于0,忽略了负的输入。式(7)为ReLU的导数形式。
(6)
(7)
针对ReLU激活函数的不足,学者们提出了许多改进的ReLU激活函数,如Leaky ReLU (L-ReLU)、参数ReLU (P-ReLU)[11]。P-ReLU函数的参数和ELU函数的参数是可变的,因此它们可以更加适应不同的数据集,L-ReLU的参数是固定的,因此它泛化性则略有欠缺。文献[12]提出一种新的激活函数方法——截断线性单元(ELU),这种方法可以更好地捕捉到嵌入信号的结构,这些信号通常具有极低的图像内容信噪比,但如果截断值很小,就会导致性能下降。改进后的ReLU激活函数如图2(b),式(8)~(10)所示,其中α,β,∂分别为ReLU系激活函数的参数。
(8)
(9)
(10)
文献[13]研究发现,新的组合激活函数可以通过结合基本的激活函数以数据驱动方式输出,并提出了以分层组合基本激活函数集成适应不同的输入。文献[14]提出一种新的组合激活函数,多参数指数线性单元MPELU。它由ReLU和ELU组合成,可以通过改变参数成为任何“ReLU家庭”成员,如ReLU,L-ReLU,P-ReLU。文献[15-16]提出了基于ReLU改进版的激活函数,它可以适应任何输入,但仍存在梯度爆炸或梯度丢失的现象。
文献[17]提出一种可训练的激活函数和一种多层结构多层Maxout网络(MMN),它具有非饱和区的特点,并且可以近似任何激活函数,这样可以适应任何输入,并且可以解决梯度爆炸或梯度消失问题,但需要付出的代价是大量的计算。文献[18]尝试在ReLU本身不变的情况下,用伪导数代替原有的ReLU导数。伪导数的设计是为了缓解零导数的问题,并与一般的原始导数保持一致,通过实验表明,在CIFAR-10测试中,使用伪导数ReLU (Pseudo Derivative ReLU,PD-ReLU)可以明显改善AlexNet。文献[19]使用一种双边ReLU激活函数针对图像处理问题,并比传统ReLU精度更高。然而在某种程度上却增加ReLU函数梯度爆炸和梯度消失的风险。激活函数作为热点研究领域,无法列举所有的激活函数,本文主要测试研究现阶段使用广泛的一些激活函数。表1列出了现阶段常用激活函数的优势及不足。
表1 主流激活函数的对比Tab.1 Comparison of mainstream activation functions
本节使用大量实验来证明不同激活函数的有效性及其优势与不足。所有实验均在本次实验环境中,将Tensorflow作为本次深度学习实验的框架模型。实验环境:Inter(R) Core(TM) i5-4590 CPU@3.30 GHz RAM:8 GB GPU:NVIDIA GeForce GTX 1060 3 GB。实验基于2,4,6,8,10,20层CNN。本节实验选择MNIST作为实验测试的数据库,手写数字数据库有一个包含60 000个示例的训练集和一个包含10 000个示例的测试集。数字的大小已标准化并集中在固定大小的图像中。通过计算像素的质心,将图像居中,并平移图像,使该点位于28×28区域的中心。
如图3(a)所示,在MNIST上测试了部分激活函数的有效性,各个激活函数的平均准确率高达99.3%,同时可得出在8层卷积层时对应的准确率更高。在图3(b)中各个激活函数的准确率基本达到93%以上,但现有的激活函数在卷积层达到8~20层时,准确性下降较快。双曲正切函数甚至只有33.83%的准确性。而L-ReLU和P-ReLU由于不涉及指数运算,且无死亡神经元的问题,避免了梯度消失和梯度爆炸的问题,因此相比于ReLU和Tanh更具鲁棒性。
图3 部分激活函数的精度比较Fig.3 Precision comparison of partial activation functions investigated
表2和表3记录了卷积层数分别2,6,10,20层下的CNN在MNIST数据集下的收敛时间。通过对比可知,由于每种激活函数涉及到的运算并不相同,不同的激活函数每次迭代所需的时间也不尽相同。相对于MNIST数据集,每次迭代的时间P-ReLU小于L-ReLU,大于Tanh和ReLU。且迭代的时间随着卷积层数的变化而变化,例如当卷积层增至20层时,L-ReLU比P-ReLU慢2 000 000 μs左右,比Tanh要慢约5 999 167 μs。
表2 4种激活函数在2,6层卷积层下的收敛时间Tab.2 Convergence time of four activation functions under 2 and 6 convolution layers was tested
表3 4种激活函数在10,20层卷积层下的收敛时间Tab.3 Convergence time of four activation functions under 10 and 20 convolution layers was tested
为了验证不同激活函数的泛化性,本次实验使用选择擅长处理序列数据[20-21]的循环神经网络,使用Tensorflow作为本次深度学习实验的框架模型。实验环境:Inter(R) Core(TM) i5-4590 CPU@3.30 GHz RAM:8 GB GPU:NVIDIA GeForce GTX 1060 3 GB。实验基于3层隐藏层的循环神经网络。
本次实验使用自收集大豆数据集,数据来源于国家粮食统计局、中国粮食年鉴等权威机构。数据集分为训练集及测试集两部分。其中训练集为1995—2007年中国大豆产值数据,测试集为2008—2016年的大豆数据集,最后通过训练后的RNN预测2008—2016年的大豆产值,并与实际的大豆产值对比得到最后的预测精度。其中训练集为3 258条示例,测试集为2 172条示例。
由图4中可知,在RNN下不同的激活函数对算法的精度同样有很大的影响。可以看出使用Tanh激活函数时,对大豆的产值预测达到85%的精确度,而在P-ReLU激活函数下,达到了93%的预测精度,结合S激活函数存在较大饱和区的特点和最终的预测精度来看,S系激活函数应用在传统的RNN中,造成的梯度消失问题严重的制约了算法的精度。同时在综合上节卷积层中的实验对比可得ReLU系激活函数的收敛时间可能更长,而其由于没有梯度消失与梯度爆炸的问题,使得算法的精度要优于S系激活函数,其中P-ReLU由于其自适应性,无指数运算的特点在大豆数据集中达到了最高的精度预测。
图4 不同激活函数下的循环神经网络对大豆产值的预测结果Fig.4 Prediction results of cyclic neural network under different activation functions on soybean output value
本文调研了目前使用较为广泛的激活函数,并在CNN和RNN中进行了测试对比。通过部分实验对比,得出S系激活函数在迭代时间上要比ReLU系激活函数更少,而在精度上ReLU系要远远高于S系激活函数。不同激活函数对深度学习算法的性能影响很大,现阶段在激活函数的改进上还没有指导性的理论原则,因此激活函数的优化仍然是改进深度学习的重点领域。下一步将针对现有激活函数的不足提出一种新的激活函数来优化深度学习算法。