李宏偉, 吳慶祥
(福建師范大學 光電信息工程學院,福建 福州 350007)
目前,智能傳感器多指嵌入了信息處理單元(如單片機,ARM,DSP)的傳感器[1],然而這些傳感器中有很多都沒有實現(xiàn)具備學習功能的智能。人工神經(jīng)網(wǎng)絡(luò)經(jīng)歷了幾十年的發(fā)展,現(xiàn)已成為計算智能中較為活躍的一個領(lǐng)域,并可以在傳感器的非線性校正、故障自診斷、多傳感器信息融合等領(lǐng)域發(fā)揮重要作用,使運用此算法的傳感器成為具有學習功能的智能傳感器[2]。神經(jīng)網(wǎng)絡(luò)的優(yōu)勢主要體現(xiàn)在兩方面,一是并行性,二而是強大的非線性信息的處理能力與學習能力。神經(jīng)網(wǎng)絡(luò)之所以能處理非線性信息,這在很大程度上歸功于神經(jīng)網(wǎng)絡(luò)的激活函數(shù)。因此,實現(xiàn)神經(jīng)網(wǎng)絡(luò)的激活函數(shù)就成為神經(jīng)網(wǎng)絡(luò)硬件化的重要組成部分。Sigmoid函數(shù)是應(yīng)用得最為廣泛的一類激活函數(shù)[3],并且考慮到現(xiàn)場可編程門陣列(FPGA)芯片可以靈活地嵌入到各種傳感器中,本文研究FPGA實現(xiàn)Sigmoid函數(shù)的方法。
用FPGA實現(xiàn)此函數(shù),常用的方法有查表法,分段線性逼近法、多項式近似法、STAM法、協(xié)調(diào)旋轉(zhuǎn)數(shù)字計算機(coordinated rotation digital computer,CORDIC)算法等[5]。本文所采用的就是CORDIC算法與一種改進型高效除法器相結(jié)合的實現(xiàn)方案。
Sigmoid函數(shù)的表達式為
(1)
若將其硬件化,主要有2個關(guān)鍵性問題:1)實現(xiàn)函數(shù)y=ex;2)完成除法運算。其中,CORDIC算法可以將復(fù)雜的指數(shù)運算轉(zhuǎn)化為加減法運算和移位操作,適合在硬件上實現(xiàn),在基于FPGA的信息處理系統(tǒng)中頗受關(guān)注。
CORDIC算法最早由Volder J[6]于1959年提出,20世紀70年代由Walther J[7]將此算法統(tǒng)一到雙曲坐標空間中,并在圖像處理、信號濾波等相關(guān)領(lǐng)域得到廣泛應(yīng)用。在雙曲坐標空間內(nèi),逼近函數(shù)y=ex的原理如下
ex=sinhx+coshx.
(2)
可知,若要實現(xiàn)y=ex,只需實現(xiàn)coshx和sinhx,再將二者相加即可。假設(shè)某一向量的坐標為(coshθ1,sinhθ1),然后將此向量旋轉(zhuǎn)Δθ,則旋轉(zhuǎn)后的新向量坐標為(coshθ2,sinhθ2),其中
θ2=θ1+Δθ.
(3)
由雙曲坐標空間的兩角和關(guān)系得
coshθ2=cosh(θ1+Δθ)
=coshθ1cosh Δθ+sinhθ1sinh Δθ,
(4)
sinhθ2=sinh(θ1+Δθ)
=coshθ1sinh Δθ+sinhθ1cosh Δθ.
(5)
將式(3)、式(4)寫成矩陣形式,有
(6)
又因為
(7)
將式(5)與式(6)聯(lián)立得
(8)
式(7)表明了相差Δθ的2個向量的遞推關(guān)系。至此可以得到如下的結(jié)論:初始坐標為(coshθ0,sinhθ0)的向量,經(jīng)過i次旋轉(zhuǎn),每次旋轉(zhuǎn)的角度為Δθi,i次旋轉(zhuǎn)后得到的新的向量坐標為(coshθ,sinhθ),i≥1,再由式(8)的遞推關(guān)系可得
(9)
現(xiàn)對Δθi作出如下規(guī)定
(10)
其中,“+”和“-”代表旋轉(zhuǎn)的方向。由雙曲坐標的相關(guān)公式可以推得
(11)
所以
(12)
當i→∞時,式(12)收斂于1.205 136,此值記作K。
(13)
(14)
因此,在每次迭代的過程中只涉及加減法和移位操作。
表1 前3次旋轉(zhuǎn)的角度
本文采用了一種經(jīng)過改進的基于移位,比較與減法器的除法器設(shè)計方案。設(shè)置了4個寄存器變量,分別是被除數(shù)did、除數(shù)dis,商quo和余數(shù)rem。其中,被除數(shù)、商和余數(shù)的位寬都為N,除數(shù)的位寬為N/2。在除法器工作之前,先將余數(shù)初始化為0,即rem0=0。然后將被除數(shù)的最高位置于余數(shù)rem0的最低位,同時保持余數(shù)的位寬不變,rem0的最高位去掉,則新得到的余數(shù)rem1=0,0,...,0,did[N-1]。此時比較rem1與除數(shù)dis的大小,若rem1≥dis,則商的最高位置1,新的余數(shù)rem2=rem1-dis。若rem1≤dis,則商的最高位置0,然后將被除數(shù)的次高位置于余數(shù)rem1的末位,rem1的最高位去掉,以保證其位寬為N,新的余數(shù)rem2=rem1[N-2],rem1[N-3],......rem1[1],rem1[0],did[N-2],以此類推,便可得到N位的商quo。現(xiàn)舉例說明,被除數(shù)did=1010,除數(shù)dis=11,先將余數(shù)rem0初始化為0000,將did的最高位1置于rem0的末尾,去掉rem0的最高位,這樣新的余數(shù)rem1=0001,因為rem1
上述除法器有兩點局限性:一是被除數(shù)要大于等于除數(shù);二是被除數(shù)的位寬要是除數(shù)位寬的2倍。在Sigmoid函數(shù)中,分子小于分母,因此,要對此除法器做出改進。
Sigmoid函數(shù)中,分子位置的1用48位的二進制數(shù)表示,即最高位為1,其余各位均為0,且將此分子看作整數(shù)。分母的計算結(jié)果是由24位的二進制數(shù)表示的,其小數(shù)點在左數(shù)第四位和第五位之間。這就相當于分子的小數(shù)點相對分母向右移了27位,因此,在利用改進方案計算出商值之后,商的低27位均表示小數(shù)部分。
利用CORDIC算法與高效除法器得到的Sigmoid函數(shù)的仿真結(jié)果如表2所示,其中,CORDIC電路單元經(jīng)歷20個時鐘周期得到輸出結(jié)果。除法器在軟件上設(shè)置了一個48次的循環(huán)程序。從中可以看出:仿真結(jié)果基本可以精確到小數(shù)點后4位,在精度上可以滿足一定的要求。表2給出了3組仿真值與理論值。
本文采用流水線的方式,在FPGA上實現(xiàn)了神經(jīng)網(wǎng)絡(luò)的Sigmoid激活函數(shù),在精度上和速度上均達到了一定的指標要求,可以滿足智能傳感器的故障自我診斷等需求。
表2 3組仿真值與理論值
當然,如果要求更高的精度,可以適當擴展操作數(shù)的位寬和迭代次數(shù),以滿足傳感器更高的智能化要求。下一步的工作是用這一函數(shù)來構(gòu)建各種神經(jīng)網(wǎng)絡(luò)FPGA處理芯片,并應(yīng)用到傳感器信號的智能處理或基于FPGA的圖像視頻處理系統(tǒng)中。例如:在很多傳感器中,都存在交叉敏感的問題,即傳感器所測量的目標參數(shù)恒定時,而傳感器的實際輸出還會受到其他非目標參數(shù)的影響。為了解決交叉敏感的問題,可以采用多傳感器信息融合的方法來剔除無用信息。此時,神經(jīng)網(wǎng)絡(luò)芯片模塊便可植入到傳感器當中,對輸入的各種數(shù)據(jù)進行自適應(yīng)學習,實現(xiàn)以學習為基礎(chǔ)的數(shù)據(jù)融合,從而達到改善傳感器性能的目的。
參考文獻:
[1]劉君華.智能傳感器系統(tǒng)[M]西安:西安電子科技大學出版社,2000:37.
[2]王 茜,董學人,尉吉勇,等.神經(jīng)網(wǎng)絡(luò)技術(shù)在智能傳感器系統(tǒng)中的應(yīng)用與發(fā)展[J] .自動化儀表,2005,25(7):1-3.
[3]張智明,張仁杰.神經(jīng)網(wǎng)絡(luò)激活函數(shù)及其導數(shù)的FPGA 實現(xiàn)[J].現(xiàn)代電子技術(shù),2008,281(18):139-142.
[4]Myers D J,Hutchinson R A.Efficient implementation of piecewise linear activation function for digital VLSI neural network-s[J].Electronics Letters,1989,25(24):1662-1663.
[5]張 蕭,黃 晞,仲偉漢,等.Sigmoid函數(shù)及其導函數(shù)的FPGA實現(xiàn)[J].福建師范大學學報:自然科學版,2011,27(2):63.
[6]Volder J.The CORDIC trigonometric computingtechnique[J].IRE Trans on Electronic Computers,1959,8(5):330-334.
[7]Walther J.A unified algorithm for elementary functions[C]∥Proc of Spring Joint Computer Conf,Berlin,1971:379-385.