摘 要: 從分析人工神經(jīng)網(wǎng)絡(luò)" title="人工神經(jīng)網(wǎng)絡(luò)">人工神經(jīng)網(wǎng)絡(luò)的設(shè)計原理入手,闡述了全數(shù)字" title="全數(shù)字">全數(shù)字電路人工神經(jīng)網(wǎng)絡(luò)的設(shè)計方法。通過一個小規(guī)模前饋人工神經(jīng)網(wǎng)絡(luò)的設(shè)計實例,簡要說明了利用VHDL語言及編譯平臺,完成一種可調(diào)整權(quán)值" title="權(quán)值">權(quán)值的通用人工神經(jīng)網(wǎng)絡(luò)的設(shè)計算法和流程。
關(guān)鍵詞: 人工神經(jīng)網(wǎng)絡(luò) VHDL 數(shù)字電路
人工神經(jīng)網(wǎng)絡(luò)(ANN)是一門起始于19世紀(jì)90年代,復(fù)興于20世紀(jì)80年代的綜合性學(xué)科,涉及生物、電子、計算機、物理等多種學(xué)科,有著非常廣泛的應(yīng)用前景。長期以來,人們都在想方設(shè)法了解人腦的功能,用物理可實現(xiàn)系統(tǒng)去模仿人腦的神經(jīng)網(wǎng)絡(luò)。其實現(xiàn)方法是多種多樣的,總的來說可分為兩種:一種是利用現(xiàn)代高性能的計算機形成具有模擬能力的通用軟件來完成神經(jīng)網(wǎng)絡(luò)的預(yù)期功能;另一種是利用硬件直接實現(xiàn)神經(jīng)網(wǎng)絡(luò),如模擬VLSI 實現(xiàn)、數(shù)字VLSI 實現(xiàn)、模數(shù)混合VLSI 實現(xiàn)。
迄今為止,人們利用C、Basic等高級語言開發(fā)了很多神經(jīng)網(wǎng)絡(luò)軟件包,實現(xiàn)了許多算法和模型,但是用軟件模擬的神經(jīng)網(wǎng)絡(luò)并不能達到真正的并行處理,且對計算機性能要求很高;硬件實現(xiàn)中的模擬VLSI,雖然速度快和集成度高、便于實現(xiàn)非線性運算,但精度低、對噪音和溫度的變化非常敏感、設(shè)計復(fù)雜、突觸權(quán)值存儲困難;而硬件實現(xiàn)的數(shù)字VLSI,雖然免疫力強、速度快, 但是部件(如乘法器" title="乘法器">乘法器) 占芯片面積大[1]。不過,隨著大規(guī)模集成電路和HDL語言的不斷發(fā)展,數(shù)字VLSI設(shè)計日益成熟,EDA設(shè)計工具的不斷更新?lián)Q代,使得全數(shù)字電路ANN的實現(xiàn)工藝難度越來越小,集成度和可靠性越來越高;同時FPGA的現(xiàn)場可編程特性,又使得ANN的調(diào)整更加方便快捷,因而數(shù)字VLSI逐步成為ANN實現(xiàn)的發(fā)展主流。本文通過一個小規(guī)模前饋ANN的設(shè)計實例,簡要說明利用VHDL以及QuartusII編譯平臺完成一種可調(diào)整權(quán)值的通用ANN的設(shè)計算法和流程。
1 人工神經(jīng)網(wǎng)絡(luò)的實現(xiàn)原理
人工神經(jīng)網(wǎng)絡(luò)就是采用物理可實現(xiàn)系統(tǒng)模仿人腦神經(jīng)細胞的結(jié)構(gòu)和功能的系統(tǒng)[2]。它把很多處理單元有機地連接起來形成網(wǎng)絡(luò),進行并行的工作;通過模擬生物神經(jīng)細胞發(fā)出信息脈沖,控制網(wǎng)絡(luò)的運行。神經(jīng)細胞單元的信息是寬度和幅度都相同的脈沖串" title="脈沖串">脈沖串,而脈沖串的間隔則是隨機變化的。例如某個神經(jīng)細胞單元興奮,其軸突輸出的脈沖串的平均頻率就高;若細胞單元不興奮,則脈沖頻率就低甚至沒有脈沖。多個神經(jīng)細胞單元的軸突脈沖可以加權(quán),形成細胞單元的電位變化,電位變化累加超過一定閾值,就產(chǎn)生一個脈沖,通過控制閾值大小,就可以控制脈沖。人工神經(jīng)元的示意圖如圖1所示。
圖中,x1…xn表示其他神經(jīng)元的軸突輸出脈沖,ω1…ωn為其他神經(jīng)元與第i個神經(jīng)元的突觸連接,ωi可正可負,分別表示興奮和抑制,則:
在式(1.1)中,si表示神經(jīng)元i突觸后的累加值,θi為閾值。在式(1.3)中,vi為神經(jīng)元i的狀態(tài),yi為神經(jīng)元i的輸出,它是一個單調(diào)上升的函數(shù),且為有限值,這是由于生物體中神經(jīng)元脈沖發(fā)放率有一個最大值,不能無限上升的緣故。
總之,人工神經(jīng)網(wǎng)絡(luò)由很多幾乎相同的單元組成,這些神經(jīng)元的輸入與輸出的函數(shù)關(guān)系為單調(diào)上升的非線性關(guān)系,它們之間的連接采用權(quán)的辦法實現(xiàn),每個神經(jīng)元的輸入是其他神經(jīng)元輸出的加權(quán)和,因此在電路實現(xiàn)中需要完成:
(1)實現(xiàn)神經(jīng)元輸入與輸出的線性關(guān)系。
(2)實現(xiàn)兩個信號的相乘。在神經(jīng)網(wǎng)絡(luò)中權(quán)的數(shù)量很多,加權(quán)的計算都用乘法完成,因此對應(yīng)于兩個信號相乘的電路必不可少。
(3)實現(xiàn)加權(quán)后脈沖累加。
2 一種前饋人工神經(jīng)網(wǎng)絡(luò)的全數(shù)字電路模型
在全數(shù)字電路組成的人工神經(jīng)網(wǎng)絡(luò)中,乘法是利用與門進行的。如圖2所示,兩個脈沖序列通過“與”以后的輸出即為二者的乘積;兩個脈沖序列的占空比為1/2和1/3,相“與”后,脈沖序列的占空比為1/6,從而達到相乘的目的。
?
權(quán)存儲在寄存器中,寄存器可以與外界的計算機內(nèi)存或EPROM相聯(lián),因而權(quán)可從外面寫入。這意味著權(quán)的存儲和權(quán)的改變沒有什么困難,可以設(shè)計出可重構(gòu)的人工神經(jīng)網(wǎng)絡(luò)模型。
累加器是用計數(shù)器完成的,從乘法器輸出的脈沖串經(jīng)過計數(shù)器實現(xiàn)累加,當(dāng)累加到達閾值時即作為神經(jīng)元的一個狀態(tài)輸出。
圖3給出了一個簡單的前饋人工神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)示意圖[3]。圖中,xi代表第i個輸入,wij代表輸入i與神經(jīng)元j之間的權(quán)值,yj是第j個神經(jīng)元的輸出。則:
式中, f( )是激化函數(shù)(如線性閾值的sigmoid的函數(shù))。
根據(jù)ANN的設(shè)計實現(xiàn)原理,可以把圖3所示的網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計成如圖4所示的數(shù)字電路結(jié)構(gòu)。
?
圖4中,每個矩形框內(nèi)部的電路構(gòu)成一個神經(jīng)元,在垂直方向上有幾組移位寄存器,在水平方向上有個大的環(huán)形結(jié)構(gòu)。垂直的環(huán)形移位寄存器存儲著前面所有的權(quán)值,水平環(huán)行移位寄存器中裝載的是輸入信號。每個權(quán)值在自己的移位寄存器中的相對位置必須和輸入值匹配。在每個垂直的環(huán)形移位存儲器輸出端有一個乘法器/累加器電路,用于對權(quán)值和輸入信號進行乘-累加運算。運算的結(jié)果送給查找表(LUT),用于實現(xiàn)激化函數(shù),得到輸出yi。
這個電路只用到了三個乘法器,有效地節(jié)省了資源。但是各個權(quán)值單獨輸入,不便于外部調(diào)整,不適于通用人工神經(jīng)網(wǎng)絡(luò)的編程。為此,設(shè)計如圖5所示電路。圖中,只使用一個輸入端口加載所有的權(quán)值,權(quán)值按照順序移位,直到每個寄存器都存儲相應(yīng)的權(quán)值,然后權(quán)值與輸入相乘并累加,最終得到期望的輸出結(jié)果。
3 VHDL語言的編程實現(xiàn)
為了使設(shè)計具有通用性,按照圖5的結(jié)構(gòu)用二維數(shù)組表示輸入和輸出,并自定義一個程序包,用來定義數(shù)組的數(shù)據(jù)類型:verctor_array_in和vector_array_out。由于程序包中的參數(shù)是通用的,可被多個實體即電路塊調(diào)用,因而大大地提高了設(shè)計效率。
人工神經(jīng)網(wǎng)絡(luò)設(shè)計權(quán)值通用程序包如下:
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
use ieee.std_logic_arith.all;
package currency_data_type is
constant b:integer:=3;——輸入位數(shù)或者權(quán)重,改變b的值,可以調(diào)整網(wǎng)絡(luò)的規(guī)模和大小
type vector_array_in is array(natural range〈〉) of signed (b-1 downto 0);
type vector_array_out is array(natural range〈〉) of signed (2*b-1 downto 0);
end currency_data_type;
同時,將輸入位數(shù)、神經(jīng)元的數(shù)目以及每個神經(jīng)元的權(quán)重等參數(shù)放入類屬說明中,由設(shè)計實體即設(shè)計電路外部提供,因而設(shè)計者可以根據(jù)需要方便地調(diào)整網(wǎng)絡(luò)的結(jié)構(gòu)和規(guī)模。
具體程序如下:
ENTITY dann IS
generic(n: integer :=3;——加入類屬說明,可從外部通過類屬參量重新設(shè)定電路規(guī)模
m: integer :=3;
b: integer :=3);
編寫完的程序經(jīng)過編譯綜合,便可得到如圖6所示的門電路。
4 仿真分析
經(jīng)過QuartusII對程序綜合編譯之后,還需要對電路進行波形仿真,以檢驗設(shè)計的正確性和程序的實用性。波形仿真如圖7所示。
為了觀測方便,在仿真時把輸入信號固定為x1=1,x2=2,x3=3,時鐘周期為10MHz。程序中共有九個權(quán)值,需要九個時鐘周期來移入。因此到第9個周期的時候,由圖7可知,權(quán)值weight[1..9]分別為[0,-1,-2,-3,-4,3,2,1,0],則輸出為:
由于選用的FPGA器件不同,芯片內(nèi)部產(chǎn)生延遲,導(dǎo)致波形中毛刺出現(xiàn),但相對于模擬電路,精度和穩(wěn)定性仍有很大的提高。在實際的系統(tǒng)設(shè)計中,可以根據(jù)需要并結(jié)合成本考慮選擇恰當(dāng)?shù)男酒螺d。
?
通過上面的設(shè)計,不難發(fā)現(xiàn),數(shù)字電路在權(quán)值累加和非線性函數(shù)的計算上比較麻煩,綜合編譯的時候,數(shù)字乘法器占用的資源巨大,尤其是隨著神經(jīng)元和輸入位數(shù)的增加,成平方倍增長。但是,以一套較好的EDA工具為平臺,使用VHDL語言從頂至下設(shè)計全數(shù)字電路的人工神經(jīng)網(wǎng)絡(luò),不僅能夠避開電路搭配的繁瑣,縮短設(shè)計周期,提高設(shè)計效率,而且由于FPGA器件的現(xiàn)場可編程特性,可以靈活控制網(wǎng)絡(luò)的規(guī)模和結(jié)構(gòu),設(shè)計出可通用的網(wǎng)絡(luò)模型,大大節(jié)省了開發(fā)周期,延長了設(shè)計壽命。
參考文獻
1 Keulan E et al. Neural network hardware performance criteria.In:Proc of the IEEE Conf on Neural Networks,Vol. Florida,1994. 1885~1888
2 張立明. 人工神經(jīng)網(wǎng)絡(luò)的模型及其應(yīng)用.上海:復(fù)旦大學(xué)出版社, 1993:3~4
3 喬廬峰(譯).VHDL數(shù)字電路設(shè)計教程.北京:電子工業(yè)出版社, 2005:243~250
4 潘 松.VHDL實用教程.成都:電子科技大學(xué)出版社,2000
5 羅 莉. 數(shù)字神經(jīng)元芯片的設(shè)計與應(yīng)用.計算機研究與發(fā)展, 1998:798~802