未来智库 > 神经网络论文 > 【神经网络激活函数及其导数的FPGA实现】
    关键词:神经网络;sigmoid函数;分段线性逼近;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 引 言
    
    在神经网络的FPGA设计中,神经元的激活函数及其导数的实现是一个重要的环节。神经元的激活函数有多种形式,包括阈值函数、分段线性函数以及sigmoid函数等。但使用得最广泛的是sigmoid函数[1]。其表达式如下:y=f(x)=1(1+e-x)(1)
    它的一阶导函数为:y′=f′(x)=e-x(1+e-x)2=y(1-y)(2)
    大规模数字集成电路的发展,使得采用FPGA实现神经网络成为可能。在数字设计中,实现sigmoid函数有很多种方法可以选择。介绍如下:
    (1) 泰勒级数展开
    可以求sigmoid函数的5阶泰勒级数来进行逼近[2]。这种方法需要乘法器,虽然目前的FPGA中集成有硬件乘法器,但对于神经网络来说,有限的硬件乘法器更应该用于网络中大量的并行计算。
    (2) 简单的查找表
    可以将sigmoid函数及其导数的值存在RAM或ROM中,这将消耗大量的存储器。例如:考虑一个16位输入,16位输出的查找表,它将消耗128 kb的存储器。尽管现在FPGA中有着较多的RAM,但考虑到神经元的权值也要消耗较多RAM,因此这个方法不太实用。
    (3) 基于坐标旋转数字计算机算法的方法
    坐标旋转数字计算机(CORDIC[35])算法是迭代算法,虽然精度可以做得比较高,但需要占用较多的FPGA资源。
    以上3种sigmoid函数的实现均需要占用较多的资源。本文采用分段线性(PWL)逼近的方法,在FPGA中实现sigmoid函数及其导数的映射。这种方法占用较少的FPGA资源,能较好地实现BP神经网络的在线训练。
    
    2 PWL逼近
    
    PWL逼近的基本思想是用一系列折线来逼近sigmoid函数及其导函数。在实现的时候,可以将分段函数的断点存入查找表,然后根据线性函数y=mx+c来计算中间值。无疑,这要使用到乘法器。对此,如果乘法器其中的一个输入是2的次幂,那么乘法操作就可以用移位来代替。
    若用来逼近sigmoid函数及其导数的线性函数的斜率均为2的次幂,则这个问题就可以得到较好的解决。这与用13段折线来逼近A律压缩曲线[6](A=87.6)类似。
    2.1 sigmoid函数的PWL逼近
    在sigmoid函数的PWL逼近中,采用13段折线逼近可能会使BP神经网络的训练性能变坏,难以收敛。这是因为如果采用13段折线逼近,则在x=0处折线的斜率为1(与0.25相差较大)。而sigmoid函数的导数在x=0处的值为0.25。因此,采用同样思路修改逼近折线,采用15段折线逼近是可行的。
    下面详细给出15段折线逼近的做法。图1绘出了15段折线逼近sigmoid函数的曲线。表1给出15段折线逼近sigmoid函数的真值表。由于sigmoid函数的对称性,这里只给出了当x≥0时的数据。根据参考文献[7]对硬件实现神经网络所需精度的论述,确定该表的输入为16位,最高位为符号位,整数占3位,小数占12位。输出也是16位,小数占15位,最高位为符号位。以输入范围为0→1为例,在该范围内,折线的斜率为0.25,故输出以0.5为起点,将输入的小数部分右移2位,以实现乘以0.25的功能。这样就可以避免使用乘法器,有效节省了FPGA的资源。
    图1 sigmoid函数的15段折线逼近2.2 sigmoid函数的导数的PWL逼近
    Sigmoid函数的导数的实现可以采用如下方法:
    (1) 利用式(2)和已得到的sigmoid函数逼近,由y(1-y)计算出sigmoid的导数,但这仍需要乘法器。这里不予考虑。
    (2) 与sigmoid函数的实现类似,采用15段折线逼近。图2为用15段折线逼近sigmoid函数的导数的曲线。表2给出15段折线逼近sigmoid函数的导数的真值表。由于sigmoid函数的导函数的对称性,这里也只给出了当x≥0时的数据。同样,该表的输入为16位,最高位为符号位,整数占3位,小数占12位。输出也是16位,小数占15位,最高位为符号位。表中下划线出表示该处的二进制位需取反。以输入范围为1→2为例,在该范围内,折线的斜率为-0.062 5,输出以0.125为起点,故需要将小数部分的二进制位取反后,再右移4位。该方法同样避免了乘法。

         图2 sigmoid函数的导数的15段折线逼近(3) 采用阶梯函数进行逼近,这是分段线性逼近的一种特殊情况,这里折线的斜率为0。图3为采用阶梯函数对sigmoid函数的导数进行15段逼近的曲线。表3给出15段折线逼近sigmoid函数的导数的真值表。值得注意的是,在BP神经网络的训练中,sigmoid函数的导数采用15段阶梯函数进行逼近时,其网络的训练性能要比采用15段折线逼近的好。这是因为采用15段阶梯函数逼近sigmoid函数的导数时,在x=0附近,函数值均为0.25,而用15段折线逼近时,在x=0附近,函数值的变化比较快,折线斜率为±0.031 25。故虽然采用15段折线逼近更能逼近sigmoid函数的导数的真实值,但训练性能仍没有15段阶梯函数逼近的好。
    图3 sigmoid函数的导数的15段阶梯函数逼近3 FPGA实现
    3.1 sigmoid函数的FPGA实现
    由于sigmoid函数的对称性,在表2中只给出当x≥0时的15段折线逼近真值表。由于整个神经网络计算中采用的是有符号的二进制补码,所以FPGA实现时首先根据激活函数输入的最高位(MSB)来判断输入是正数还是负数。若MSB=0,则为正数,直接可以根据表1得到sigmoid函数值;若MSB=1,则为负数,将负数取绝对值(去除符号位,将输入做1次求补运算),然后根据表1可以得到相应的值,由于sigmoid函数的对称性,再用1减去所得的值(实现时直接将表1输出的小数部分取反加1即可,也就是做一次求补运算),就可以得到对应的sigmoid函数值。表1可以用查找表(LUT)实现。实现sigmoid函数的电路结构如图4所示。图中的MSB控制输入是否进行求补运算。
    根据上述电路结构,在Altera的FLEX10KE系列FPGA上做了综合。实现sigmoid函数的15段折线逼近占用了119个LC(不使用EAB的情况下),最小时钟周期可达8.7 ns。
    3.2 sigmoid函数的导数的FPGA实现
    sigmoid函数的导函数也是对称的,在表2中亦只给出当x≥0时的15段折线逼近真值表和15段阶梯函数逼近真值表。与第3.1节中所述类似,用FPGA实现sigmoid函数的导数时首先根据其输入的最高位(MSB)来判断输入是正数还是负数。若MSB=0,则为正数,直接可以根据表2或表3得到sigmoid函数的导数值。若MSB=1,则为负数,将负数取绝对值(去除符号位,将输入做一次求补运算),然后根据表2或表3可以得到相应的值。由于sigmoid函数的导函数关于y轴对称,故查表所得的结果无需再做求补运算。表2和表3同样可以用查找表(LUT)实现。图5给出实现sigmoid函数的导数的电路结构。图中的MSB依然是控制输入是否进行求补运算的信号。
    表1 sigmoid函数的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函数的导数的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函数的导数的15段阶梯函数逼近真值表
    输入范围输入输出输出范围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函数的导数的15段折线逼近和15段阶梯函数逼近。15段折线逼近占用了91个LC(不使用EAB的情况下),最小时钟周期可达8.7 ns;15段阶梯函数逼近占用19个LC(不使用EAB的情况下),最小时钟周期可达4.0 ns。
    图4 sigmoid函数的电路结构图图5 sigmoid函数的导数的电路结构图4 结 语
    本文采用分段线性逼近的方法在FPGA上实现了神经网络激活函数(sigmoid函数)及其导数的映射。这种实现方式避免了乘法器的使用,节省了FPGA的资源,使得FPGA中宝贵的硬件乘法器可以更多的用在神经网络的并行计算中。所实现的sigmoid函数及其导数的映射可以在BP神经网络的在线训练中得到较好的应用。
    
    参 考 文 献
    [1]韩力群.人工神经网络教程[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].华中科技大学学报:自然科学版,2007,35,(9):114117.
    [6]樊昌信,张甫翊,徐炳祥,等.通信原理[M].北京:国防工业出版社,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格式阅读原文

转载请注明来源。原文地址:https://www.7428.cn/vipzj17196/
 与本篇相关的热门内容: