Sigmod函数在深度神经网络中是一个很重要的函数,在做嵌入式优化的时候,由于需要计算e^x,倒数等函数,这些非线性函数会极大的影响计算的效率,一般嵌入式设备没有对应的硬件单元,因此需要把这类超越函数转化为乘加的计算,从而节省计算时间(也不可避免的损失精度)。
1.函数表达式与函数图像
2.应用
对于深度神经网络,卷积的计算是乘加,属于线性变化,而各种目标函数是很复杂的非线性函数,需要引入非线性变化,使得深度神经网络能够拟合非线性函数变化。因此,在深度神经网络中引入了激活层(activiation layer),除了Sigmod激活函数外,常用的激活函数有:
1)RELU:
函数表达式: f(x) = max(0,x)
2)TANH:
函数表达式:
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}
4.建立查找表
由sigmod函数的图像可知,在x的取值范围内,(-8,8)之外,sigmod函数的值域已经几乎不会变化。因此建表的范围为(-8,8),取步长为0.25,总计64个数。
由于计算的结果都是浮点数,需要将浮点数转换为整数,转换公式如下:
slope_fixed[i] = floor(slope[i]*(1<<16)+0.5)
最终的表格如下: