張有健,陳 晨,王再見*
(1.安徽師范大學 物理與電子信息學院,安徽 蕪湖241002;2.安徽省智能機器人信息融合與控制工程實驗室,安徽 蕪湖241002)
近年來,深度學習(Deep Learning)算法漸漸成為人工智能熱點研究領(lǐng)域。因此如何改進深度學習算法,優(yōu)化現(xiàn)有算法的性能是眾多學者一直致力解決的問題。其中激活函數(shù)可以將非線性因素引入深度神經(jīng)網(wǎng)絡中,以此模擬非線性函數(shù)使得神經(jīng)網(wǎng)絡可以任意逼近任何非線性函數(shù)[1],這樣神經(jīng)網(wǎng)絡就可以應用到眾多的非線性模型中,大大提高了模型的泛化能力。
由于激活函數(shù)的重要性,眾多學者通過對神經(jīng)網(wǎng)絡的研究,提出了多種不同類型的激活函數(shù)[2]。例如Sigmoid,Tanh,ReLU等經(jīng)典激活函數(shù)及其改進結(jié)構(gòu)。然而至今為止,對激活函數(shù)研究還沒有明確的指導性原則。
為了使讀者能夠更加深入了解激活函數(shù)的性能、工作原理以及激活函數(shù)存在的不足。本文調(diào)研了現(xiàn)階段主流的幾種激活函數(shù)Sigmoid,Tanh,ReLU,P-ReLU,L-ReLU,并在不同的深度學習算法下測試激活函數(shù)的效果。在卷積神經(jīng)網(wǎng)絡(Covolutional Neural Network,CNN)[3-4]中使用MNIST,CIFAR-10經(jīng)典數(shù)據(jù)集測試不同激活函數(shù),并在循環(huán)神經(jīng)網(wǎng)絡(Recurrent Neural Network,RNN)[5-6]中使用大豆糧油數(shù)據(jù)集對大豆的產(chǎn)值進行預警,由實驗結(jié)果可知,S系激活函數(shù)比ReLU系激活函數(shù)收斂更快,而ReLU系激活函數(shù)則在精度上優(yōu)于S系激活函數(shù)。
深度學習網(wǎng)絡中,激活函數(shù)受中樞神經(jīng)系統(tǒng)中的生物神經(jīng)元[7]啟發(fā)而設(shè)計。如圖1所示,v1,v2,…,vi是神經(jīng)元的輸入值,wj1wj2,…,wji為神經(jīng)元傳遞的權(quán)值,bi為神經(jīng)元傳遞的函數(shù)偏置向量。
圖1 人工神經(jīng)元結(jié)構(gòu)圖Fig.1 Structure of artificial neurons
根據(jù)生物神經(jīng)元的特性將輸入值vi與權(quán)值wji相乘,加上函數(shù)偏置向量bi得到神經(jīng)元輸出x,量化后通過相應的激活函數(shù)f(·),最后由激活函數(shù)f(·)來決定特定神經(jīng)元是否被激活。
為了挖掘數(shù)據(jù)之間的復雜關(guān)系,深度學習將激活層加入到之前隱藏層的非線性輸出中[7],原理如式(1)所示。
y=f(wx+b),
(1)
式中,f(·)為w內(nèi)核的權(quán)值加上b的偏差,x為當前隱藏層的輸入,y為當前隱藏層輸出,同樣也是下一個隱藏層的輸入。
S系激活函數(shù)是神經(jīng)網(wǎng)絡中最早提出的一批激活函數(shù),由于它與生物神經(jīng)元的激活率[8]有相似的表達,因此廣泛應用于早期的神經(jīng)網(wǎng)絡中。S系激活函數(shù)主要有兩種類型:Sigmoid函數(shù)和雙曲正切函數(shù)(Tanh)函數(shù)。S系激活函數(shù)是一個增長函數(shù),它在線性和非線性行為之間保持平衡,如圖2所示。Sigmoid函數(shù)的取值范圍為0~1,Tanh函數(shù)則關(guān)于零點對稱,取值范圍為-1~1。
圖2 常用的激活函數(shù)示意圖Fig.2 Commonly used activation function diagram
由Sigmoid為代表的有一些眾所周知的激活函數(shù),如Sigmoid,Tanh,如圖2 (a),式(2)~(3)所示。
(2)
(3)
如圖2(a)所示,Sigmoid激活函數(shù)存在飽和區(qū)域和非原始對稱的缺點,當數(shù)據(jù)處于飽和區(qū)域時,反向傳播的梯度更新非常緩慢,非原點對稱的問題會阻礙和減慢訓練。激活函數(shù)克服了非原點對稱的缺點,但也存在飽和區(qū)的缺點。Sigmoid和Tanh的激活函數(shù)在反向傳播時也會出現(xiàn)梯度爆炸或梯度丟失的問題,因為它們的梯度相乘可能很大,也可能很小。基本激活函數(shù)的導數(shù)如式(4)~(5)所示。
(4)
(5)
通過導數(shù)計算得到激活函數(shù)Sigmoid 導數(shù)最大值為0.25,激活函數(shù)Tanh導數(shù)最大值為1。通過梯度的疊加計算,由于Sigmoid的導數(shù)小于1,因此多個小于1的導數(shù)相乘導致梯度非常小。同理,Tanh函數(shù)雖然要優(yōu)于Sigmoid,然而其梯度仍然小于1,因此難以避免的存在梯度消失的問題,導致模型難以收斂。
針對上述問題,研究者提出了ReLU激活函數(shù)[9-10],ReLU是一個分段函數(shù),當輸入為負時,輸出為0;否則,輸出等于輸入。ReLU的梯度為1,如式(6)所示,不會導致梯度爆炸或梯度丟失的問題,但會導致另一個問題,輸出總是大于0,忽略了負的輸入。式(7)為ReLU的導數(shù)形式。
(6)
(7)
針對ReLU激活函數(shù)的不足,學者們提出了許多改進的ReLU激活函數(shù),如Leaky ReLU (L-ReLU)、參數(shù)ReLU (P-ReLU)[11]。P-ReLU函數(shù)的參數(shù)和ELU函數(shù)的參數(shù)是可變的,因此它們可以更加適應不同的數(shù)據(jù)集,L-ReLU的參數(shù)是固定的,因此它泛化性則略有欠缺。文獻[12]提出一種新的激活函數(shù)方法——截斷線性單元(ELU),這種方法可以更好地捕捉到嵌入信號的結(jié)構(gòu),這些信號通常具有極低的圖像內(nèi)容信噪比,但如果截斷值很小,就會導致性能下降。改進后的ReLU激活函數(shù)如圖2(b),式(8)~(10)所示,其中α,β,?分別為ReLU系激活函數(shù)的參數(shù)。
(8)
(9)
(10)
文獻[13]研究發(fā)現(xiàn),新的組合激活函數(shù)可以通過結(jié)合基本的激活函數(shù)以數(shù)據(jù)驅(qū)動方式輸出,并提出了以分層組合基本激活函數(shù)集成適應不同的輸入。文獻[14]提出一種新的組合激活函數(shù),多參數(shù)指數(shù)線性單元MPELU。它由ReLU和ELU組合成,可以通過改變參數(shù)成為任何“ReLU家庭”成員,如ReLU,L-ReLU,P-ReLU。文獻[15-16]提出了基于ReLU改進版的激活函數(shù),它可以適應任何輸入,但仍存在梯度爆炸或梯度丟失的現(xiàn)象。
文獻[17]提出一種可訓練的激活函數(shù)和一種多層結(jié)構(gòu)多層Maxout網(wǎng)絡(MMN),它具有非飽和區(qū)的特點,并且可以近似任何激活函數(shù),這樣可以適應任何輸入,并且可以解決梯度爆炸或梯度消失問題,但需要付出的代價是大量的計算。文獻[18]嘗試在ReLU本身不變的情況下,用偽導數(shù)代替原有的ReLU導數(shù)。偽導數(shù)的設(shè)計是為了緩解零導數(shù)的問題,并與一般的原始導數(shù)保持一致,通過實驗表明,在CIFAR-10測試中,使用偽導數(shù)ReLU (Pseudo Derivative ReLU,PD-ReLU)可以明顯改善AlexNet。文獻[19]使用一種雙邊ReLU激活函數(shù)針對圖像處理問題,并比傳統(tǒng)ReLU精度更高。然而在某種程度上卻增加ReLU函數(shù)梯度爆炸和梯度消失的風險。激活函數(shù)作為熱點研究領(lǐng)域,無法列舉所有的激活函數(shù),本文主要測試研究現(xiàn)階段使用廣泛的一些激活函數(shù)。表1列出了現(xiàn)階段常用激活函數(shù)的優(yōu)勢及不足。
表1 主流激活函數(shù)的對比Tab.1 Comparison of mainstream activation functions
本節(jié)使用大量實驗來證明不同激活函數(shù)的有效性及其優(yōu)勢與不足。所有實驗均在本次實驗環(huán)境中,將Tensorflow作為本次深度學習實驗的框架模型。實驗環(huán)境: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。本節(jié)實驗選擇MNIST作為實驗測試的數(shù)據(jù)庫,手寫數(shù)字數(shù)據(jù)庫有一個包含60 000個示例的訓練集和一個包含10 000個示例的測試集。數(shù)字的大小已標準化并集中在固定大小的圖像中。通過計算像素的質(zhì)心,將圖像居中,并平移圖像,使該點位于28×28區(qū)域的中心。
如圖3(a)所示,在MNIST上測試了部分激活函數(shù)的有效性,各個激活函數(shù)的平均準確率高達99.3%,同時可得出在8層卷積層時對應的準確率更高。在圖3(b)中各個激活函數(shù)的準確率基本達到93%以上,但現(xiàn)有的激活函數(shù)在卷積層達到8~20層時,準確性下降較快。雙曲正切函數(shù)甚至只有33.83%的準確性。而L-ReLU和P-ReLU由于不涉及指數(shù)運算,且無死亡神經(jīng)元的問題,避免了梯度消失和梯度爆炸的問題,因此相比于ReLU和Tanh更具魯棒性。
圖3 部分激活函數(shù)的精度比較Fig.3 Precision comparison of partial activation functions investigated
表2和表3記錄了卷積層數(shù)分別2,6,10,20層下的CNN在MNIST數(shù)據(jù)集下的收斂時間。通過對比可知,由于每種激活函數(shù)涉及到的運算并不相同,不同的激活函數(shù)每次迭代所需的時間也不盡相同。相對于MNIST數(shù)據(jù)集,每次迭代的時間P-ReLU小于L-ReLU,大于Tanh和ReLU。且迭代的時間隨著卷積層數(shù)的變化而變化,例如當卷積層增至20層時,L-ReLU比P-ReLU慢2 000 000 μs左右,比Tanh要慢約5 999 167 μs。
表2 4種激活函數(shù)在2,6層卷積層下的收斂時間Tab.2 Convergence time of four activation functions under 2 and 6 convolution layers was tested
表3 4種激活函數(shù)在10,20層卷積層下的收斂時間Tab.3 Convergence time of four activation functions under 10 and 20 convolution layers was tested
為了驗證不同激活函數(shù)的泛化性,本次實驗使用選擇擅長處理序列數(shù)據(jù)[20-21]的循環(huán)神經(jīng)網(wǎng)絡,使用Tensorflow作為本次深度學習實驗的框架模型。實驗環(huán)境:Inter(R) Core(TM) i5-4590 CPU@3.30 GHz RAM:8 GB GPU:NVIDIA GeForce GTX 1060 3 GB。實驗基于3層隱藏層的循環(huán)神經(jīng)網(wǎng)絡。
本次實驗使用自收集大豆數(shù)據(jù)集,數(shù)據(jù)來源于國家糧食統(tǒng)計局、中國糧食年鑒等權(quán)威機構(gòu)。數(shù)據(jù)集分為訓練集及測試集兩部分。其中訓練集為1995—2007年中國大豆產(chǎn)值數(shù)據(jù),測試集為2008—2016年的大豆數(shù)據(jù)集,最后通過訓練后的RNN預測2008—2016年的大豆產(chǎn)值,并與實際的大豆產(chǎn)值對比得到最后的預測精度。其中訓練集為3 258條示例,測試集為2 172條示例。
由圖4中可知,在RNN下不同的激活函數(shù)對算法的精度同樣有很大的影響。可以看出使用Tanh激活函數(shù)時,對大豆的產(chǎn)值預測達到85%的精確度,而在P-ReLU激活函數(shù)下,達到了93%的預測精度,結(jié)合S激活函數(shù)存在較大飽和區(qū)的特點和最終的預測精度來看,S系激活函數(shù)應用在傳統(tǒng)的RNN中,造成的梯度消失問題嚴重的制約了算法的精度。同時在綜合上節(jié)卷積層中的實驗對比可得ReLU系激活函數(shù)的收斂時間可能更長,而其由于沒有梯度消失與梯度爆炸的問題,使得算法的精度要優(yōu)于S系激活函數(shù),其中P-ReLU由于其自適應性,無指數(shù)運算的特點在大豆數(shù)據(jù)集中達到了最高的精度預測。
圖4 不同激活函數(shù)下的循環(huán)神經(jīng)網(wǎng)絡對大豆產(chǎn)值的預測結(jié)果Fig.4 Prediction results of cyclic neural network under different activation functions on soybean output value
本文調(diào)研了目前使用較為廣泛的激活函數(shù),并在CNN和RNN中進行了測試對比。通過部分實驗對比,得出S系激活函數(shù)在迭代時間上要比ReLU系激活函數(shù)更少,而在精度上ReLU系要遠遠高于S系激活函數(shù)。不同激活函數(shù)對深度學習算法的性能影響很大,現(xiàn)階段在激活函數(shù)的改進上還沒有指導性的理論原則,因此激活函數(shù)的優(yōu)化仍然是改進深度學習的重點領(lǐng)域。下一步將針對現(xiàn)有激活函數(shù)的不足提出一種新的激活函數(shù)來優(yōu)化深度學習算法。