謝佳砼
(西安市宇航中學(xué),陜西西安,710038)
卷積神經(jīng)網(wǎng)絡(luò)已經(jīng)廣泛運用與識別,模仿生物識別有較高的準確,最近深度學(xué)習(xí)的算法受到廣泛關(guān)注,基于軟件硬件的加速方法相繼提出,軟件算法中較為突出的為二值網(wǎng)絡(luò)的加速,硬件FPFA的并行性得到了廣泛的應(yīng)用。
二值神經(jīng)網(wǎng)絡(luò)自從1943年提出以來,由于缺乏有效的從訓(xùn)練數(shù)據(jù)中學(xué)習(xí)網(wǎng)絡(luò)系數(shù)的算法,而且相關(guān)理論的發(fā)展沒有引起足夠的關(guān)注,從而迅速被單精度神經(jīng)網(wǎng)絡(luò)迅速超越,未成為神經(jīng)網(wǎng)絡(luò)研究應(yīng)用的主流,然而直至今日二值神經(jīng)網(wǎng)絡(luò)的使用價值被發(fā)現(xiàn)出來。在日新月異的現(xiàn)代社會里,科技日益更新?lián)Q代,互聯(lián)網(wǎng)信息的傳輸?shù)乃俣蕊@得格外重要,這時便少不了二值神經(jīng)網(wǎng)絡(luò)。
而二值卷積神經(jīng)網(wǎng)絡(luò)和普通的神經(jīng)網(wǎng)路相比有什么樣的優(yōu)點或缺點呢?從優(yōu)勢上來講,最大的一點就是其計算的簡單性,相較于普通的神經(jīng)網(wǎng)絡(luò),二值神經(jīng)網(wǎng)絡(luò)的運算簡單性體現(xiàn)在網(wǎng)絡(luò)中間值與網(wǎng)絡(luò)參數(shù)的簡單性,將浮點運算簡化成為了整數(shù)計算,這無疑大大提升了其運算的速度,由于計算的量減少,所以其功耗也大大減少,這也其另一個優(yōu)點。但是,二值神經(jīng)網(wǎng)絡(luò)的缺點也很明顯,由于其算法將參數(shù)約束到+1和-1之間,所以其反在向傳播中存在求導(dǎo)的問題,導(dǎo)致其預(yù)測準確率不夠高,而這也是我們要解決的一個問題。用如何方式運算得到更高精度的深度卷積網(wǎng)絡(luò),成為了一大難題。
二值神經(jīng)網(wǎng)絡(luò)的發(fā)展和改進會大大的改造人類現(xiàn)在的生活情況,造福于社會生活,同時二值神經(jīng)網(wǎng)絡(luò)的原理十分新穎,走在時代的前沿,專家認為二值神經(jīng)網(wǎng)絡(luò)的發(fā)展會使完全的自動駕駛成為現(xiàn)實,其中二值神經(jīng)網(wǎng)絡(luò)的運輸簡便性則是信息快速運輸?shù)幕A(chǔ),從而進一步實現(xiàn)實時傳遞。同時,想通過前沿文獻的閱讀基本了解二值網(wǎng)絡(luò)神經(jīng)的運行機制,并且通過計算機的幫助進一步加深對二值神經(jīng)網(wǎng)絡(luò)的了解。
雖然深度卷積神經(jīng)網(wǎng)絡(luò)在許多計算機視覺任務(wù)中已經(jīng)取得了相當好的性能,但是大的復(fù)雜的計算和參數(shù)大小阻礙了其在移動設(shè)備上的應(yīng)用。 所以提出了各種方法來緩解這些問題:
(1)網(wǎng)絡(luò)的修剪
從原理上來講,神將網(wǎng)絡(luò)的層數(shù)越多參數(shù)越多,最后所接受到的信息就會越精確,但是越精確也就意味著我們需要消耗更多的時間去進行計算,所以想要減少計算量就需要利用到網(wǎng)絡(luò)修建技術(shù),也就是把傳遞的信息中作用不大的信息給修剪掉,進而使得運算速率變快。若過多的參數(shù)會使得網(wǎng)絡(luò)過擬合,訓(xùn)練起來過慢效果不佳,使得測試集誤差過大,若過少的參數(shù)會使得網(wǎng)絡(luò)無法訓(xùn)練,使得訓(xùn)練集誤差無法縮減。選取合適的參數(shù)是一個很重要的問題,需要得到一個性價比最好的參數(shù)。
(2)網(wǎng)絡(luò)的數(shù)據(jù)降維
在平時的生活中會利用計算機去處理一些復(fù)雜的問題,但是處理的文件越復(fù)雜其維度也就越高也就越難處理,所以數(shù)據(jù)降維也就是把數(shù)據(jù)的維度降低了,再進一步理解就是有用數(shù)據(jù)的保留和無關(guān)數(shù)據(jù)的丟棄,便于計算的可視化,其方法則是將高緯度的的數(shù)據(jù)特征映射到低維度再進行處理。選取合適的維度是一個重要的裁剪網(wǎng)絡(luò)的方式,可以大大的降低網(wǎng)絡(luò)的復(fù)雜度。
(3)哈希與神經(jīng)網(wǎng)絡(luò)
哈希算法是平時解決網(wǎng)絡(luò)數(shù)據(jù)處理問題的一個重要的方法,而在這里又將哈希算法與神經(jīng)網(wǎng)絡(luò)加以結(jié)合,能夠使神經(jīng)網(wǎng)絡(luò)的計算速度變快,將原來的浮點型權(quán)值映射到二值。哈希算法是一個映射,應(yīng)用哈希映射在深度卷積網(wǎng)絡(luò)是一個較為有效的方式。如何在網(wǎng)絡(luò)中完成哈希運算是我們需要深思的問題。
BNN在本節(jié)中我們詳細介紹了二值化函數(shù),以及我們?nèi)绾斡盟鼇碛嬎銋?shù)梯度,以及我們?nèi)绾畏聪騻鞑ニ?。反向傳播遇到了無法求導(dǎo)的問題,如何解決這個問題是一個我們需要解決的難點。
訓(xùn)練BNN時,我們將權(quán)值和激活值約束在+1和-1之間,從硬件角度來看,這兩只是十分有利于計算的,所以,為了將變量轉(zhuǎn)換稱這兩個值,我們使用了兩種不同的二值化函數(shù)。
我們第一個使用的是確定性的
其中 Xb是二值化變量(權(quán)值或激活值),x是實值變量。它實現(xiàn)起來非常簡單,并且在實踐中運行得十分良好。
我們第二個使用的是隨機性的:
其中σ是一個硬性的sigmoid函數(shù):
隨機二值化函數(shù)比符號函數(shù)更具吸引力,但實際上更難實現(xiàn),因為它需要硬件在量化時生成隨機的數(shù)值。 因此,我們主要使用確定性二值化函數(shù)(即符號函數(shù))。
雖然我們的訓(xùn)練是用二值化的權(quán)值和激活值來計算參數(shù)梯度的,但是根據(jù)確定性算法,在每次的參數(shù)計算后都需要權(quán)重的積累和更新。由于梯度具有累加效果,也就是說梯度是帶有一定噪音的。所以通過在每個權(quán)重中累積的隨機梯度貢獻來平均噪聲,多次累加梯度才能把噪音平均消耗掉。而且,二值化也就是給權(quán)值和激活值增添了噪聲,而這樣的量化噪聲是能夠很好的去調(diào)節(jié)權(quán)值,可以防止模型過擬合。我們訓(xùn)練BNN的方法可以看作是Dropout的一種變型,在計算參數(shù)梯度時,我們不是將激活值的一半隨機設(shè)置為零,而是將激活和權(quán)重二值化,二值化則是將另一半變成1,所以可以看做是進一步的Dropout。
由決定式算法我們可以看出,對其直接求導(dǎo)得出的值全部是零,很顯然它對于反向傳播來說很不合適,對于權(quán)值就無法進行一個更新,所以說我們引入了一個硬性的寬松函數(shù),對Sign(x)函數(shù)進行一個寬松,這樣我們就可以進行求導(dǎo)了。
我們遵循類似的方法考慮到了符號函數(shù)的量化,并假設(shè)已獲得梯度的估計量g,然后我們對于的估算就q會很簡單。
即:
圖1 sign(x)函數(shù)以及Htanh(x)函數(shù)
其中1|r|<=1的計算公式就是Htanh。
對于隱藏層,我們使用符號函數(shù)非線性來獲得二值化的激活值,對于權(quán)重,我們將兩個成分組合在一起:
W 投影到-1或1。 否則,權(quán)值會變得非常大,而不會對二值化的權(quán)重產(chǎn)生任何影響。
再向前傳遞的過程中,我們先需要對權(quán)值進行一個二值化處理,處理之后,對二值化的權(quán)值進行一個伸縮處理,之后會得到一個中間值以及網(wǎng)絡(luò)參數(shù)θ,最后對于中間量和參數(shù)進行歸一化處理更新伸縮量。
再向后傳遞的過程中,因為我們之前把二值函數(shù)轉(zhuǎn)化成為了一個可導(dǎo)的函數(shù),所以我們要先求出其參數(shù)梯度,然后將參數(shù)梯度、中間量、網(wǎng)絡(luò)系數(shù)三個值進行反歸一化處理,就能夠得到中間量和系數(shù)的導(dǎo)數(shù),由于:
所以我們可以得到:
而在梯度參數(shù)的積累中,我們先利用網(wǎng)絡(luò)的參數(shù)θ及其導(dǎo)數(shù)和學(xué)習(xí)值η去更新網(wǎng)絡(luò)的參 數(shù),進而的到所需的權(quán)值,最后再用一個λ去逐漸減少學(xué)習(xí)值η,進而達到信息反向傳遞的目的。
而h( x)和g( w)則是x和w的哈希函數(shù),也就是說將x和w映射到+1和-1上,在之前曾經(jīng)提到過:
這是最原始的二值函數(shù),也就是將二值的權(quán)重與哈希結(jié)合在了一起,但是在這里并不使用這個函數(shù),而去借用哈希進行一個映射,而關(guān)于這個映射則需要使:
達到最小,在這里我受到了Rastegari的啟發(fā),引入了一個A,進而得到了:
其中A是對角矩陣, ai=Aii是Bi的縮放因子,最后我們的目標函數(shù)是:
由上一個公式我們又可以得到:
而在這里需要的是將αi看成常數(shù),用這個公式去更新Bi,則令Z=α·X, q=α·XSi,且 T r()是一個求跡函數(shù),代換后可以得到:
所以用這樣的一個公式就可以很容易地進行求導(dǎo),進而對Bi進行更新,那么對于α的更新也同樣需要上面所說的函數(shù)對α進行更新,首先要對其求導(dǎo):
令其導(dǎo)數(shù)等于零,則得到:
最后對α進行更新。
再回歸到求最小值上,還是由于二值函數(shù)求導(dǎo)是沒有辦法算出參數(shù)梯度的,所以我又通過運用Shen等人在2015年所推導(dǎo)出的公式去進行一個最小值的運算:
在這個式子里Bi代表著在B這個矩陣中只有第i列在不斷更新,而就是把Bi去掉后B中的所有數(shù)據(jù), 而則是將Z的第j行給去掉后的所有數(shù)據(jù),v就是Z的第j行,qj是q向量中的第j個元素。
若要取得最小值,就要使其乘積為負值,那么就得到了:
本文從解決實際生活中因計算量過大無法進行實時傳播,以及功耗過大導(dǎo)致其無法很好的運用到移動設(shè)備上,從而提出了二值化卷積神經(jīng)網(wǎng)絡(luò),以及運用哈希映射簡化了其運算的復(fù)雜程度,BNN大幅減少內(nèi)存和訪問所需的大小,并重新將大多數(shù)算術(shù)運算放在逐位運算中,這可能會使功耗大大降低,使得其在小的智能設(shè)備上使用,以及實時傳遞的實現(xiàn)。
可以在未來應(yīng)用可以實時自動駕駛,以及監(jiān)控拍攝,道路預(yù)測。