摘 要:神經(jīng)元的激活函數(shù)是神經(jīng)網(wǎng)絡的重要組成部分。采用折線斜率為2的次冪的分段線性逼近方法實現(xiàn)激活函數(shù)(sigmoid函數(shù))及其導數(shù)的映射。該方法在FPGA實現(xiàn)時不需要使用硬件乘法器,而且可以節(jié)約大量的RAM單元。由于神經(jīng)網(wǎng)絡的并行計算需要消耗大量的硬件乘法器和RAM,因此,與其他方法相比,該方法為整個神經(jīng)網(wǎng)絡的FPGA實現(xiàn)有效地節(jié)省了大量寶貴的FPGA資源,可以較好地應用在BP神經(jīng)網(wǎng)絡的在線訓練中。
關鍵詞:神經(jīng)網(wǎng)絡;sigmoid函數(shù);分段線性逼近;FPGA
中圖分類號:TP389.1 文獻標識碼:B 文章編號:1004373X(2008)1813904
Implementation of Activation Function and Its Derivative for Neural Networks Based on FPGA
ZHANG Zhiming,ZHANG Renjie
(Optical and Electronic Information Engineering College,University of Shanghai for Science and Technology,Shanghai,200093,China)
Abstract:The activation function of neuron plays an important role in neural networks.Method of powers of two piecewise linear approximation,used to approximate the activation function (sigmoid function) and its derivative,is presented.In the FPGA implementation,this method doesn′tneed hardware multiplier,but also saves a lot of RAM units.Because of consuming multipliers and RAMs vastly when implementing parallel calculation in neural networks,this method,compares with others,can save a lot of valuable resources in FPGA,and applies well in the on line training of BP neural networks.
Keywords:neural network;sigmoid function;piecewise linear approximation;FPGA
1 引 言
在神經(jīng)網(wǎng)絡的FPGA設計中,神經(jīng)元的激活函數(shù)及其導數(shù)的實現(xiàn)是一個重要的環(huán)節(jié)。神經(jīng)元的激活函數(shù)有多種形式,包括閾值函數(shù)、分段線性函數(shù)以及sigmoid函數(shù)等。但使用得最廣泛的是sigmoid函數(shù)[1]。其表達式如下:y=f(x)=1(1+e-x)(1)
它的一階導函數(shù)為:y′=f′(x)=e-x(1+e-x)2=y(1-y)(2)
大規(guī)模數(shù)字集成電路的發(fā)展,使得采用FPGA實現(xiàn)神經(jīng)網(wǎng)絡成為可能。在數(shù)字設計中,實現(xiàn)sigmoid函數(shù)有很多種方法可以選擇。介紹如下:
(1) 泰勒級數(shù)展開
可以求sigmoid函數(shù)的5階泰勒級數(shù)來進行逼近[2]。這種方法需要乘法器,雖然目前的FPGA中集成有硬件乘法器,但對于神經(jīng)網(wǎng)絡來說,有限的硬件乘法器更應該用于網(wǎng)絡中大量的并行計算。
(2) 簡單的查找表
可以將sigmoid函數(shù)及其導數(shù)的值存在RAM或ROM中,這將消耗大量的存儲器。例如:考慮一個16位輸入,16位輸出的查找表,它將消耗128 kb的存儲器。盡管現(xiàn)在FPGA中有著較多的RAM,但考慮到神經(jīng)元的權值也要消耗較多RAM,因此這個方法不太實用。
(3) 基于坐標旋轉數(shù)字計算機算法的方法
坐標旋轉數(shù)字計算機(CORDIC[35])算法是迭代算法,雖然精度可以做得比較高,但需要占用較多的FPGA資源。
以上3種sigmoid函數(shù)的實現(xiàn)均需要占用較多的資源。本文采用分段線性(PWL)逼近的方法,在FPGA中實現(xiàn)sigmoid函數(shù)及其導數(shù)的映射。這種方法占用較少的FPGA資源,能較好地實現(xiàn)BP神經(jīng)網(wǎng)絡的在線訓練。
2 PWL逼近
PWL逼近的基本思想是用一系列折線來逼近sigmoid函數(shù)及其導函數(shù)。在實現(xiàn)的時候,可以將分段函數(shù)的斷點存入查找表,然后根據(jù)線性函數(shù)y=mx+c來計算中間值。無疑,這要使用到乘法器。對此,如果乘法器其中的一個輸入是2的次冪,那么乘法操作就可以用移位來代替。
若用來逼近sigmoid函數(shù)及其導數(shù)的線性函數(shù)的斜率均為2的次冪,則這個問題就可以得到較好的解決。這與用13段折線來逼近A律壓縮曲線[6](A=87.6)類似。
2.1 sigmoid函數(shù)的PWL逼近
在sigmoid函數(shù)的PWL逼近中,采用13段折線逼近可能會使BP神經(jīng)網(wǎng)絡的訓練性能變壞,難以收斂。這是因為如果采用13段折線逼近,則在x=0處折線的斜率為1(與0.25相差較大)。而sigmoid函數(shù)的導數(shù)在x=0處的值為0.25。因此,采用同樣思路修改逼近折線,采用15段折線逼近是可行的。
下面詳細給出15段折線逼近的做法。圖1繪出了15段折線逼近sigmoid函數(shù)的曲線。表1給出15段折線逼近sigmoid函數(shù)的真值表。由于sigmoid函數(shù)的對稱性,這里只給出了當x≥0時的數(shù)據(jù)。根據(jù)參考文獻[7]對硬件實現(xiàn)神經(jīng)網(wǎng)絡所需精度的論述,確定該表的輸入為16位,最高位為符號位,整數(shù)占3位,小數(shù)占12位。輸出也是16位,小數(shù)占15位,最高位為符號位。以輸入范圍為0→1為例,在該范圍內,折線的斜率為0.25,故輸出以0.5為起點,將輸入的小數(shù)部分右移2位,以實現(xiàn)乘以0.25的功能。這樣就可以避免使用乘法器,有效節(jié)省了FPGA的資源。
圖1 sigmoid函數(shù)的15段折線逼近2.2 sigmoid函數(shù)的導數(shù)的PWL逼近
Sigmoid函數(shù)的導數(shù)的實現(xiàn)可以采用如下方法:
(1) 利用式(2)和已得到的sigmoid函數(shù)逼近,由y(1-y)計算出sigmoid的導數(shù),但這仍需要乘法器。這里不予考慮。
(2) 與sigmoid函數(shù)的實現(xiàn)類似,采用15段折線逼近。圖2為用15段折線逼近sigmoid函數(shù)的導數(shù)的曲線。表2給出15段折線逼近sigmoid函數(shù)的導數(shù)的真值表。由于sigmoid函數(shù)的導函數(shù)的對稱性,這里也只給出了當x≥0時的數(shù)據(jù)。同樣,該表的輸入為16位,最高位為符號位,整數(shù)占3位,小數(shù)占12位。輸出也是16位,小數(shù)占15位,最高位為符號位。表中下劃線出表示該處的二進制位需取反。以輸入范圍為1→2為例,在該范圍內,折線的斜率為-0.062 5,輸出以0.125為起點,故需要將小數(shù)部分的二進制位取反后,再右移4位。該方法同樣避免了乘法。
圖2 sigmoid函數(shù)的導數(shù)的15段折線逼近(3) 采用階梯函數(shù)進行逼近,這是分段線性逼近的一種特殊情況,這里折線的斜率為0。圖3為采用階梯函數(shù)對sigmoid函數(shù)的導數(shù)進行15段逼近的曲線。表3給出15段折線逼近sigmoid函數(shù)的導數(shù)的真值表。值得注意的是,在BP神經(jīng)網(wǎng)絡的訓練中,sigmoid函數(shù)的導數(shù)采用15段階梯函數(shù)進行逼近時,其網(wǎng)絡的訓練性能要比采用15段折線逼近的好。這是因為采用15段階梯函數(shù)逼近sigmoid函數(shù)的導數(shù)時,在x=0附近,函數(shù)值均為0.25,而用15段折線逼近時,在x=0附近,函數(shù)值的變化比較快,折線斜率為±0.031 25。故雖然采用15段折線逼近更能逼近sigmoid函數(shù)的導數(shù)的真實值,但訓練性能仍沒有15段階梯函數(shù)逼近的好。
圖3 sigmoid函數(shù)的導數(shù)的15段階梯函數(shù)逼近3 FPGA實現(xiàn)
3.1 sigmoid函數(shù)的FPGA實現(xiàn)
由于sigmoid函數(shù)的對稱性,在表2中只給出當x≥0時的15段折線逼近真值表。由于整個神經(jīng)網(wǎng)絡計算中采用的是有符號的二進制補碼,所以FPGA實現(xiàn)時首先根據(jù)激活函數(shù)輸入的最高位(MSB)來判斷輸入是正數(shù)還是負數(shù)。若MSB=0,則為正數(shù),直接可以根據(jù)表1得到sigmoid函數(shù)值;若MSB=1,則為負數(shù),將負數(shù)取絕對值(去除符號位,將輸入做1次求補運算),然后根據(jù)表1可以得到相應的值,由于sigmoid函數(shù)的對稱性,再用1減去所得的值(實現(xiàn)時直接將表1輸出的小數(shù)部分取反加1即可,也就是做一次求補運算),就可以得到對應的sigmoid函數(shù)值。表1可以用查找表(LUT)實現(xiàn)。實現(xiàn)sigmoid函數(shù)的電路結構如圖4所示。圖中的MSB控制輸入是否進行求補運算。
根據(jù)上述電路結構,在Altera的FLEX10KE系列FPGA上做了綜合。實現(xiàn)sigmoid函數(shù)的15段折線逼近占用了119個LC(不使用EAB的情況下),最小時鐘周期可達8.7 ns。
3.2 sigmoid函數(shù)的導數(shù)的FPGA實現(xiàn)
sigmoid函數(shù)的導函數(shù)也是對稱的,在表2中亦只給出當x≥0時的15段折線逼近真值表和15段階梯函數(shù)逼近真值表。與第3.1節(jié)中所述類似,用FPGA實現(xiàn)sigmoid函數(shù)的導數(shù)時首先根據(jù)其輸入的最高位(MSB)來判斷輸入是正數(shù)還是負數(shù)。若MSB=0,則為正數(shù),直接可以根據(jù)表2或表3得到sigmoid函數(shù)的導數(shù)值。若MSB=1,則為負數(shù),將負數(shù)取絕對值(去除符號位,將輸入做一次求補運算),然后根據(jù)表2或表3可以得到相應的值。由于sigmoid函數(shù)的導函數(shù)關于y軸對稱,故查表所得的結果無需再做求補運算。表2和表3同樣可以用查找表(LUT)實現(xiàn)。圖5給出實現(xiàn)sigmoid函數(shù)的導數(shù)的電路結構。圖中的MSB依然是控制輸入是否進行求補運算的信號。
表1 sigmoid函數(shù)的15段折線逼近真值表
輸入范圍輸入輸出輸出范圍x→xxxxx.xxxxxxxxxxxxx.xxxxxxxxxxxxxxxx→x0→10000.abcdefghijkl0.10abcdefghijkl00.5→0.751→20001.abcdefghijkl0.110abcdefghijkl0.75→0.8752→30010.abcdefghijkl0.1110abcdefghijk0.875→0.93753→40011.abcdefghijkl0.11110abcdefghij0.9375→0.968754→50100.abcdefghijkl0.111110abcdefghi0.96875→0.9843755→60101.abcdefghijkl0.1111110abcdefgh0.984375→0.99218756→70110.abcdefghijkl0.11111110abcdefg0.9921875→0.996093757→80111.abcdefghijkl0.11111111abcdefg0.99609375→1
表2 sigmoid函數(shù)的導數(shù)的15段折線逼近真值表
輸入范圍輸入輸出輸出范圍x→xxxxx.xxxxxxxxxxxxx.xxxxxxxxxxxxxxxx→x0→10000.abcdefghijkl0.00111abcdefghij0.25→0.218751→20001.abcdefghijkl0.0010abcdefghijk0.1875→0.1252→30010.abcdefghijkl0.0001abcdefghijk0.09375→0.06253→40011.abcdefghijkl0.000001abcdefghi0.03125→0.0156254→50100.abcdefghijkl0.0000001abcdefgh0.015625→0.00781255→60101.abcdefghijkl0.00000001abcdefg0.0078125→0.003906256→70110.abcdefghijkl0.000000001abcdef0.00390625→0.0019531257→80111.abcdefghijkl0.000000000abcdef0.001953125→0
表3 sigmoid函數(shù)的導數(shù)的15段階梯函數(shù)逼近真值表
輸入范圍輸入輸出輸出范圍x→xxxxx.xxxxxxxxxxxxx.xxxxxxxxxxxxxxxx→x0→10000.abcdefghijkl0.0100000000000000.25→0.251→20001.abcdefghijkl0.0010000000000000.125→0.1252→30010.abcdefghijkl0.0001000000000000.0625→0.06253→40011.abcdefghijkl0.0000100000000000.03125→0.031254→50100.abcdefghijkl0.0000010000000000.015625→0.0156255→60101.abcdefghijkl0.0000001000000000.0078125→0.00781256→70110.abcdefghijkl0.0000000100000000.00390625→0.003906257→80111.abcdefghijkl0.0000000010000000.001953125→0.001953125
同樣,在Altera的FLEX10KE系列FPGA上做sigmoid函數(shù)的導數(shù)的15段折線逼近和15段階梯函數(shù)逼近。15段折線逼近占用了91個LC(不使用EAB的情況下),最小時鐘周期可達8.7 ns;15段階梯函數(shù)逼近占用19個LC(不使用EAB的情況下),最小時鐘周期可達4.0 ns。
圖4 sigmoid函數(shù)的電路結構圖圖5 sigmoid函數(shù)的導數(shù)的電路結構圖4 結 語
本文采用分段線性逼近的方法在FPGA上實現(xiàn)了神經(jīng)網(wǎng)絡激活函數(shù)(sigmoid函數(shù))及其導數(shù)的映射。這種實現(xiàn)方式避免了乘法器的使用,節(jié)省了FPGA的資源,使得FPGA中寶貴的硬件乘法器可以更多的用在神經(jīng)網(wǎng)絡的并行計算中。所實現(xiàn)的sigmoid函數(shù)及其導數(shù)的映射可以在BP神經(jīng)網(wǎng)絡的在線訓練中得到較好的應用。
參 考 文 獻
[1]韓力群.人工神經(jīng)網(wǎng)絡教程[M].北京:北京郵電大學出版社,2006.
[2]Ouali J,Saucier G.Fast Generation of NeuroASICs[C].Proc.Int.Neural Networks Conf.,1990,2:563567.
[3]Deprettere E,Dewilde P,Udo P.Pipelined CORDIC Architectures for Fast VLSI Filtering and Array Processing[C].Proc.Int.Conf.Acoust,Speech,and Signal Proc.,1984:41.A.6.1-41.A.6.4.
[4]Javier Valls.Evaluation of CORDIC Algorithms for FPGA Design[J].Journal of VLSI Signal Processing,2002,32:207222.
[5]陳曦,王高峰,劉克剛,等.基于混合CORDIC 的神經(jīng)網(wǎng)絡激活函數(shù)的實現(xiàn)[J].華中科技大學學報:自然科學版,2007,35,(9):114117.
[6]樊昌信,張甫翊,徐炳祥,等.通信原理[M].北京:國防工業(yè)出版社,2001:197205.
[7]Jordan L Holt,Jenq-Neng Hwang.Finite Precision Error Analysis of Neural Network Hardware Implementations[J].IEEE Ttransactions on Computers,1993,42(3):281290.
作者簡介 張智明 男,1983年出生,上海人,上海理工大學光學與電子信息工程學院在讀碩士研究生。主要研究方向為測試信息獲取與處理。
張仁杰 男,1956年出生,山東人,上海理工大學黨委副書記,博士生導師,教授。主要研究方向為在線檢測技術與裝置、測試信息獲取與處理、特殊檢測技術與裝置等。
注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文