李增剛,王正彥,孫敬成
青島大學(xué) 電子信息學(xué)院,山東 青島 266071
人工神經(jīng)網(wǎng)絡(luò)在信息處理、人工智能、圖像識(shí)別等領(lǐng)域廣泛應(yīng)用,它是由大量神經(jīng)元組成的具有復(fù)雜運(yùn)算和監(jiān)督學(xué)習(xí)特性的系統(tǒng)。經(jīng)過(guò)70多年專家和學(xué)者的努力,神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)、算法不斷優(yōu)化和完善[1]。手寫(xiě)數(shù)字識(shí)別是神經(jīng)網(wǎng)絡(luò)重要領(lǐng)域之一,軟件實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)用數(shù)據(jù)串行傳送方式,而神經(jīng)網(wǎng)絡(luò)并行傳送數(shù)據(jù)的特點(diǎn),正好利用了FPAG數(shù)據(jù)并行計(jì)算和信息實(shí)時(shí)處理的優(yōu)點(diǎn),滿足了工業(yè)控制領(lǐng)域?qū)?shù)據(jù)實(shí)時(shí)處理的要求[2]。隨著FPGA技術(shù)的發(fā)展,集成和內(nèi)部邏輯單元增多,例如Altera公司生產(chǎn)的FPGA 產(chǎn)品門(mén)電路數(shù)量有百萬(wàn)門(mén),集成了PowerPC、Gbits高速乘法單元硬核處理器和MicroBlaze、Picoblaze、Nios 軟核處理器,增強(qiáng)了 FPGA 芯片的處理能力[3]。文獻(xiàn)[3]研究了用平滑插值法在FPGA 上實(shí)現(xiàn)BP神經(jīng)網(wǎng)絡(luò)的S型激活函數(shù),并用深度流水線技術(shù)實(shí)現(xiàn)網(wǎng)絡(luò)串并聯(lián)。文獻(xiàn)[4]介紹了在FPGA 上對(duì)tan-s函數(shù)的高精度實(shí)現(xiàn),并用可重構(gòu)性充分利用FPGA 邏輯資源,對(duì)結(jié)果進(jìn)行仿真。文獻(xiàn)[5]介紹了FPGA通過(guò)串口與PC機(jī)通信,實(shí)現(xiàn)圖像卷積處理,利用并行性提升速度,同時(shí)減少帶寬和資源的占用。
BP神經(jīng)網(wǎng)絡(luò)算法由前向運(yùn)算、誤差反向傳播、權(quán)重和偏置更新構(gòu)成。網(wǎng)絡(luò)帶權(quán)輸入、激活值、判決輸出是前向運(yùn)算結(jié)果;誤差、梯度、權(quán)重和偏置更新在神經(jīng)網(wǎng)絡(luò)反向運(yùn)算過(guò)程[6]。BP算法的流程如圖1所示。
圖1 BP算法的流程示意圖
網(wǎng)絡(luò)的前向運(yùn)算:訓(xùn)練樣本x根據(jù)BP 算法計(jì)算網(wǎng)絡(luò)隱藏層的a(2)、輸出層的a(3),輸出訓(xùn)練樣本判決結(jié)果y;網(wǎng)絡(luò)的反向運(yùn)算:先計(jì)算最后1 層誤差δ(3),計(jì)算梯度更新輸出層偏置b(3)、權(quán)重w(3),再算前1層誤差δ(2),計(jì)算梯度更新隱藏層偏置b(2)、權(quán)重w(2),把它們存入存儲(chǔ)器里作為下次訓(xùn)練樣本的第2、3層網(wǎng)絡(luò)權(quán)重和偏置。
手寫(xiě)數(shù)字BP網(wǎng)絡(luò)有輸入層、1個(gè)隱藏層和輸出層共3層,輸入層有784個(gè)神經(jīng)元,隱藏層有30個(gè)神經(jīng)元,輸出層有10 個(gè)神經(jīng)元[7],數(shù)字像素?cái)?shù)據(jù)由輸入層傳入,經(jīng)運(yùn)算傳給隱藏層,最后由輸出層輸出判決數(shù)字0~9。神經(jīng)網(wǎng)絡(luò)第2、3層初始權(quán)重和偏置服從均值為0,方差為1的高斯分布。
BP 神經(jīng)網(wǎng)絡(luò)前向運(yùn)算的第l層的帶權(quán)輸入與激活值、權(quán)重、偏置的關(guān)系式以第2層網(wǎng)絡(luò)為例的展開(kāi)式如下。
輸入層784 個(gè)神經(jīng)元上的像素?cái)?shù)據(jù)乘以各自的權(quán)重,累乘和傳給隱藏層30個(gè)神經(jīng)元,加上對(duì)應(yīng)的偏置得到第2層神經(jīng)元的30個(gè)帶權(quán)輸入,作為S型激活函數(shù)自變量算出第2層激活值是第3層網(wǎng)絡(luò)輸入數(shù)據(jù),計(jì)算方法與第2 層網(wǎng)絡(luò)相同得到第3 層激活值,網(wǎng)絡(luò)最后判決10 個(gè)中的最大值,輸出判別數(shù)字[8],例如是第3層網(wǎng)絡(luò)最大激活值,算法對(duì)樣本的識(shí)別就是數(shù)字6。
神經(jīng)網(wǎng)絡(luò)反向運(yùn)算是更新權(quán)重和偏置,并用MNIST集里測(cè)試樣本驗(yàn)證網(wǎng)絡(luò)識(shí)別準(zhǔn)確率[9]。二次代價(jià)函數(shù)是找到合適權(quán)重和偏置的方法,多次迭代使第3層網(wǎng)絡(luò)激活值接近期望值Y,最小化二次代價(jià)函數(shù)C(w,b)→0 表示BP網(wǎng)絡(luò)訓(xùn)練出合適權(quán)重和偏置[10]。為提高網(wǎng)絡(luò)訓(xùn)練速率,隨機(jī)選取m個(gè)小批量訓(xùn)練樣本更新網(wǎng)絡(luò)權(quán)重和偏置,網(wǎng)絡(luò)1 次迭代中60 000個(gè)訓(xùn)練樣本使網(wǎng)絡(luò)權(quán)重和偏置更新60 000/m次。權(quán)重和偏置更新公式如下:
計(jì)算網(wǎng)絡(luò)誤差是為計(jì)算梯度,更新網(wǎng)絡(luò)權(quán)重和偏置。第3層權(quán)重更新公式及展開(kāi)式(6),第3層偏置更新公式及展開(kāi)式(7),η網(wǎng)絡(luò)學(xué)習(xí)速率η=3,網(wǎng)絡(luò)小批量訓(xùn)練樣本數(shù)m=10 。第2 層權(quán)重梯度計(jì)算及展開(kāi)式與第3 層相比只有不同,Xk是訓(xùn)練樣本784個(gè)像素?cái)?shù)據(jù)。
根據(jù)python代碼中network庫(kù)架構(gòu)和BP算法原理,用Verilog 語(yǔ)言設(shè)計(jì)網(wǎng)絡(luò),訓(xùn)練樣本和網(wǎng)絡(luò)權(quán)值轉(zhuǎn)化為S7.12 標(biāo)準(zhǔn)的定點(diǎn)數(shù),其中S 表示符號(hào)位,7 表示整數(shù)位數(shù),12表示小數(shù)位數(shù)[11]。另一方面考慮S型激活函數(shù)及導(dǎo)數(shù)的線性擬合,數(shù)據(jù)串并行轉(zhuǎn)化,合理利用邏輯資源[12]。初始權(quán)重和偏置放在與.mif關(guān)聯(lián)的讀寫(xiě)RAM中。
BP網(wǎng)絡(luò)MNIST庫(kù)60 000個(gè)28×28的訓(xùn)練樣本,圖2是10個(gè)手寫(xiě)數(shù)字樣本,像素灰度值范圍0~255[13]。源文件1 個(gè)地址數(shù)據(jù)的高8 位和低8 位各一個(gè)樣本像素,每個(gè)樣本有自己標(biāo)簽,用Verilog 語(yǔ)言中的具有讀寫(xiě)功能的$fopen 函數(shù)讀取存放在文本文件中的樣本像素和標(biāo)簽,在網(wǎng)絡(luò)識(shí)別與訓(xùn)練時(shí)讀取并寫(xiě)入樣本存儲(chǔ)器。
圖2 MNIST庫(kù)10個(gè)手寫(xiě)數(shù)字樣本
BP 神經(jīng)網(wǎng)絡(luò)激活函數(shù)是Sigmoid 函數(shù)(S 型函數(shù)),表達(dá)式函數(shù)曲線如圖3(a)。Verilog代碼設(shè)計(jì)采用線性分割擬合S 函數(shù)曲線,分段擬合如圖3(b)。表1 是S 型分段函數(shù)的浮點(diǎn)數(shù)表達(dá)式,網(wǎng)絡(luò)帶權(quán)輸入Z和分段函數(shù)系數(shù)浮點(diǎn)數(shù)轉(zhuǎn)定點(diǎn)數(shù)標(biāo)準(zhǔn)分別是S7.12與S0.12[14]。
圖3 (a) S型激活函數(shù)曲線
圖3 (b) S型激活函數(shù)分段曲線
表1 S型分段函數(shù)的浮點(diǎn)數(shù)表達(dá)式
S激活函數(shù)線性擬合的定點(diǎn)數(shù)Verilog代碼如下:
S函數(shù)導(dǎo)數(shù)是,函數(shù)曲線如圖4(a)。Verilog語(yǔ)言設(shè)計(jì)σ'(z)函數(shù)分段線性擬合曲線如圖4(b)。表2是S函數(shù)導(dǎo)數(shù)σ'(z)的定點(diǎn)數(shù)分段表達(dá)式,系數(shù)定點(diǎn)數(shù)標(biāo)準(zhǔn)是S7.12。
圖4 (a) S型激活函數(shù)導(dǎo)數(shù)
圖4 (b) S型激活函數(shù)導(dǎo)數(shù)分段曲線
表2 S型導(dǎo)數(shù)分段函數(shù)的定點(diǎn)數(shù)表達(dá)式
兩個(gè)訓(xùn)練樣本為例的各層網(wǎng)絡(luò)信號(hào)流程如圖5,包括BP 網(wǎng)絡(luò)前向判決輸出和反向計(jì)算網(wǎng)絡(luò)誤差,1 次權(quán)重、偏置的更新[15],設(shè)計(jì)用的是10個(gè)訓(xùn)練樣本。RAM_x1、RAM_x2是兩個(gè)訓(xùn)練數(shù)據(jù)存儲(chǔ)器,樣本像素x前向運(yùn)算傳入第 2 層網(wǎng)絡(luò),z_2_1、z_2_2 是第 2 層網(wǎng)絡(luò) 2 樣本的帶權(quán)輸入,經(jīng)過(guò)S 型函數(shù)算出第2 層網(wǎng)絡(luò)2 樣本的激活值a_2_1、a_2_2,根據(jù)反向誤差公式第 2 層z_2_1、z_2_2 的導(dǎo)數(shù)與第 3 層網(wǎng)絡(luò)的誤差e_3_1、e_3_2和權(quán)重計(jì)算第2層網(wǎng)絡(luò)神經(jīng)元誤差e_2_1、e_2_2,根據(jù)式更新偏置并存入偏置存儲(chǔ)器RAM_b2,再根據(jù)梯度公式,它與樣本像素x計(jì)算第2 層網(wǎng)絡(luò)權(quán)重梯度g_2_1、g_2_2,根據(jù)式更新權(quán)重并存入權(quán)重存儲(chǔ)器RAM_W2,輸出層的信號(hào)流程原理和第2 層網(wǎng)絡(luò)相同。z_3_1、z_3_2是第3層網(wǎng)絡(luò)帶權(quán)輸入,e_3_1、e_3_2是2個(gè)樣本第3層網(wǎng)絡(luò)誤差,Y1、Y2 是樣本標(biāo)簽,g_3_1、g_3_2 是2 樣本第3 層網(wǎng)絡(luò)權(quán)重梯度,RAM_b3 是第3 層網(wǎng)絡(luò)的偏置存儲(chǔ)器,RAM_W3是第3層的權(quán)重存儲(chǔ)器。根據(jù)第2章BP算法公式與BP網(wǎng)絡(luò)信號(hào)的流程圖設(shè)計(jì)工程。
在FPGA 平臺(tái)上設(shè)計(jì)手寫(xiě)數(shù)字識(shí)別系統(tǒng),除了BP網(wǎng)絡(luò)算法的數(shù)學(xué)邏輯,還有3 層神經(jīng)網(wǎng)絡(luò)前向、反向運(yùn)算和網(wǎng)絡(luò)神經(jīng)元權(quán)值更新的時(shí)序設(shè)計(jì)。本文采用一個(gè)計(jì)數(shù)器控制3 層網(wǎng)絡(luò)的數(shù)據(jù)存儲(chǔ)器RAM 和神經(jīng)元誤差、網(wǎng)絡(luò)權(quán)值梯度狀態(tài)[16]。
100 MHz時(shí)鐘clk下計(jì)數(shù)器D計(jì)數(shù)范圍0~2 455。數(shù)值0~786是第2層BP網(wǎng)絡(luò)前向運(yùn)算,787~819是第3層BP網(wǎng)絡(luò)前向運(yùn)算,第2、3層網(wǎng)絡(luò)寄存器中帶權(quán)輸入導(dǎo)數(shù)用于誤差計(jì)算,820~851是反向第3層BP網(wǎng)絡(luò)計(jì)算誤差、梯度和更新權(quán)重,884~1 668 是反向運(yùn)算第2 層BP 網(wǎng)絡(luò)誤差、梯度和權(quán)重。1 770~2 454是第2組BP網(wǎng)絡(luò)訓(xùn)練的小批量數(shù)據(jù),因?yàn)镽AM關(guān)聯(lián)的.mif文件是第1組樣本[17]。
BP 網(wǎng)絡(luò)系統(tǒng)的輸入端口是訓(xùn)練樣本x1~x10、標(biāo)簽Y1~Y10 和時(shí)鐘clk及復(fù)位rst_n,輸出端口是out1~out10樣本判決。圖6是根據(jù)第2章BP網(wǎng)絡(luò)算法原理,1個(gè)樣本判別和權(quán)值訓(xùn)練的電路圖,圖中虛線框是反向運(yùn)算訓(xùn)練網(wǎng)絡(luò)的權(quán)重和偏置。W_RAM2_0~W_RAM2_29為第2層網(wǎng)絡(luò)784個(gè)地址的權(quán)重存儲(chǔ)器,W_RAM3_0~W_RAM3_9為第3層網(wǎng)絡(luò)30個(gè)地址的權(quán)重存儲(chǔ)器,X_RAM為訓(xùn)練樣本存儲(chǔ)器,b2_RAM為第2 層30 個(gè)地址的偏置存儲(chǔ)器,b3_RAM為第3層10個(gè)的地址偏置存儲(chǔ)器。
圖5 以2個(gè)訓(xùn)練樣本為例BP神經(jīng)網(wǎng)絡(luò)的前向運(yùn)算及權(quán)重、偏置更新信號(hào)流程
圖6 神經(jīng)網(wǎng)絡(luò)前向運(yùn)算及誤差反饋的電路圖(1個(gè)訓(xùn)練樣本為例)
前向運(yùn)算的Verilog語(yǔ)言程序(以第2層網(wǎng)絡(luò)第1個(gè)神經(jīng)元帶權(quán)輸入為例):
存儲(chǔ)器在地址發(fā)生器下輸出樣本、權(quán)重及偏置,偏置存儲(chǔ)器b_RAM在時(shí)鐘clk下串行輸出,進(jìn)行數(shù)據(jù)串轉(zhuǎn)并(每神經(jīng)元一個(gè)偏置)。第2層神經(jīng)元并行激活值a(l2)轉(zhuǎn)為串行與第3層神經(jīng)元權(quán)重的累積和計(jì)算,最后判決第3 層并行激活值輸出數(shù)字[18]。圖7(a)和圖7(b)是神經(jīng)網(wǎng)絡(luò)初始權(quán)重和偏置下訓(xùn)練樣本5前向第2、3層網(wǎng)絡(luò)的QuartusII仿真。x[1]是訓(xùn)練樣本,a3_0~a3_9是第3層神經(jīng)元的激活值,z_out32是第3個(gè)神經(jīng)元帶權(quán)輸入,b32是第3 個(gè)神經(jīng)元的偏置,y_in1 是樣本標(biāo)簽,out1 是系統(tǒng)判別結(jié)果。
圖7 (a) 激活值a2_0~a2_29的QuartusII仿真
圖7 (b) 識(shí)別結(jié)果的QuartusII仿真
BP神經(jīng)網(wǎng)絡(luò)的偏置b2串轉(zhuǎn)并Verilog程序如下(以第2層的30個(gè)神經(jīng)元偏置為例):
BP神經(jīng)網(wǎng)絡(luò)的反向運(yùn)算式(1)~(3)計(jì)算第3層神經(jīng)元的加權(quán)平均誤差(神經(jīng)元的偏置梯度),更新偏置串行存入b_RAM作為系統(tǒng)下次迭代初始偏置。式(4)和式(7)計(jì)算神經(jīng)元權(quán)重的加權(quán)平均梯度和更新權(quán)重存入W3_RAM。式(5)計(jì)算第2 層神經(jīng)元誤差。最后784 個(gè)時(shí)鐘clk周期樣本X灰度像素值乘以并行的δ(j2),計(jì)算第2層神經(jīng)元權(quán)重的加權(quán)平均梯度,更新并存入W2_RAM。至此BP神經(jīng)網(wǎng)絡(luò)完成了1次小批量數(shù)據(jù)的樣本判別和網(wǎng)絡(luò)權(quán)重、偏置的訓(xùn)練[19]。
反向運(yùn)算Verilog 語(yǔ)言程序(:誤差計(jì)算,梯度計(jì)算,權(quán)值更新):
本文解決了BP 神經(jīng)網(wǎng)絡(luò)架構(gòu)架構(gòu)、MNIST 手寫(xiě)數(shù)字庫(kù)、S 型激活函數(shù)及導(dǎo)數(shù)、各層網(wǎng)絡(luò)數(shù)據(jù)狀態(tài)的時(shí)序控制、數(shù)據(jù)串行與并行間轉(zhuǎn)換、存儲(chǔ)模塊的設(shè)計(jì)、硬件結(jié)構(gòu)圖。研究手寫(xiě)數(shù)字BP算法,并根據(jù)network庫(kù)python實(shí)現(xiàn)手寫(xiě)數(shù)字的網(wǎng)絡(luò)架構(gòu)[20]。為實(shí)現(xiàn)硬件系統(tǒng),對(duì)算法進(jìn)行相應(yīng)向量轉(zhuǎn)換和數(shù)據(jù)處理,用MNIST 庫(kù)60 000 幅手寫(xiě)數(shù)字的像素?cái)?shù)據(jù)和對(duì)應(yīng)標(biāo)簽,在FPGA 上實(shí)現(xiàn)BP神經(jīng)網(wǎng)絡(luò)的判決和訓(xùn)練[21],在100 MHz 系統(tǒng)時(shí)鐘計(jì)算1次迭代耗時(shí)150 ms,30次迭代4.5 s,而python2.7軟件在計(jì)算機(jī)上迭代30次用時(shí)329 s,選取第30次迭代的最后1 000 個(gè)樣本與標(biāo)簽,系統(tǒng)記錄判別正確的樣本個(gè)數(shù)為916 個(gè),即準(zhǔn)確率是91.6%,network 庫(kù)網(wǎng)絡(luò)架構(gòu)中手寫(xiě)數(shù)字識(shí)別率為95.3%。圖8(a)和圖8(b)是網(wǎng)絡(luò)中樣本和標(biāo)簽在QuartusII 13.0 中第1 次迭代的仿真結(jié)果。圖中y_in1~y_in10 是神經(jīng)網(wǎng)絡(luò)輸入的小批量數(shù)據(jù)標(biāo)簽,out1~out10 是網(wǎng)絡(luò)系統(tǒng)的判決,n是系統(tǒng)第n次小批量樣本(60 000個(gè)樣本數(shù)據(jù),一次讀10個(gè),n最大為6 000),網(wǎng)絡(luò)迭代30 次更新權(quán)重和偏置。隨機(jī)取第1 次迭代n是 4 893 和 5 936 次中的 10 個(gè)訓(xùn)練樣本,n為 4 893 有out3、out6、out8 與out9 和自己對(duì)應(yīng)的標(biāo)簽不同,n為5 936 有out4、out5 與out10 和自己對(duì)應(yīng)的標(biāo)簽y_in4、y_in5 與y_in10 不同,驗(yàn)證網(wǎng)絡(luò)識(shí)別的準(zhǔn)確率增加,第1次迭代識(shí)別率為69%(共30次迭代)。
圖8 (a) n=4 893樣本標(biāo)簽和識(shí)別的QuartusII仿真結(jié)果
圖8 (b) n=5 936樣本標(biāo)簽和識(shí)別的QuartusII仿真結(jié)果
通過(guò)仿真與測(cè)試分析,網(wǎng)絡(luò)系統(tǒng)識(shí)別MINST數(shù)據(jù)庫(kù)手寫(xiě)數(shù)字,并能訓(xùn)練網(wǎng)絡(luò),更新權(quán)重和偏置。利用FPGA并行計(jì)算實(shí)現(xiàn)了硬件速度快的優(yōu)勢(shì),解決了軟件訓(xùn)練速度慢、耗時(shí)長(zhǎng)的問(wèn)題。該系統(tǒng)可以應(yīng)用于小型嵌入式數(shù)字實(shí)時(shí)識(shí)別,且利用BP 網(wǎng)絡(luò)反向訓(xùn)練及更新權(quán)重和偏置,進(jìn)一步擴(kuò)展成網(wǎng)絡(luò),為判別其他字符圖片奠定基礎(chǔ)。另一方面FPGA 實(shí)現(xiàn)了浮點(diǎn)轉(zhuǎn)定點(diǎn)和函數(shù)線性擬合,降低了數(shù)據(jù)在BP算法運(yùn)算中的準(zhǔn)確度,可以考慮進(jìn)一步優(yōu)化算法和精細(xì)劃分S函數(shù)及導(dǎo)數(shù)擬合區(qū)間,提高網(wǎng)絡(luò)判決精確度。