徐文亮
(杭州電子科技大學(xué) 電子信息學(xué)院,浙江 杭州 310018)
人工神經(jīng)網(wǎng)絡(luò)的實現(xiàn)方法主要分為硬件實現(xiàn)[1]和軟件實現(xiàn)[2]兩種。神經(jīng)網(wǎng)絡(luò)軟件實現(xiàn)的方法具有并行度低和實現(xiàn)速度慢的特點,并且不能滿足神經(jīng)網(wǎng)絡(luò)對實時運算的要求。除此之外,最大的缺點是用軟件模擬實現(xiàn)的方法需要龐大體積的計算機作支持,這樣就很不適合應(yīng)用于嵌入式場景。基于硬件實現(xiàn)的神經(jīng)網(wǎng)絡(luò)具有運算速度快、并行性高等優(yōu)點[3],并且在實時運算方面也能滿足要求。綜合考慮,本文采用硬件實現(xiàn)的方法來設(shè)計人工神經(jīng)網(wǎng)絡(luò)。
本文設(shè)計的目的是找到一種方法——硬件實現(xiàn)的神經(jīng)網(wǎng)絡(luò)能夠進行動態(tài)調(diào)節(jié),既可以實現(xiàn)神經(jīng)網(wǎng)拓撲結(jié)構(gòu)的動態(tài)調(diào)節(jié),即每層網(wǎng)絡(luò)和每層神經(jīng)元的個數(shù)動態(tài)可調(diào),也可以實現(xiàn)輸入權(quán)值和閾值的自動更新。本文以BP神經(jīng)網(wǎng)絡(luò)為例,使用國產(chǎn)嵌入式CPU CK803S 及其SoC設(shè)計平臺SmartL-Prime,實現(xiàn)一款BP 神經(jīng)網(wǎng)絡(luò)SoC 的設(shè)計。
本文設(shè)計的BP 神經(jīng)網(wǎng)絡(luò)SoC 采用平頭哥(杭州中天微)提供的基于CK803S 嵌入式CPU 的SmartL-Prime 平臺。CK803S 是面向控制領(lǐng)域的32 位高能效嵌入式CPU核[4],采用了精簡的3 級流水線結(jié)構(gòu),具有低成本、低功耗等特點。BP 神經(jīng)網(wǎng)絡(luò)SoC 的系統(tǒng)結(jié)構(gòu)圖如圖1 所示。

圖1 BP 神經(jīng)網(wǎng)絡(luò)SoC 的系統(tǒng)框圖
圖1 中ANN IP 即為BP 神經(jīng)網(wǎng)絡(luò)加速器,通過系統(tǒng)總線掛載到SmartL-Prime 平臺上,系統(tǒng)總線使用了AHB-Lite總線為單主機結(jié)構(gòu)[5]。將CK803S 處理器作為主機,BP神經(jīng)網(wǎng)絡(luò)加速器作為從機,在處理器的控制下,通過AHB-Lite 總線實現(xiàn)對BP 神經(jīng)網(wǎng)絡(luò)加速器IP 核的訪問和數(shù)據(jù)的交互。設(shè)計的IP 經(jīng)過封裝打包完成后完成兼容AHB-Lite 的協(xié)議,將其掛載到總線上后,即可通過CK803S 作為主機,實現(xiàn)對神經(jīng)網(wǎng)絡(luò)IP 核的訪問。
BP 神經(jīng)網(wǎng)絡(luò)加速器的AHB-Lite 總線連接方式如圖2所示。BP 神經(jīng)網(wǎng)絡(luò)加速器為從機,主機CK803S 輸出BP神經(jīng)網(wǎng)絡(luò)加速器的地址,譯碼器產(chǎn)生了選通信號使能BP神經(jīng)網(wǎng)絡(luò)加速器,其余的地址輸出到多路復(fù)用器中,用于選通從機的輸出,從而通過系統(tǒng)總線讀取到BP 神經(jīng)網(wǎng)絡(luò)加速器的數(shù)據(jù)。對BP 神經(jīng)網(wǎng)絡(luò)加速器的寫操作與讀操作類似,地址穩(wěn)定之后有效,給BP 神經(jīng)網(wǎng)絡(luò)加速器發(fā)送寫使能信號,接收到就緒響應(yīng)后,往寫數(shù)據(jù)總線上輸出數(shù)據(jù),即可完成對BP 神經(jīng)網(wǎng)絡(luò)加速器的寫操作。

圖2 主機和BP 神經(jīng)網(wǎng)絡(luò)加速器的AHB-Lite 總線連接
圖3 所示為從機的選通信號通過譯碼器生成框圖。AMBA 的交互總線結(jié)構(gòu)和統(tǒng)一編址設(shè)計方便了系統(tǒng)的尋址,AHB-Lite 的單主結(jié)構(gòu)也簡化了總線的復(fù)雜度,減少了復(fù)雜的仲裁邏輯。

圖3 從機選通信號生成圖
為實現(xiàn)BP 神經(jīng)網(wǎng)絡(luò)的硬件設(shè)計,首先應(yīng)該完成神經(jīng)網(wǎng)絡(luò)的基本單元,即人工神經(jīng)元的硬件設(shè)計[6-8]。圖4是單個神經(jīng)元的運算過程示意圖。

