APP下载

sigmoid函数的高效率硬件实现研究

2018-09-25薛治天王正茂杨宇飞郝思源

电子测试 2018年16期
关键词:近似算法浮点数尾数

薛治天,王正茂,杨宇飞,郝思源

(合肥市合肥工业大学,安徽合肥,230000)

0 引言

由于数据格式是与精度和资源消耗相关的,现有方案大多选取自定义的数据格式以在降低逻辑资源消耗同时保证拟合精度,而工程应用中常用的是IEEE754标准的32bit单精度浮点格式,使得这种方法设计的模块再与其它模块进行运算时,需要进行数据格式转换,通信代价较大;若采用单精度浮点格式,采用以上现有方案,则难以达到逼近精度要求。

1 Remez提出的近似算法

根据切比雪夫定理给出,若 f (x)∈ C[a,b]存在n次的最佳一致逼近多项式(x)的充要条件是区间[a,b]上至少存在n+ 2 个交错点 { x1,x2, ...,xn+2}使得 f (x) −(x)在这些点上正负相间的取得最值,即满足:

切比雪夫定理从理论上给出了最佳一致逼近多项式的特性,而且给出了寻求最佳一致逼近多项式的方法,但是寻求交错点组十分困难。Remez于1957年,采用逐次逼近的思想,提出了一个求连续函数的最佳一致逼近多项式的近似算法,取得了良好效果。

Remez提出的近似算法由以下三步构成:

在[a,b]上选 n + 2 个由小到大排列的初始点列{x1, x2, ...,xn+2}作为近似交错点组,并设置精度ε>0;

利用上式求解方程组(2)得近似多项式和近似偏差En′(f,x);则迭代终止;否则,若取得中的点,构成一新的近似交错组。使在新点组在 f (x) − p*n(x)上仍然正负相间,返回步骤(2)。

2 运用Remez算法构造多项式逼近Sigmoid函数

针对sigmoid函数的最佳逼近,我们对传统的remez算法进行一定的改进以提高算法效率。

针对步骤(1),由于sigmoid函数的最佳逼近函数实际交错点在区间内近似均匀分布,故取均分区间的点作为初始近似交错点组,减少迭代步数。

针对步骤(3),传统的remez算法采用单一交换法,用 x*点取代{xi}中的点。我们采用同时交换法,对于求区间的最值,由于误差函数连续可导且容易得到其导函数,故采用牛顿法找到误差导函数列 Ki(x) =( x) −(x) xi≤x ≤ xi+1的零点列,可以证明该点列即为所求的{}点列。

图1 流程图

综合考虑逼近的精确程度以及硬件实现的特殊性,我们在区间[0,10]分为10段逼近模块,10段区间分别为[0,0.5][0.5,1] [1,1.5] [1.5,2] [2,3] [3,4] [4,5] [5,6] [6,8][8,10]

得到如下的逼近多项式:

表1 Sigmoid函数各段逼近多项式

3 根据Sigmoid函数达到高效率硬件实现

根据Sigmoid函数的性质可知在区间[10,+∞]和[-∞,-10]距离1和0的误差小于。如果总体误差控制在以内,三次多项式就可以达到要求。为了便于硬件二进制处理,选择区域左右端点均为2的幂次。

EEE754标准中规定float单精度浮点数在机器中表示用1位表示数字的符号,用8位来表示指数,用23位来表示尾数,即小数部分。

IEEE754标准中,一个规格化32位的浮点数x的真值表示为:

其中尾数域表示的值是1.M。因为规格化的浮点数的尾数域最左位总是1,故这一位不予存储,而认为隐藏在小数点的左边。在计算指数e时,对阶码E的计算采用源码的计算方式,因此32位浮点数的8bits的阶码E的取值范围是0到255。其中当E为全0或者全1时,是IEEE754规定的特殊情况。

图2 分段最佳一致逼近函数

