楊景明,杜韋江,吳紹坤,李 良,魏立新
(1.燕山大學 工業計算機控制河北省重點實驗室,河北 秦皇島 066004;2.國家冷軋板帶裝備及工藝工程技術研究中心,河北 秦皇島 066004)
軟件串行實現BP神經網絡一直存在網絡收斂速度過慢、實時性差的問題,而可編程邏輯器件FPGA的出現給神經網絡提供了一種有效的硬件實現方式。FPGA可通過并行計算的方式,在一個周期內完成多個運算,且其可編程以及可重構能力大大縮短了神經網絡的設計周期,這使得利用硬件實現大型神經網絡成為可能[1-3]。很多文獻也對這一課題進行了深入研究,但仍有一些不足之處,文獻[4]運用脈動門陣列的方法實現了BP神經網絡,但是大大降低了網絡的并行性;文獻[5]成功的運用查表法實現了BP神經網絡的sigmoid函數,但將更新權值存儲在RAM中的方式使得運算不夠靈活;文獻[6]成功利用1-3-1網絡對cosx函數進行了逼近,但沒有對相對復雜的函數進行進一步的驗證。
基于這一現狀,本文對激活函數實現、資源合理分配、以及存儲方式選擇等關鍵性問題進行了研究,并提出了寄存器循環緩存方式以及串并聯相結合的計算方法,對FPGA實現BP神經網絡進行了改進,有效節省了資源,提高了BP神經網絡的訓練速度。
最后利用簡單函數以及復雜函數對網絡進行了大量的實驗,并與軟件實現進行了對比,驗證了基于FPGA神經網絡的實時性以及高效性。
對于在FPGA中實現神經網絡,激活函數的選取和實現是關鍵問題之一。由于雙極性S函數既具有非常好的線性區域又具有非常好的非線性區域,使其能夠同時對小信號和大信號進行處理,對于存在負相關系的復雜函數其要比單極性S函數作為激活函數有一定的優勢。因此,本文選擇雙極性S函數作為神經網絡隱含層的激活函數,而輸出層則選擇對稱飽和線性函數作為激活函數。
非線性函數不能夠在FPGA中直接實現,只能通過某些方法對其進行逼近,對于硬件實現激活函數,需要充分考慮多方面的因素,這就意味著逼近效果最好的方式并不一定適合于硬件實現。本文通過綜合考慮FPGA資源與精度,選擇分段函數與查表法相結合的平滑插值法對雙曲正切函數進行逼近。這種函數逼近法實質上就是通過一系列的線性函數來對激勵函數進行擬合,然后所得系數利用查表的方式表示出來。將激勵函數分為不同的區間,并運用最小二乘法對多項式進行擬合,最終用多個線性函數將雙曲正切函數表示出來。因為雙曲正切函數的正區間與負區間關于原點對稱,所以為了節省資源,在取負值時,通過取絕對值帶入正值區域再取反的形式獲得,這種方式有效的節約了對FPGA資源的利用。圖1為分段函數在[0,1]、[1, 2]、[2, 3]、[3, 4]對雙曲正切函數進行分段逼近情況。

圖1 函數分段函數逼近情況
根據逼近情況可將雙曲正切函數分為5段,逼近函數與其絕對誤差見表1,可以看出,逼近函數的輸出值與雙曲正切函數的理論值誤差小于0.01,說明利用平滑插值法逼近在FPGA中實現激活函數完全可行。該模塊用quartus ii進行編譯之后,生成的雙極性S函數的電路原理如圖2所示,所占ALMS為220,不足實驗平臺FPGA芯片的1%;與利用polyfit實現單極性S函數相比,節省了更多的硬件資源[7],與分15段實現了S函數相比,不僅實現起來更加簡便,且精度更高[4]。相比之下該方法使函數的精度、性能與成本達到了一個更加良好的平衡。

表1 雙曲正切函數各區間逼近函數及誤差