圖4 神經(jīng)元運算過程示意圖
控制模塊的控制參數(shù)通過軟件可配置,來控制數(shù)據(jù)流在模塊間的傳輸,并最后將數(shù)據(jù)通過神經(jīng)元狀態(tài)模塊傳輸出去。首先控制模塊控制數(shù)據(jù)流從權(quán)值存儲模塊開始,權(quán)值和輸入向量一起被加載到乘累加模塊進行乘累加運算,接著將計算結(jié)果輸入到激活函數(shù)模塊,經(jīng)過該模塊計算后輸出到神經(jīng)元狀態(tài)模塊。
CPS(Connections-Per-Second)即每秒的連接率,是對神經(jīng)網(wǎng)絡(luò)硬件性能評估的一種重要的方法。為了測試訓(xùn)練的速度,往往通過每秒鐘聯(lián)接的更新率來評估。此外學(xué)習(xí)的速率也與選用的學(xué)習(xí)算法有關(guān)。
針對不同神經(jīng)網(wǎng)絡(luò)的設(shè)計,激活函數(shù)的選擇可以是不同的。本設(shè)計中,使用的激活函數(shù)是Sigmoid 函數(shù)和Guass 函數(shù)[9-10]。此外學(xué)習(xí)的速率也與選用的學(xué)習(xí)算法有關(guān)。神經(jīng)元具體的硬件設(shè)計如圖5 所示。
一個三層的BP 神經(jīng)網(wǎng)絡(luò)由輸入層、隱含層和輸出層組成[11]。如果具有足夠的隱含層神經(jīng)元數(shù),它就能以任意精度逼近任何連續(xù)的非線性函數(shù),所以BP 神經(jīng)網(wǎng)絡(luò)通常用來進行函數(shù)逼近和分類問題[12-13]。神經(jīng)網(wǎng)絡(luò)每進行一次完整的訓(xùn)練,BP 神經(jīng)網(wǎng)絡(luò)硬件都會進行一次誤差反向運算和前向運算,并會修改相應(yīng)的權(quán)值矩陣。隱含層和輸出層使用的函數(shù)分別是Sigmoid 函數(shù)和線性函數(shù)。本設(shè)計中將BP 神經(jīng)網(wǎng)絡(luò)的整個計算過程總結(jié)為以下幾個功能:激活函數(shù)運算Sigmod 模塊,誤差運算Error 模塊,權(quán)值修正與更新Updata 模塊,輸入輸出層RAM 存儲模塊以及功能可復(fù)用的神經(jīng)元乘累加模塊。
BP 神經(jīng)網(wǎng)絡(luò)的硬件實現(xiàn)整體結(jié)構(gòu)如圖6 所示。
從硬件實現(xiàn)框圖可以看出,BP 神經(jīng)網(wǎng)絡(luò)的層內(nèi)的執(zhí)行過程是并行的。整個神經(jīng)網(wǎng)絡(luò)的硬件實現(xiàn)過程如下:
(1)開始時把初始權(quán)值分別存放于隱含層權(quán)值RAM和輸出層權(quán)值RAM 中以及訓(xùn)練用到的樣本集存放在輸入層RAM 中,作為訓(xùn)練使用。
(2)根據(jù)對輸入層RAM 中的輸入和對于隱含層權(quán)值RAM 中的數(shù)值,對隱含層神經(jīng)元進行計算,送到MAC模塊進行累加計算,并將運算完成的結(jié)果輸出到激活函數(shù)模塊。

圖5 神經(jīng)元的硬件實現(xiàn)結(jié)構(gòu)

圖6 BP 神經(jīng)網(wǎng)絡(luò)的硬件實現(xiàn)整體結(jié)構(gòu)圖
(3)把激活函數(shù)的計算結(jié)果存放到隱含層輸出RAM 中。
(4)分別讀取隱含層輸出RAM 中的數(shù)據(jù)和輸出層權(quán)值RAM 中的權(quán)值數(shù)據(jù),輸出到MAC 模塊進行第二次乘累加運算,最終得到輸出層的輸出數(shù)據(jù)。至此,前向運算階段結(jié)束。
(5)誤差運算單元Error 用來計算隱含層的輸出和輸出層的輸出數(shù)據(jù)。至此,誤差反向傳播階段完成。
(6)將得到的誤差、輸入以及隱含層輸出送到權(quán)值修正和更新單元,得到新的權(quán)值,重新存入權(quán)值RAM 中[13]。
至此,整個神經(jīng)網(wǎng)絡(luò)完成一次完整的訓(xùn)練過程,接著重復(fù)訓(xùn)練其他樣本,直到滿足指定的訓(xùn)練步數(shù)或者是誤差滿足要求為止。這樣完成了對整個BP 神經(jīng)網(wǎng)絡(luò)硬件的實現(xiàn)。
神經(jīng)網(wǎng)絡(luò)加速器使用VHDL 實現(xiàn),通過Synopsys VCS的驗證環(huán)境,驗證神經(jīng)網(wǎng)絡(luò)IP 核的功能和邏輯[14-15],并使用了Assertion 方式進行了誤差分析。對于SoC 的測試軟硬件的協(xié)同設(shè)計,本文使用基于FPGA 的FMX7AR3B平臺,在基于CK803S 的SmartL-Prime 平臺進行設(shè)計之后,使用FPGA 平臺進行配置實現(xiàn)。使用CDK 工具鏈進行軟硬件協(xié)同設(shè)計和驗證[16]。
SoC 設(shè)計和驗證完成之后,本文使用Vivado 分析工具進行PPA(Perfromance Power Area,即性能、功耗和面積)分析。性能分析結(jié)果如圖7 所示,是Dhrystone 的基準跑分測試;當波特率設(shè)置為115 200Bd,數(shù)據(jù)位為8 位,無校驗位,停止位為1 位的情況下,結(jié)果為0.34 DMIPS/MHz,滿足設(shè)計要求。
圖8 所示為在Vivado 下查看的資源使用情況。從圖中可以看出Look Up Table 的資源使用率約為18%,BRAM 的資源使用率約為78%,IO 的資源使用率約為87%。

圖7 benchmark 跑分結(jié)果

圖8 資源使用情況