32位单精度浮点数的阶码E由8位表示,取值范围为0-255,去除0和255这两种特殊情况,那么指数e的取值范围就是1-127=-126到254-127=127。阶码的二进制位数决定浮点数的表示范围,尾数的二进制位数表示浮点数的精度。32位浮点数尾数域有23位。那么浮点数以二进制表示的话精度是23位,23位所能表示的最大数是223-1=8388607,所以十进制的尾数部分最大数值是8388607,也就是说尾数数值超过这个值,float将无法精确表示,所以float最多能表示小数点后7位,但绝对能保证的为6位,也即float的十进制的精度为为6~7位。这样的数据表示格式可以满足我们对于计算范围和精度的要求。

流水线结构(pipeline architecture)是指在系统处理数据时,每个时钟脉冲都接受下一条处理数据的指令。流水线机构提高了系统处理数据的速度,同时对时序有严格的要求。

在仿真测试阶段,通过输入区间范围内的一组稳定递增的数据,每过3个周期输入一个data值,采用的流水线结构第一组数据会在24个周期后输出拟合值,我们与手工计算的实际值作比较,精度达到了10-6数量级,满足预期值。

图3 流水线架构实现

4 基于Remez算法的Sigmoid函数硬件高效率实现

本实施例中基于Remez算法的Sigmoid函数硬件高效率实现方法是:首先采用Remez最佳一致算法对Sigmoid函数进行四次多项式分段逼近,然后用流水线结构优化硬件实现模块。Remez给出了逐次逼近的思想,提出求连续函数的最佳一致逼近多项式的近似算法,取得了良好效果;由Remez提出的近似算法由以下三步构成:

第1步:在[a,b]上选 n + 2 个由小到大排列的初始点列{x1, x2, ...,xn+2}作为近似交错点组,并设置精度ε>0;

第2步:求解获得近似多项式 Pn(x ) 和近似偏差′(f,x);

综合考虑逼近的精确程度以及硬件实现的特殊性,本实施例中在区间[0,8]分为5段逼近模块,5段区间分别为[0,0.5],[0.5,1],[1,2],[2,4],[4,8],获得Sigmoid函数各段逼近多项式如表1所示。

表2 Sigmoid函数各段逼近多项式

根据Sigmoid函数的性质可知在区间[8,+∞]和[-∞,-8]距离1和0的误差小于。如果总体误差控制在以内,三次多项式就可以达到要求。为了便于硬件二进制处理,选择区域左右端点均为2的幂次。

流水线结构(pipeline architecture)是指在系统处理数据时,每个时钟脉冲都接受下一条处理数据的指令。流水线机构提高了系统处理数据的速度,同时对时序有严格的要求。

通过在quartusⅡ用Verilog HDL硬件语言编写程序然后结合modelsim强大的仿真功能进行联合仿真,Sigmoid函数时序仿真波形符合预期要求。在仿真测试阶段,通过输入区间范围内的一组稳定递增的数据,每过5个时钟周期输入一个data值,采用的流水线结构第一组数据会在45个周期后输出拟合值,通过与手工计算的实际值作比较,精度达到了10-6数量级,满足预期值。

5 总结

本文运用Remez算法构造多项式逼近Sigmoid函数,优化多项式逼近后的Sigmoid函数硬件实现架构,对优化后的多项式逼近的Sigmoid函数进行verilog硬件语言建模,并进行仿真分析通过算例分析证明了本文所采用的使用Remez算法构造多项式逼近Sigmoid函数拟合误差较低,运算速度快,精度较高,满足预期值,达到了高效率的硬件实现。

猜你喜欢

近似算法浮点数尾数
“改写”与“省略”三不同
四种Python均匀浮点数生成方法
连续自然数及乘积的尾数和奇偶性的分析
2019年度下半年《启迪与智慧》上下半月刊、《幽默与笑话》上下半月刊、《拳击与格斗》上半月刊抽大奖中奖结果
在C语言中双精度浮点数线性化相等比较的研究
非精确浮点数乘法器设计
应用自适应交叉近似算法快速计算导体RCS
求投影深度最深点的近似算法
有趣的九九乘法表
无压流六圆弧蛋形断面临界水深近似算法