圖2 雙極性S函數電路原理
如何通過合理的存儲方式來獲取和傳輸數據也是需要考慮的問題之一。大多數參考文獻均采用分布式RAM存儲激活函數的常數,而將權值及樣本數據存儲在 SRAM 或DRAM 等外部存儲器中,但由于片外存儲設備的帶寬限制,數據很難達到并行輸入輸出,使其不能直接滿足計算的需求[8]。因此本文使用了一種寄存器循環緩存的方法來進行權值的存儲,不僅給數據的輸入輸出提供了足夠大的位寬,而且使其在單時鐘內可以并行的輸入輸出。
如圖3所示,神經網絡初始權值由外部存儲設備給定,每次訓練后的數據既不存儲到外部存儲中去,也不存儲在FPGA片上固有的RAM中,而是直接緩存到寄存器中進行下一輪的學習,訓練全部結束或者遇到突發情況時才會將權值存儲到外部掉電可保存的設備中。圖4為通過quartus ii的邏輯編譯后所產生的部分邏輯單元,其中V11、V12、V13、V14為神經網絡更新后權值,其值將鎖存到寄存器中,并在下一次誤差運算之后發送出V_11、V_12、V_13、V_14作為待更新權值,然后與權值增量進行運算生成新的權值。得到的新權值不僅用于接下來乘累加運算,還要存儲在緩存寄存器中等待下一次的權值更新。這種存儲方式與FPGA的流水線方式相結合,可以大大減少對外部存儲的重復訪問,降低了存儲帶寬的耗費,提高了對片外資源的利用率。且與將權值存儲在片上RAM相比,不但簡化了整體網絡設計的復雜度,還使片上的存儲資源得到了合理的分配。

圖3 寄存器循環緩存結構原理

圖4 寄存器循環緩存結構邏輯
采用FPGA實現神經網絡是因為其良好的并行性與神經網絡的運算方式相符。但正是因為大多數設計與實現過分傾向于實現對神經網絡的高度并行,而忽略了阿穆達定律的含義,該定律指出最終的加速受到串行或者低速并行處理的限制。在一般情況下,神經網絡的結構形式在硬件中實現完全并行是不可能的,必然存在著一些順序處理,所以必須選擇最適合硬件的并行結構來完成神經網絡結構在FPGA中的最佳映射。本文采用并行與串行結構相結合的方式進行了BP神經網絡在FPGA中的實現,各層神經元之間采用并行運算,而模塊之間采用FPGA的流水線技術。
神經網絡的層與層之間采用FPGA的流水線的設計方法,主要是將原本一個時鐘周期完成的較大組合邏輯通過合理的切割后分由多個時鐘周期完成,這樣一來該部分運行的時鐘頻率將會有明顯提高。如圖5所示,采用這種設計,雖然第一次輸出有較大的延遲,但若干個周期后,每個時鐘周期都能進行一次輸出,大大提高了數據處理的頻率。流水線技術的應用,需要各模塊之間時序上能夠進行合理的分配,通過各種使能信號設定,使BP神經網絡在FPGA中實現多級流水線結構。

圖5 流水線實現結構
在具體設計過程中,程序設計采用了頂層模塊式結構,共分為隱層模塊、輸出模塊、誤差計算模塊、誤差更新模塊以及權值緩存模塊等5部分,而各模塊內部又可分為若干個子模塊,例如隱層模塊可分為輸入模塊、乘累加模塊、激活函數模塊,各部分內部均并行計算,模塊之間通過添加使能信號的方式實現流水線設計。如圖6所示,start0~start6使能信號分別控制著各模塊的運行,e為輸出層誤差,w_r1為隱層權值增量。可以看出,start1控制整個前向通道,start3為誤差計算模塊的使能信號,當經過一個時鐘周期后,輸出層誤差e發生變化,而start4為權值更新層的使能信號,當經過一個時鐘周期后,隱層權值增量w_r1發生變化。使能信號的設置是FPGA進行復雜電路設計時必不可少的環節之一,在同一時鐘下,通過寄存器邊沿觸發的方式產生使能信號,并將其傳輸到下一個處理的模塊中去,可以有效的避免模塊過多所產生的時序沖突,便于程序的時序約束及時序仿真。

