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