Sigmoid函数的拟合法分析及其高效处理

人工智能

621人已加入

描述

摘 要: 使用分段非线性逼近算法计算超越函数,以神经网络中应用最为广泛的Sigmoid函数为例,结合函数自身对称的性质及其导数不均匀的特点提出合理的分段方法,给出分段方式同逼近多项式阶数对逼近结果精度的影响。完成算法在FPGA上的硬件实现,给出一种使用三阶多项式处理Sigmoid函数的拟合结果及流水线架构,处理精度达到10-5数量级,最大频率达到127.327 MHz,满足了高速、高精度的处理要求。
 

0 引言

在实时图像处理、数字信号处理等领域内,经常需要对非线性函数进行高速计算[1]。而在人工神经网络中更是需要对大量的非线性函数进行计算。因此,在人工神经网络的研究领域内,研究如何高速地处理非线性函数具有十分重要的意义。在人工神经网络中应用最为广泛的是Sigmoid函数。目前对于Sigmoid函数实现技术的研究主要分为软件实现和硬件实现两个方面。由于软件相比硬件而言速度较慢并且并行程度很低,所以无法满足其快速处理的要求[2]。因此,在超大规模集成电路快速发展的当今时期,研究如何利用硬件快速处理Sigmoid函数显然更加有意义。

FPGA凭借其可重构技术的灵活性,成为解决Sigmoid函数高速计算问题的有力工具。目前利用FPGA计算Sigmoid函数常用的方法有查找表法、CORDIC算法、Taylor级数展开法和分段线性逼近法。查找表法[3]提前将所有的计算结果保存在一个ROM中,这种方法计算方便且容易实现,但是随着函数计算精度的提高和拟合区间的增加,其所需求的存储资源会显著增加,资源消耗很高。CORDIC算法[4]通过多次迭代将一些复杂的运算转换成为简单的运算,但是随着精度增高,其算法的迭代次数也会提高,计算速度会减慢。Taylor级数展开法[5]在精度要求较高的条件下会增加乘法器和加法器的使用,资源消耗巨大。分段线性逼近法[6-7]将查找表和低阶多项式相结合,计算速度较快,是当前解决此问题的主流方法,然而在有限的分段区间用低阶的多项式进行拟合运算,其计算结果在精度上并没有优势,难以实现高精度的运算要求。

为了解决上述问题,本文采用传统的分段非线性逼近法来处理Sigmoid函数。文献[8]中使用了分段非线性逼近法来处理神经网络中常见的双曲正切函数,然而文中并没有给出分段方法的依据,同时在各小段的分段区间所得到的精度也差异很大。因此,本文针对这一问题,以Sigmoid函数为研究对象,结合Sigmoid函数自身对称及其导数不均匀的性质,利用数值分析中的最小二乘法作为逼近原理,给出合理的分段方式。同时给出对比均匀分段的处理方式下逼近精度的差异情况。利用硬件描述语言实现硬件结构的设计,并在Xilinx Virtex-5系列的XC5VLX110T器件上完成实际验证和性能测试,从资源使用、运算速度同计算精度等方面对设计结果进行合理评估。

1 Sigmoid函数的分段非线性拟合方案及结果分析

分段非线性逼近法的基本原理是用高阶多项式来逼近曲线。首先将待逼近函数按照一定的方式进行分段,之后对每一个小段构建高阶多项式近似地代替原曲线,从而将复杂的非线性函数的计算问题转换成为多项式的计算问题。

由泰勒公式的原理可知,函数在某一点按照泰勒公式展开,随着展开的项数越来越多,逼近式的误差会越来越小。并且,随着项数的增加,每一项在数值上逐渐递减,并最终趋向于无穷小。函数在某一点按照泰勒公式展开,保留N阶多项式时,其之后的所有项数均影响误差,并且(N+1)阶导函数的数值直接影响N阶多项式的逼近结果。具体影响的方式为:N+1阶导数取绝对值后,其值越大,表明函数在这一点处使用N阶多项式逼近的误差越高,因此在这点处对应的分段区间间隔应该相对较小;其值越小,表明函数在这一点处使用N阶多项式逼近的误差越低,因此在这点处对应的分段区间间隔应该相对较大。在考虑分段时,可以根据N+1阶导数的数值大小,将函数的分段区间进行动态调整,避免造成误差过大。通过这样的处理方式,可以对分段方式进行一些优化。下面结合Sigmoid函数进行具体分析。