圖6 使能信號的設置
正是因為FPGA獨特的流水線設計,使其在延時方面比GPU實現神經網絡有著核心的優勢,盡管GPU與FPGA一樣都能夠進行并行運算,但流水線深度受限的GPU因為數據延時高達毫秒級,而運用FPGA的深度流水線技術與并行相結合的方式可將延時控制在納秒級,對于流式計算任務,FPGA天生有延時方面的優勢。
本文選用DE1-SOC實驗平臺進行實驗驗證,該平臺選用Altera公司的CycloneV系列的5CSEMA5F31C6N芯片,并與PC平臺進行了實際計算效率對比。實驗所用芯片最大工作頻率為800MHz,ALMs為32070,且具有475個可使用的I/O接口,實驗所用PC配置為Intel(R)core(TM)i5-6500 CPU 3.20 GHz,內存為8G。分別在FPGA芯片與PC中運行相同的BP神經網絡結構,并進行對比。
程序使用21位定點小數進行實現,其中1位符號位,8位整數位,12位小數位,數據以-4096~+4096進行歸一化運算,運算結束后再將其反歸一化。本文通過實驗對數據精度進行了驗證,該表示方法可以完全滿足BP神經網絡的收斂運算。
參考文獻中出現很多運用BP神經網絡逼近sinx函數,本文也利用了1-6-1的BP神經網絡對sinx進行了逼近實驗。首先選擇31個數據,進行歸一化后先在PC中運用相同結構的神經網絡進行訓練,在誤差小于0.01時,程序完成收斂過程并結束。同時將樣本在[-4096,4096]區間內進行歸一化,隱層、輸出層權值為在PC訓練中隨機產生的初始權值,然后在Modlsim軟件中對FPGA實現的神經網絡進行訓練仿真,也同樣在誤差小于0.01時完成訓練,經過20次實驗后,將PC中的訓練結果與FPGA進行對比,見表2,數據為多次訓練后的平均值。

表2 PC與FPGA實現sinx比較
可以看出,對于簡單的函數,FPGA的訓練的速度要快于PC,但由于訓練時間都很短,所以利用FPGA實現神經網絡看不出明顯的優勢。
T=T13+T12-2.5*T1
(1)
其中,T1=sin(2*pi*x1)+ex2。
為了驗證FPGA硬件實現神經網絡在速度方面的優勢。文章利用2-12-1神經網絡逼近函數式(1)的T函數,選取70個歸一化后的訓練樣本進行訓練,首先運用PC實現同樣拓撲結構的BP的神經網絡,初始權重隨機給出,當誤差小于0.01時訓練結束,圖7為PC中訓練的函數逼近情況,然后利用PC中同樣的隨機權值,在FPGA中進行訓練,同樣誤差小于0.01時訓練結束,訓練結果如圖8所示,其中x1為一項輸入,y0為期望輸出,y為實際輸出,由圖可知,本次訓練在178 ms時完成對期望函數的逼近。FPGA資源消耗情況見表3,因為程序中運用了大量的乘累加運算,所以占用了所有的DSPS;訓練結束后,選取測試值對訓練好的網絡進行測試,測試結果見表4、表5,精度皆符合逼近要求。

圖7 PC逼近T函數

圖8 FPGA逼近T函數

資源占比/%ALMs10 192/32 07031.7Pins35/4578DSPS87/87100memory65 536/4 065 2802

表4 VS2010測試樣本

表5 FPGA測試樣本
為了證明實驗的普遍性,進行了20次的對比實驗,每次都由PC隨機給出初始權值,將在PC上運用VS2010訓練的結果與FPGA芯片訓練的結果做對比,結果見表6。

表6 PC與FPGA實現T函數比較
由實驗可知,利用FPGA能夠充分的發揮BP神經網絡的并行性,運用相同的網絡結構以及學習速率對相同的樣本進行訓練時,不但精度可以滿足BP神經網絡的收斂要求,而且訓練速度要遠遠快于在PC中的訓練。
為了驗證幾個關鍵性問題的改進可以對FPGA實現BP神經網絡進行優化,文章進行了進一步的對比實驗。其中一組為前文所提到的改進后的BP神經網絡,另一組BP神經網絡利用查表法實現激活函數Sigmoid,并在每次迭代后將權值存儲在外部存儲RAW中,同樣的條件下對T函數進行實現,對比結果見表7。

