肖望勇,張駕祥,徐界銘,譚會生
(湖南工業(yè)大學(xué) 交通工程學(xué)院,湖南 株洲 412007)
人工神經(jīng)網(wǎng)絡(luò)作為人工智能的關(guān)鍵技術(shù),已經(jīng)成為世界各國爭相發(fā)展的戰(zhàn)略技術(shù)之一,也是新一輪科技和產(chǎn)業(yè)變革的重要驅(qū)動力量.FPGA因?yàn)榫哂锌芍貥?gòu)、低功耗、易控制、高性能等優(yōu)勢[1-2],所以非常適合被用于實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò).近年來,其在深度學(xué)習(xí)領(lǐng)域的應(yīng)用也越來越多,許多大型公司(如百度、微軟、IBM等)都有專門的FPGA研發(fā)團(tuán)隊(duì).在人工神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)過程中,需要對大量的非線性激活函數(shù)進(jìn)行計(jì)算,因此在該領(lǐng)域內(nèi)研究FPGA如何高速地處理非線性激活函數(shù)具有十分重要的意義.在機(jī)器學(xué)習(xí)領(lǐng)域,尤其是深度卷積神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)中,softmax是一個(gè)常用并且非常重要的函數(shù),它以概率形式來顯示多種分類結(jié)果,在多分類應(yīng)用場景被廣泛使用.
FPGA因其可重構(gòu)技術(shù)的靈活性,如今已成為解決復(fù)雜函數(shù)高速計(jì)算問題的強(qiáng)大工具.目前用FPGA計(jì)算復(fù)雜函數(shù)的常用方法有CORDIC算法[3]、查找表法[4]、泰勒級數(shù)展開法[5]、多項(xiàng)式擬合法[6]等.其中,CORDIC算法是一種通過多次迭代將復(fù)雜運(yùn)算轉(zhuǎn)換為僅需移位和加法運(yùn)算的算法,其資源需求較少.但是,隨著精度要求的提高,迭代次數(shù)增加,其運(yùn)行速度就會降低.查找表法是將不同輸入值對應(yīng)的計(jì)算結(jié)果事先保存在ROM中,使用時(shí)直接從內(nèi)存中提取結(jié)果,省去了復(fù)雜的運(yùn)算,運(yùn)算速度快并且容易實(shí)現(xiàn),但隨著精度要求的提高,查找表法也需耗費(fèi)大量的存儲資源.泰勒級數(shù)展開法,隨其階次的增加,會加大乘法和加法器的使用量,資源消耗非常大.多項(xiàng)式擬合非線性函數(shù),隨著擬合函數(shù)階次的增大,會消耗大量的乘法器資源.神經(jīng)網(wǎng)絡(luò)對激活函數(shù)的擬合需要的階次較多,計(jì)算1個(gè)函數(shù)值就需要許多乘法器,且消耗時(shí)間長.
為解決上述問題,本文采用分段非線性逼近法來處理softmax函數(shù),即將softmax函數(shù)在一定范圍內(nèi)劃分為幾段,每段均用次數(shù)較低的多項(xiàng)式進(jìn)行擬合.這種方法不僅可以保證計(jì)算精度,還可以減少計(jì)算的時(shí)間,較好地平衡了兩者之間的矛盾,并且它還具有資源耗費(fèi)少的優(yōu)點(diǎn),實(shí)現(xiàn)也比較方便.
假設(shè)有1個(gè)數(shù)組V,Vi是數(shù)組中第i個(gè)元素,則這個(gè)元素的softmax值是Si= ei/ ∑ ei.其中,Si表示Vi的softmax值,即第i個(gè)元素的指數(shù)與所有元素指數(shù)和的比值;分母 ∑ ei是所有元素指數(shù)的和,為固定值.顯然,只需對其中的ei進(jìn)行擬合即可.下面,對分子ei進(jìn)行擬合分析.
文獻(xiàn)[7]用傳統(tǒng)分段非線性擬合函數(shù)ei得到了較高的精確度,但未給出具體的分段方式.為了進(jìn)一步提高精度,可采用非均勻分區(qū)的非線性函數(shù)擬合ei,其擬合原理參見文獻(xiàn)[8].函數(shù)的N+1階導(dǎo)數(shù)的絕對值越大或越小,表示此函數(shù)在該點(diǎn)處使用N階多項(xiàng)式進(jìn)行逼近的誤差也越大或越小,所以,該點(diǎn)對應(yīng)分段區(qū)間的間隔應(yīng)該取較小或較大的值.根據(jù)ei的N+1階導(dǎo)數(shù)依然是ei的性質(zhì),說明使用N階多項(xiàng)式進(jìn)行逼近的誤差隨i的增大而增大,所以,分段區(qū)間的間隔應(yīng)該隨i的增大而減小.由于ei函數(shù)值會隨i的增大呈指數(shù)上升,擬合函數(shù)右端區(qū)間的誤差相對于其他區(qū)間會偏大.針對這一問題,通過均勻分段和多次隨機(jī)分段發(fā)現(xiàn),若函數(shù)ei在區(qū)間(?8, 8)上以整數(shù)6為分界線,則大于分界線的區(qū)間誤差比小于分界線的區(qū)間誤差要大得多.因此,對大于分界線的區(qū)間,即(6, 8),將其區(qū)間間隔設(shè)置為<1;而對小于分界線的區(qū)間,即(?8, 6),將其區(qū)間間隔設(shè)置為>1.對其他函數(shù)的擬合思路也是如此,即先通過均勻分段和多次隨機(jī)分段找出誤差大的集中范圍,再針對該范圍給予相對較小的區(qū)間間隔,從而得到更高的精度.
python具有簡單易學(xué)、運(yùn)行速度快、易于維護(hù)等優(yōu)點(diǎn),還具有豐富的函數(shù)庫,其功能十分強(qiáng)大,是現(xiàn)在計(jì)算機(jī)程序設(shè)計(jì)的主流語言之一,非常適用于人工智能領(lǐng)域.因此,本研究選用python語言來完成函數(shù)的擬合,開發(fā)軟件選用jupyter notebook.函數(shù)擬合的具體步驟如下:先調(diào)用numpy庫中的polyfit函數(shù)進(jìn)行擬合,再調(diào)用matplotlib庫進(jìn)行圖像的繪制.在擬合過程中應(yīng)綜合考慮計(jì)算速度和所需資源,將函數(shù)ei在區(qū)間(?8, 8)分為9個(gè)子區(qū)間進(jìn)行擬合,根據(jù)前文所提的高精度二次非線性擬合方法,設(shè)置好分段區(qū)間間隔.python擬合的具體流程如圖1所示,擬合的函數(shù)曲線如圖2所示.從圖2可以看出,擬合函數(shù)曲線與指數(shù)函數(shù)曲線幾乎重合,這說明函數(shù)的擬合效果良好.
圖1 非線性雙擬合的python擬合流程
圖2 非線性雙擬合的python擬合函數(shù)曲線
各分段區(qū)間的擬合函數(shù)如表1所示.在區(qū)間(?8, 8)隨機(jī)取10個(gè)輸入數(shù)據(jù),取點(diǎn)精度為0.01,所得擬合函數(shù)值的誤差如表2所示.
表1 python分段擬合softmax函數(shù)
由表2可看出,softmax函數(shù)隨機(jī)點(diǎn)用python擬合的絕對誤差均<0.01,相對誤差也基本<0.4%;靠近圖像右端區(qū)間的點(diǎn)的絕對誤差只有0.001,相對誤差<0.01%.這說明擬合函數(shù)的右端區(qū)間誤差相對其他區(qū)間偏大的問題得到了解決,其整體精度也較高,即利用python語言和改進(jìn)的分段方式,對softmax函數(shù)的擬合效果良好.
表2 softmax函數(shù)隨機(jī)點(diǎn)的python擬合結(jié)果
實(shí)驗(yàn)使用美國XILINX公司的XC7A35T-1CPG236C FPGA平臺來實(shí)現(xiàn)函數(shù)擬合.從表1可知,python擬合的softmax函數(shù)是由加法和乘法組成的多項(xiàng)式,所以FPGA實(shí)現(xiàn)的硬件電路會用到乘法器和加法器,可使用Vivado軟件在其Block Design中調(diào)用IP核來實(shí)現(xiàn)擬合函數(shù)的硬件電路,指數(shù)函數(shù)的擬合表達(dá)式為
FPGA實(shí)現(xiàn)的結(jié)構(gòu)如圖3所示.
圖3 非線性雙擬合函數(shù)的FPGA實(shí)現(xiàn)
在FPGA中實(shí)現(xiàn)浮點(diǎn)數(shù)的乘法運(yùn)算有2種方法,即定點(diǎn)小數(shù)運(yùn)算和浮點(diǎn)運(yùn)算.定點(diǎn)小數(shù)運(yùn)算雖然方便,但由于運(yùn)算過程會舍棄一些位數(shù),降低了運(yùn)算精確度,所以這里采用浮點(diǎn)運(yùn)算專用IP核Floating-point.此IP核在浮點(diǎn)運(yùn)算方面的性能非常好,符合IEEE-754標(biāo)準(zhǔn),并且它使用的是AXI4-Stream總線協(xié)議,其高效、易用的特點(diǎn)適合在神經(jīng)網(wǎng)絡(luò)中使用.
擬合函數(shù)表達(dá)式y(tǒng)=Ax3+Bx2+Cx+D的具體實(shí)現(xiàn)過程如下:首先,創(chuàng)建Block Design文件,并在其中添加IP核Floating-point;其次,對IP核進(jìn)行設(shè)置(可設(shè)置為加法器或乘法器),并設(shè)定為雙精度的浮點(diǎn)數(shù)運(yùn)算;然后,繪制好電路,添加端口和連線,完成后檢查程序框圖是否有誤;最后,點(diǎn)擊Create HDL Wrapper,添加Testbench代碼,即可開始仿真測試.分段區(qū)間的FPGA擬合函數(shù)如表3所示,F(xiàn)PGA仿真結(jié)果如圖4所示.
表3 FPGA分段擬合softmax函數(shù)
圖4 softmax函數(shù)的FPGA仿真結(jié)果
隨機(jī)在區(qū)間(?8, 8)取10個(gè)數(shù),利用FPGA硬件電路進(jìn)行計(jì)算,其擬合結(jié)果如表4所示.其中,當(dāng)x=7.90時(shí),浮點(diǎn)數(shù)IP核所使用的是IEEE-754標(biāo)準(zhǔn)數(shù),所得結(jié)果y為40A512900EC489C0,轉(zhuǎn)換為浮點(diǎn)數(shù)約等于2 697.281 362 668 814 8,而當(dāng)i=7.90時(shí),ei=2 697.282 328 268 510,兩者絕對誤差約為0.001.
表4 softmax函數(shù)隨機(jī)點(diǎn)的FPGA擬合結(jié)果
從表4可以看出,softmax函數(shù)隨機(jī)點(diǎn)FPGA擬合結(jié)果的絕對誤差均<0.015,相對誤差基本<1.2%;擬合函數(shù)曲線右端區(qū)間的點(diǎn)的絕對誤差約為0.001,相對誤差<0.01%.這說明FPGA對softmax函數(shù)的整體擬合效果良好,精度較高,并且有效地解決了ei擬合函數(shù)的右邊區(qū)間點(diǎn)誤差偏大的問題.通過仿真測試還發(fā)現(xiàn),softmax函數(shù)的擬合運(yùn)算時(shí)間在納秒級,單次運(yùn)算的平均時(shí)間在3.75 ns左右.
為進(jìn)一步驗(yàn)證本文所提擬合方法的性能,將該方法與文獻(xiàn)[7]的分段函數(shù)擬合方法在同樣的平臺下進(jìn)行實(shí)驗(yàn)對比,具體結(jié)果如表5所示。
表5 不同方法的FPGA擬合性能對比
由表5可以看出,采用本文變區(qū)段非線性雙擬合方法和文獻(xiàn)[7]所提的分段非線性擬合方法來實(shí)現(xiàn)softmax函數(shù),其精度與計(jì)算速度均有了較大的提升。
本文針對人工神經(jīng)網(wǎng)絡(luò)常用的softmax函數(shù),基于其指數(shù)函數(shù)的特性,提出了一種變區(qū)段非線性雙擬合方法.首先,通過均勻分段和隨機(jī)分段找出誤差較大或較小的區(qū)間,對不同誤差的區(qū)間進(jìn)行不同間隔的分段,即變區(qū)段二次非線性擬合;其次,運(yùn)用python進(jìn)行softmax函數(shù)的擬合逼近實(shí)驗(yàn),并最終在FPGA上得以實(shí)現(xiàn).所提方法解決了使用分段非線性擬合法在某些區(qū)間點(diǎn)誤差較大的問題,且在保持較高擬合精度的同時(shí),利用FPGA來實(shí)現(xiàn)還使得系統(tǒng)具有良好的實(shí)時(shí)性.