Sigmod函数的定点计算

Sigmod函数在深度神经网络中是一个很重要的函数,在做嵌入式优化的时候,由于需要计算e^x,倒数等函数,这些非线性函数会极大的影响计算的效率,一般嵌入式设备没有对应的硬件单元,因此需要把这类超越函数转化为乘加的计算,从而节省计算时间(也不可避免的损失精度)。

1.函数表达式与函数图像

Sigmod_Function.png

Sigmod_Image.png

2.应用

对于深度神经网络,卷积的计算是乘加,属于线性变化,而各种目标函数是很复杂的非线性函数,需要引入非线性变化,使得深度神经网络能够拟合非线性函数变化。因此,在深度神经网络中引入了激活层(activiation layer),除了Sigmod激活函数外,常用的激活函数有:

1)RELU:

    函数表达式:                   f(x) = max(0,x)

2)TANH:

   函数表达式:
Tanh.png

3.Sigmod函数的近似计算

为了通过乘加的计算,拟合非线性函数Sigmod,可以将该函数进行泰勒展开,通常情况下,只需要进行一次的展开,就可以达到满意的精度,并且最终的计算可以表示为kx+b的形式,适合嵌入式设备进行计算。

1)泰勒展开一次展开公式(假定在x=a处进行泰勒展开):

    f(x) = f'(a)(x-a)+f(a)

2)Sigmod函数的泰勒展开:

    \frac{e^{-a}}{1+e^{-a}}x + \frac{1+(1-a)e^{-a}}{(1+e^{-a})^2}
Taylor.png

4.建立查找表

由sigmod函数的图像可知,在x的取值范围内,(-8,8)之外,sigmod函数的值域已经几乎不会变化。因此建表的范围为(-8,8),取步长为0.25,总计64个数。
由于计算的结果都是浮点数,需要将浮点数转换为整数,转换公式如下:

slope_fixed[i] = floor(slope[i]*(1<<16)+0.5)

最终的表格如下:


Paste_Image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 通过教程,我们完成一个投票应用: 一个通用网址:大家可以投票,并查看投票数。 一个管理员网址: 管理员添加、修改和...
    今年说话算话阅读 3,535评论 0 0
  • 好多年后 有时还会想起 那个五月的光景 开满白色栀子花的小院落 有一株大雪松 夜色静谧柔和 那里伫着一个少年的心 ...
    远方孤雁阅读 2,187评论 0 2
  • 柚子茶味的夏天 转头就能邂逅这里的天空与森林的日子也要到完结之时了 多想把蝉鸣装进口袋,取下云朵塞进枕套,带着一起去旅行
    第三宇宙阅读 1,459评论 0 0

友情链接更多精彩内容