表7 在FPGA中利用不同方式實現T函數對比
根據對比可知,通過對激活函數、存儲方式實現的改進,不僅可以減少FPGA實現BP神經網絡所消耗的資源,而且可以提高BP神經網絡在FPGA中收斂的速度。
基于quartus ii對BP神經網絡進行了實現,并在利用Modlsim進行仿真的同時在開發板上進行了板級調試。通過提取的實驗數據驗證了該方法有效減少了實現激活函數所需要的芯片資源,增加了BP神經網絡訓練的并行性,提高了網絡的訓練速度。并通過與通用PC機實現BP神經網絡進行精度與效率之間的對比,在精度方面,FPGA上實現BP神經網絡的最大誤差小于0.01,滿足收斂所需要的精度。而在速度方面,FPGA的實現速度要遠遠超出PC機上的實現速度。
參考文獻:
[1]DONG Shuwei,ZHENG Bin,DU Pengfei.Vibration active control system design based on FPGA+DSP[J].Computer Engineering and Design,2015,36(8):2080-2083(in Chinese).[董淑偉,鄭賓,杜鵬飛.基于FPGA+DSP的振動主動控制系統設計[J].計算機工程與設計,2015,36(8):2080-2083.]
[2]Ji S,Xu W,Yang M,et al.3D Convolutional neural networks for human action recognition[J].IEEE Trans Pattern Anal Mach Intell,2013,35(1):221-231.
[3]Subirats J,Franco L,Jerez J.C-Mantec:A novel constructive neural network algorithm incorporating competition between neurons[J].Neutral Netw,2012,26:130-140.
[4]YANG Cheng.Research and implementation of artificial neural network based on FPGA[D].Xi’an:Xi’an University of Electronic Science and Technology,2016(in Chinese).[楊程.基于FPGA的人工神經網絡的研究與實現[D].西安:西安電子科技大學,2016.]
[5]ZHU Fang.Implementation and application of neural network based on FPGA[D].Guangzhou:Guangzhou University of Technology,2016(in Chinese)[祝芳.基于FPGA的神經網絡與應用[D].廣州:廣州工業大學,2016.]
[6]WANG Meng,CHANG Sheng,WANG Hao.Design of adaptive neural network based on BP neural network[J].Modern Electronic Technology,2016,39(15):115-118(in Chinese).[王蒙,常勝,王豪.一種自適應訓練的BP神經網絡FPGA設計[J].現代電子技術,2016,39(15):115-118.]
[7]LIU Peilong.Research and design of hardware implementation of neural network based on FPGA[D].Chengdu:University of Electronic Science and Technology,2012(in Chinese).[劉培龍.基于FPGA的神經網絡硬件實現的研究與設計[D].成都:電子科技大學,2012.]
[8]GU Zhijian.The research on parallel architecture for FPGA-based convolutional natural networks[D].Harbin:Harbin Engineering University,2013(in Chinese).[顧志堅.基于FPGA的卷積神經網絡并行結構研究[D].哈爾濱:哈爾濱工程大學,2013.]
[9]YU Zijian,MA De.FPGA-based accelerator for convolution neural network[J].Computer Engineering,2017,43(1):109-114(in Chinese).[余子健,馬德.基于FPGA的神經網絡加速器[J].計算機工程,2017,43(1):109-114.]
[10]SHI Changzhen,YANG Xue,WANG Zhensong.Design and realization of high performance parallel FFT processor[J]Computer Engineering,2012,38(2):242-247(in Chinese).[石長振,楊雪,王貞松.高性能并行FFT處理器的設計與實現[J].計算機工程,2012,38(2):242-247.]
[11]ZHOU Jinglong.A FPGA implementation of frequency domain anti jamming algorithm based on a structure of high speed FFT[J].Microelectronics & Computer,2014,31(5):32-35(in Chinese).[周景龍.基于高速FFT結構的頻域抗干擾算法的FPGA實現[J].微電子學與計算機,2014,31(5):32-35.]