湯知日, 常 勝
(武漢大學 物理科學與技術學院微電子系, 物理國家級實驗教學示范中心, 湖北 武漢 430072)
神經網絡是機器學習的重要內容[1],也是科學研究的熱點。出于科研和實際工程應用的需要和硬件計算方式與神經網絡并行化本質的契合[2],在硬件電路平臺實現神經網絡已逐漸成為技術發展趨勢之一。FPGA具有的可重用性和操作方便簡單等優勢,因而成為一種進行硬件實驗實現神經網絡的理想方式[3]。
目前還鮮有將“神經網絡硬件化”作為實驗教學內容。本文提出的實驗,首先對神經網絡的基本結構在算法級進行熟悉,再進一步在FPGA上實現圖像分類的并完成設計性能的優化。通過此實驗,既可培養學生對神經網絡的理解和對FPGA數字集成設計技術[4]的掌握,也有望提升學生分析和解決復雜問題的能力及團隊協作的精神。
神經網絡是通過對人腦的基本單元——神經元的建模和連接,探索模擬人腦神經系統的功能模型,并在此基礎上提出的具有學習、聯想、記憶和模式識別等智能信息處理功能的人工系統[5]。神經網絡的一個重要特性是它能從環境中學習,并把學習的結果分布存儲于網絡的突觸連接中。神經網絡的學習是一個過程,在其所處環境的激勵下,相繼給網絡輸入一些樣本模式,并按照一定的規則(學習算法)調整網絡各層的權值矩陣,待網絡各層權值都收斂到一定值[6],學習過程結束。之后,就可使用訓練完成的神經網絡來對真實數據進行分類。
作為實驗的第一部分,讓學生對神經網絡基本概念有所了解。神經元基本結構如圖1所示。

圖1 神經元基本結構建模
根據圖1可得:

其中b=-θ。PR為前端其他神經元的軸突輸出,即此神經元的輸入向量,WR為神經元連接的強度,其值可正可負。通過在誤差反向傳播的過程中修改這個強度值的大小,可模擬生物神經元中存在的興奮和抑制興奮兩種神經遞質。當輸入向量和權值乘積之和大于某一閾值時,該神經元啟動。f即為神經元之間的傳遞函數,也被稱為激發函數或觸發函數。
實驗中訓練和測試采用的數據集為3×3像素的二值字母圖像,一共分為3類,如圖2(a)所示。考慮到對網絡容錯率的分析,采用圖2(b)中的30個圖像對已完成訓練的網絡進行測試。

圖2 3×3像素二值字母圖像
采用Matlab作為算法設計平臺,使用其函數工具箱提供的newff函數來創建網絡。具體調用格式為:
net=newff(P,T, [S1 S2…S(N-1)]),…
…{TF1 TF2…TFNI}
其中P和T分別為輸入樣本和期望響應,Si為網絡各層的神經元數目,TFi為網絡各層的傳遞函數類型。
利用此函數創建一個經典的誤差反向傳播(BP)神經網絡,完成字母的圖像識別。網絡的建立和訓練過程如下:
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);
通過這一部分的學習,可使學生對神經網絡算法有更具體的認識,也實踐了神經網絡軟件設計的手段。
利用硬件描述語言Verilog對軟件設計得到的神經網絡算法進行硬件化,實現相應的端口定義、內部寄存器定義、輸出計算結果和訓練過程。實驗中,訓練過程采用狀態機進行表述,使學生對主要的FPGA硬件設計手段更加熟悉[7]。其中主要的訓練過程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圖像為例,誤差計算公式如下: Δij(n)=ei(n)Wj(n) 由于該網絡的規模較小,可預先將教師信號儲存于寄存器中,直接代入誤差公式計算。 網絡訓練中,權值更新計算如下: 其中A為設置的幅值,A偏大則不容易停留在理想值周邊,甚至有可能處于權值允許范圍的上下限之外,A偏小則權值更新速度較慢,所以需要結合實際情況進行修改。sgn函數標記修正量的正負,從而實現雙向的修正。在硬件設計中可以通過比較器的方式方便快捷地實現該sgn函數的計算。 傳遞函數在BP網絡中起著信息傳播的重要作用。本實驗選擇的算法為 fi=tanh(Ii) 上式傳遞函數為雙曲正切函數。考慮到在FPGA里實現這類反三角函數一直是算法硬件化的難點之一,對其進行分解: 通過計算sinh和cosh函數的值,進而利用除法器得到tanh函數的結果。 具體而言,實驗中選擇cordic算法使傳遞函數得到實現。cordic的實質是循環迭代[8],其核心是先固定一些基準角,再通過不斷地搖擺每一個基準角逼近目標角度值。在x-y直角坐標軸中將點(x1,y1)旋轉到(x2,y2,旋轉角為θ,其原理示意如圖3所示: 圖3 cordic算法坐標旋轉示意圖 使用Verilog語言編寫的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,對訓練和測試部分分別進行測試,并使用Modelsim進行波形仿真,使學生對硬件設計的驗證以及優化手段有很好的掌握[9]。在神經網絡的訓練過程中,得到的權值與誤差的仿真波形如圖4所示: 圖4 訓練過程權值誤差波形仿真圖 圖中表示誤差的e22隨著訓練逐漸減小,權值變化量d22也隨著誤差減小,最終減小為0,即宣告神經網絡訓練完成。 用前述30幅帶誤差的二值圖像作為測試數據集進行驗證,仿真波形如圖5所示: 此波形中,輸出數據最大的那一行即為正確分類。訓練結果表明:所有圖像均分類正確,硬件實現的網絡的識別效果非常好。 圖5 神經網絡測試波形仿真圖 在功能正確的基礎上,可進行硬件優化,提高電路的性能。例如刪除不必要的乘法、精簡電路結構;將復雜組合邏輯寫入獨立的時序邏輯中[10],提高電路頻率。以一個具體優化為例,對于最影響電路時序的路徑(dataout輸出路徑),其為各權值與輸入乘積的和,而乘法器占用資源與處理速度均較慢。考慮到其輸入均為一位,所以可在實驗中采用選擇器取代乘法器,從而降低資源消耗。此外,對電路做流水線處理,采用SPEED模式作為綜合策略[11],可對整體進行速度優化。在FPGA型號選擇為Cyclone II:EP2C35F672C6N的情況下,優化后的硬件性能達到總資源187,組合邏輯89,時鐘頻率208.86 MHz。 最終的板級驗證,使用DEII FPGA開發平臺上的七位數碼管展示測試得到的分類結果。圖6所示分類結果為第二類,即字母V。 圖6 分類功能板級驗證 以神經網絡為代表的機器學習硬件設計,是人工智能的一個重要發展方向。通過機器學習FPGA硬件實驗,使學生既能對神經網絡算法有個基本的認識,也能對主流實現手段有深入的掌握,有助于學生理解硬件設計以及各種優化設計的方式[12]。 此基于FPGA平臺的機器學習硬件實驗具有很強的開放性和拓展性。在熟悉神經網絡結構和算法、神經網絡工具箱調用、FPGA設計及硬件優化等環節中均可為學生提供自主學習和拓展的空間。例如在算法熟悉階段,設計了一個學生講授自己通過查閱資料對機器學習理解的環節;在硬件優化階段,設計了一個由學生自行探索優化手段的環節。通過此類翻轉課堂教學手段的導入,培養了學生的獨立思考能力和創新精神,取得了良好的實驗教學效果。2.2 傳遞函數的FPGA實現

3 結果測試和硬件優化



4 結語