湯知日, 常 勝
(武漢大學(xué) 物理科學(xué)與技術(shù)學(xué)院微電子系, 物理國(guó)家級(jí)實(shí)驗(yàn)教學(xué)示范中心, 湖北 武漢 430072)
神經(jīng)網(wǎng)絡(luò)是機(jī)器學(xué)習(xí)的重要內(nèi)容[1],也是科學(xué)研究的熱點(diǎn)。出于科研和實(shí)際工程應(yīng)用的需要和硬件計(jì)算方式與神經(jīng)網(wǎng)絡(luò)并行化本質(zhì)的契合[2],在硬件電路平臺(tái)實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)已逐漸成為技術(shù)發(fā)展趨勢(shì)之一。FPGA具有的可重用性和操作方便簡(jiǎn)單等優(yōu)勢(shì),因而成為一種進(jìn)行硬件實(shí)驗(yàn)實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)的理想方式[3]。
目前還鮮有將“神經(jīng)網(wǎng)絡(luò)硬件化”作為實(shí)驗(yàn)教學(xué)內(nèi)容。本文提出的實(shí)驗(yàn),首先對(duì)神經(jīng)網(wǎng)絡(luò)的基本結(jié)構(gòu)在算法級(jí)進(jìn)行熟悉,再進(jìn)一步在FPGA上實(shí)現(xiàn)圖像分類的并完成設(shè)計(jì)性能的優(yōu)化。通過(guò)此實(shí)驗(yàn),既可培養(yǎng)學(xué)生對(duì)神經(jīng)網(wǎng)絡(luò)的理解和對(duì)FPGA數(shù)字集成設(shè)計(jì)技術(shù)[4]的掌握,也有望提升學(xué)生分析和解決復(fù)雜問(wèn)題的能力及團(tuán)隊(duì)協(xié)作的精神。
神經(jīng)網(wǎng)絡(luò)是通過(guò)對(duì)人腦的基本單元——神經(jīng)元的建模和連接,探索模擬人腦神經(jīng)系統(tǒng)的功能模型,并在此基礎(chǔ)上提出的具有學(xué)習(xí)、聯(lián)想、記憶和模式識(shí)別等智能信息處理功能的人工系統(tǒng)[5]。神經(jīng)網(wǎng)絡(luò)的一個(gè)重要特性是它能從環(huán)境中學(xué)習(xí),并把學(xué)習(xí)的結(jié)果分布存儲(chǔ)于網(wǎng)絡(luò)的突觸連接中。神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)是一個(gè)過(guò)程,在其所處環(huán)境的激勵(lì)下,相繼給網(wǎng)絡(luò)輸入一些樣本模式,并按照一定的規(guī)則(學(xué)習(xí)算法)調(diào)整網(wǎng)絡(luò)各層的權(quán)值矩陣,待網(wǎng)絡(luò)各層權(quán)值都收斂到一定值[6],學(xué)習(xí)過(guò)程結(jié)束。之后,就可使用訓(xùn)練完成的神經(jīng)網(wǎng)絡(luò)來(lái)對(duì)真實(shí)數(shù)據(jù)進(jìn)行分類。
作為實(shí)驗(yàn)的第一部分,讓學(xué)生對(duì)神經(jīng)網(wǎng)絡(luò)基本概念有所了解。神經(jīng)元基本結(jié)構(gòu)如圖1所示。
圖1 神經(jīng)元基本結(jié)構(gòu)建模
根據(jù)圖1可得:
其中b=-θ。PR為前端其他神經(jīng)元的軸突輸出,即此神經(jīng)元的輸入向量,WR為神經(jīng)元連接的強(qiáng)度,其值可正可負(fù)。通過(guò)在誤差反向傳播的過(guò)程中修改這個(gè)強(qiáng)度值的大小,可模擬生物神經(jīng)元中存在的興奮和抑制興奮兩種神經(jīng)遞質(zhì)。當(dāng)輸入向量和權(quán)值乘積之和大于某一閾值時(shí),該神經(jīng)元啟動(dòng)。f即為神經(jīng)元之間的傳遞函數(shù),也被稱為激發(fā)函數(shù)或觸發(fā)函數(shù)。
實(shí)驗(yàn)中訓(xùn)練和測(cè)試采用的數(shù)據(jù)集為3×3像素的二值字母圖像,一共分為3類,如圖2(a)所示??紤]到對(duì)網(wǎng)絡(luò)容錯(cuò)率的分析,采用圖2(b)中的30個(gè)圖像對(duì)已完成訓(xùn)練的網(wǎng)絡(luò)進(jìn)行測(cè)試。
圖2 3×3像素二值字母圖像
采用Matlab作為算法設(shè)計(jì)平臺(tái),使用其函數(shù)工具箱提供的newff函數(shù)來(lái)創(chuàng)建網(wǎng)絡(luò)。具體調(diào)用格式為:
net=newff(P,T, [S1 S2…S(N-1)]),…
…{TF1 TF2…TFNI}
其中P和T分別為輸入樣本和期望響應(yīng),Si為網(wǎng)絡(luò)各層的神經(jīng)元數(shù)目,TFi為網(wǎng)絡(luò)各層的傳遞函數(shù)類型。
利用此函數(shù)創(chuàng)建一個(gè)經(jīng)典的誤差反向傳播(BP)神經(jīng)網(wǎng)絡(luò),完成字母的圖像識(shí)別。網(wǎng)絡(luò)的建立和訓(xùn)練過(guò)程如下:
clear
[alphabet,targets]=prprob;
[R,Q]=size(alphabet);
[S2,Q]=size(targets);
S1=10;
net=newff(minmax(alphabet),[S1 S2],...
...{′logsig′ ′logsig′},′traingdx′);
net.LW{2,1}=net.LW{2,1}*0.01;
net.b{2}=net.b{2}*0.01;
net.performFcn='sse';
net.trainParam.goal=0.1;
net.trainParam.epochs=5000;
net.trainParam.mc=0.95;
P=alphabet;
T=targets;
[net,tr]=train(net,P,T);
通過(guò)這一部分的學(xué)習(xí),可使學(xué)生對(duì)神經(jīng)網(wǎng)絡(luò)算法有更具體的認(rèn)識(shí),也實(shí)踐了神經(jīng)網(wǎng)絡(luò)軟件設(shè)計(jì)的手段。
利用硬件描述語(yǔ)言Verilog對(duì)軟件設(shè)計(jì)得到的神經(jīng)網(wǎng)絡(luò)算法進(jìn)行硬件化,實(shí)現(xiàn)相應(yīng)的端口定義、內(nèi)部寄存器定義、輸出計(jì)算結(jié)果和訓(xùn)練過(guò)程。實(shí)驗(yàn)中,訓(xùn)練過(guò)程采用狀態(tài)機(jī)進(jìn)行表述,使學(xué)生對(duì)主要的FPGA硬件設(shè)計(jì)手段更加熟悉[7]。其中主要的訓(xùn)練過(guò)程Verilog代碼如下:
parameter N01=5'b00000,N02=5'b00001,…
always@(posedge clk)
begin
if(!rst)
state<=N01;
else
begin n0<=1;n1<=1;n2<=0;n3<=0;n4<=1;n5<=0;n6<=0;n7<=1;n8<=1;end
case(state)
N01:if(3 …… 以3×3圖像為例,誤差計(jì)算公式如下: Δij(n)=ei(n)Wj(n) 由于該網(wǎng)絡(luò)的規(guī)模較小,可預(yù)先將教師信號(hào)儲(chǔ)存于寄存器中,直接代入誤差公式計(jì)算。 網(wǎng)絡(luò)訓(xùn)練中,權(quán)值更新計(jì)算如下: 其中A為設(shè)置的幅值,A偏大則不容易停留在理想值周邊,甚至有可能處于權(quán)值允許范圍的上下限之外,A偏小則權(quán)值更新速度較慢,所以需要結(jié)合實(shí)際情況進(jìn)行修改。sgn函數(shù)標(biāo)記修正量的正負(fù),從而實(shí)現(xiàn)雙向的修正。在硬件設(shè)計(jì)中可以通過(guò)比較器的方式方便快捷地實(shí)現(xiàn)該sgn函數(shù)的計(jì)算。 傳遞函數(shù)在BP網(wǎng)絡(luò)中起著信息傳播的重要作用。本實(shí)驗(yàn)選擇的算法為 fi=tanh(Ii) 上式傳遞函數(shù)為雙曲正切函數(shù)??紤]到在FPGA里實(shí)現(xiàn)這類反三角函數(shù)一直是算法硬件化的難點(diǎn)之一,對(duì)其進(jìn)行分解: 通過(guò)計(jì)算sinh和cosh函數(shù)的值,進(jìn)而利用除法器得到tanh函數(shù)的結(jié)果。 具體而言,實(shí)驗(yàn)中選擇cordic算法使傳遞函數(shù)得到實(shí)現(xiàn)。cordic的實(shí)質(zhì)是循環(huán)迭代[8],其核心是先固定一些基準(zhǔn)角,再通過(guò)不斷地?fù)u擺每一個(gè)基準(zhǔn)角逼近目標(biāo)角度值。在x-y直角坐標(biāo)軸中將點(diǎn)(x1,y1)旋轉(zhuǎn)到(x2,y2,旋轉(zhuǎn)角為θ,其原理示意如圖3所示: 圖3 cordic算法坐標(biāo)旋轉(zhuǎn)示意圖 使用Verilog語(yǔ)言編寫的cordic算法核心部分如下: module cordic(dat,clk,done,rst_); input[10:0] dat; input clk,rst_; output reg signed [33:0] done; …… case(state) A0: begin out_sinh<=0; out_cosh<=0; done<=0; state<=A1; end A1: begin x1[26:0]<=27'h26A3AD2; y1[26:0]<=27'h0; z1[26:0]<=dat_in; state<=A2; end A2: begin if(!z1[26]) begin x2[26:0]<=x1[26:0]+{{1{y1[26]}},y1[26:1]}; y2[26:0]<=y1[26:0]+{{x1[26]},x1[26:1]}; z2[26:0]<=z1[26:0]-27'h1193EA8; state<=A3; end else begin x2[26:0]<=x1[26:0]-{{1{y1[26]}},y1[26:1]}; y2[26:0]<=y1[26:0]-{{x1[26]},x1[26:1]}; z2[26:0]<=z1[26:0]+27'h1193EA8; state<=A3; end end …… 編寫testbench,對(duì)訓(xùn)練和測(cè)試部分分別進(jìn)行測(cè)試,并使用Modelsim進(jìn)行波形仿真,使學(xué)生對(duì)硬件設(shè)計(jì)的驗(yàn)證以及優(yōu)化手段有很好的掌握[9]。在神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過(guò)程中,得到的權(quán)值與誤差的仿真波形如圖4所示: 圖4 訓(xùn)練過(guò)程權(quán)值誤差波形仿真圖 圖中表示誤差的e22隨著訓(xùn)練逐漸減小,權(quán)值變化量d22也隨著誤差減小,最終減小為0,即宣告神經(jīng)網(wǎng)絡(luò)訓(xùn)練完成。 用前述30幅帶誤差的二值圖像作為測(cè)試數(shù)據(jù)集進(jìn)行驗(yàn)證,仿真波形如圖5所示: 此波形中,輸出數(shù)據(jù)最大的那一行即為正確分類。訓(xùn)練結(jié)果表明:所有圖像均分類正確,硬件實(shí)現(xiàn)的網(wǎng)絡(luò)的識(shí)別效果非常好。 圖5 神經(jīng)網(wǎng)絡(luò)測(cè)試波形仿真圖 在功能正確的基礎(chǔ)上,可進(jìn)行硬件優(yōu)化,提高電路的性能。例如刪除不必要的乘法、精簡(jiǎn)電路結(jié)構(gòu);將復(fù)雜組合邏輯寫入獨(dú)立的時(shí)序邏輯中[10],提高電路頻率。以一個(gè)具體優(yōu)化為例,對(duì)于最影響電路時(shí)序的路徑(dataout輸出路徑),其為各權(quán)值與輸入乘積的和,而乘法器占用資源與處理速度均較慢??紤]到其輸入均為一位,所以可在實(shí)驗(yàn)中采用選擇器取代乘法器,從而降低資源消耗。此外,對(duì)電路做流水線處理,采用SPEED模式作為綜合策略[11],可對(duì)整體進(jìn)行速度優(yōu)化。在FPGA型號(hào)選擇為Cyclone II:EP2C35F672C6N的情況下,優(yōu)化后的硬件性能達(dá)到總資源187,組合邏輯89,時(shí)鐘頻率208.86 MHz。 最終的板級(jí)驗(yàn)證,使用DEII FPGA開(kāi)發(fā)平臺(tái)上的七位數(shù)碼管展示測(cè)試得到的分類結(jié)果。圖6所示分類結(jié)果為第二類,即字母V。 圖6 分類功能板級(jí)驗(yàn)證 以神經(jīng)網(wǎng)絡(luò)為代表的機(jī)器學(xué)習(xí)硬件設(shè)計(jì),是人工智能的一個(gè)重要發(fā)展方向。通過(guò)機(jī)器學(xué)習(xí)FPGA硬件實(shí)驗(yàn),使學(xué)生既能對(duì)神經(jīng)網(wǎng)絡(luò)算法有個(gè)基本的認(rèn)識(shí),也能對(duì)主流實(shí)現(xiàn)手段有深入的掌握,有助于學(xué)生理解硬件設(shè)計(jì)以及各種優(yōu)化設(shè)計(jì)的方式[12]。 此基于FPGA平臺(tái)的機(jī)器學(xué)習(xí)硬件實(shí)驗(yàn)具有很強(qiáng)的開(kāi)放性和拓展性。在熟悉神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)和算法、神經(jīng)網(wǎng)絡(luò)工具箱調(diào)用、FPGA設(shè)計(jì)及硬件優(yōu)化等環(huán)節(jié)中均可為學(xué)生提供自主學(xué)習(xí)和拓展的空間。例如在算法熟悉階段,設(shè)計(jì)了一個(gè)學(xué)生講授自己通過(guò)查閱資料對(duì)機(jī)器學(xué)習(xí)理解的環(huán)節(jié);在硬件優(yōu)化階段,設(shè)計(jì)了一個(gè)由學(xué)生自行探索優(yōu)化手段的環(huán)節(jié)。通過(guò)此類翻轉(zhuǎn)課堂教學(xué)手段的導(dǎo)入,培養(yǎng)了學(xué)生的獨(dú)立思考能力和創(chuàng)新精神,取得了良好的實(shí)驗(yàn)教學(xué)效果。2.2 傳遞函數(shù)的FPGA實(shí)現(xiàn)
3 結(jié)果測(cè)試和硬件優(yōu)化
4 結(jié)語(yǔ)