首先分析Sigmoid函数及其导函数的性质,如图1。F(x)为Sigmoid函数,G(x)为其4阶导函数。在保证足够的分段区间时,使用3阶多项式就能够得到较高的逼近精度。因此,本文使用3阶多项式逼近Sigmoid函数,4阶导函数G(x)直接影响逼近的误差。通过研究图像,得出以下结论:

FPGA

(1)Sigmoid函数F(x)是以点(0,0.5)为对称中心的函数,因此在计算Sigmoid函数值时只需计算正区间或负区间,另一半可通过对称关系得到;

(2)以正区间为研究对象,Sigmoid函数的4阶导数在x=1处附近取得最大值,并向两侧衰减,随着x的不断增大,4阶导数最终趋向于0。

为了验证这种基于导数的分段方法在逼近结果的精度方面是否具有优势,本文选择了将这种分段方式与传统的等间距分段方式作对比。首先,将Sigmoid函数的待处理区间进行等分,之后比较每个子区间的函数4阶导数的整体变化规律,对导数相对较大的区间进行缩短,对导数相对较小的区间进行扩展。分别对这两种分段方式下所有的子区间构建3阶多项式,通过对比函数各子区间及整体区间的误差情况来验证此分段方法的优势。

本文选用MATLAB作为函数拟合工具,构建拟合多项式使用最小二乘法原理,数据类型选取双精度浮点数,这样可以保证在计算过程中精度比较高。下面分别给出两种分段方式下的分段结果及误差对比。为了保证实验结果可靠,各分段区间取的数足够大(这里以0.000 1为间隔取数),结果见表1。

FPGA

通过表1可以得出,当使用三阶多项式对Sigmoid函数进行逼近时,参照4阶导函数的数值而分段的处理方式在平均绝对误差和均方差两项指标上均优于等间距分段的处理方式。从整体区间上看,平均绝对误差减小了51.4%,均方差减小了71.9%。

2 Sigmoid函数的FPGA实现

为了实现高精度的拟合要求,本文采用表1中基于导数的分段方式,使用三阶多项式对Sigmoid函数进行拟合处理,并给出其FPGA实现结构,如图2所示。设三阶多项式为y=Ax3+Bx2+Cx+D,其在FPGA中的计算流程为:

(1)取系数。各分段区间下的系数A、B、C、D预先存储在RAM中,通过输入x取出与之对应的系数A、B、C、D。

(2)计算Cx和x2。

(3)计算Cx+D、Bx2和x2。

(4)计算Bx2+Cx+D和Ax3。

(5)计算Ax3+Bx2+Cx+D。

(6)用1和步骤(5)的结果做减法。

(7)选择器。当输入的x为非负数时,输出为步骤(5)的结果;若输入的x为负数,输出为步骤(6)的结果。

FPGA

上述所有的乘法器、加法器和减法器的设计采用Xilinx公司提供的32位单精度浮点型IP核实现,整个算法采用了流水线结构,数据输入后,10个周期延迟后得到计算结果。具体实验数据如表2所示。

FPGA

在实验过程中,表1的误差结果是由算法在FPGA上计算得到的结果与Sigmoid函数的真实值(精度远高于实验的精度)之间的对比求得的。表2中的误差结果与表1中的误差结果相比较在平均绝对误差方面略有不足,是由于在FPGA中使用的32位单精度浮点数在精度上不同与MATLAB上使用的64位双精度浮点数,所以两者之间存在略微差别,然而并不影响算法的准确性。

采用基于导数的分段方式并使用三阶多项式的拟合方案在FPGA上所使用的资源虽然比经典的CORDIC算法及分段线性逼近方法较多,然而这种拟合方案在算法的精度上达到了10-5数量级,各小段分段区间甚至达到10-6数量级。当然,采用更高阶数的多项式逼近在理论上能够实现更高的精度,然而这样的代价是会消耗更多的硬件资源。本文使用的分段非线性逼近法对Sigmoid函数的处理结果上,精度远远大于另两种算法在现有的文献中所取得的精度。并且若要达到较高精度,CORDIC算法会大大的增加迭代次数从而降低运算速度,分段线性逼近则会大大的增加存储资源。

3 结论

本文针对人工神经网络中应用最为广泛的Sigmoid函数,采用传统的分段非线性逼近方法,结合Sigmoid函数自身对称的性质及其导数不均匀的特点,给出合理的分段方式,在各小段分段区间内使用数值分析中经典的最小二乘法作为拟合逼近原理,得出初始分段间距同逼近多项式的阶数对拟合结果精度的影响。按照上述方法给出一种在精度上达到了10-5数量级的Sigmoid函数的拟合方案,实现了现阶段对Sigmoid函数的高速、高精度的处理要求。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分