前文提到了神经网络中的Sigmoid函数,实际上在反向传播中还会用到Sigmoid的导数,形式很简单: s(x)*(1-s(x)),但是我想把这个过程自己推导一次,顺便复习一下导数和微分。
Derivative(导数)和Differential(微分)
首先我画了一张图来说明什么是导数和微分,本质上就是在极限中以线性函数(直线)来表示非线性函数(曲线)。
My Cheatsheet红色的线是第一条割线(从[x,f(x)]到[x+h, f(x+h)]),(f(x+h) - f(x))/h 就是割线的斜率,物理学上是一段时间内的平均速度。
灰色的线是第二条割线,当割线围绕着[x, f(x)]为原点继续顺时针转动时,h会不断变小,小到极限就变成了[x, f(x)]的切线。
蓝色的线即这条切线,其斜率就是[x,f(x)]的导数,物理意义是当前这一个点的瞬间速度。
当h小到极限的时候dy(导数除以h)就是[x,f(x)]的微分。
割线斜率减去切线斜率即为误差函数E(h)
Reciprocal Rule(倒数法则)
根据微积分中的倒数法则,如果g(x) = 1/f(x), 则有
Reciprocal Rule这个简单公式也非常容易证明
R1再将极限表达式分拆一下
R2因为f在x点的连续性第二个极限表达式的分母等于f(x)的平方
R3现在利用倒数法则把Sigmoid函数的导数推导一下,这次我们记Sigmoid函数为s(x),它的倒置函数为f(x)
根据倒数法则从f(x)开始推导得出公式S1
S1Chain Rule(链式法则)
根据链式法则我们可以有关于幂指求导的推广
Chain Rule即
于是可以得出f(x)导数的另一种表达式S2
S2最后我们把S2和S1放到一起来消元就可以得到Sigmoid的导数公式了
Sigmoid Derivative用Python来实现如下逻辑:
# activation function
def sigmoid(z, derivative=False):
sigmoid = 1.0/(1.0+np.exp(-z))
if (derivative==True):
return sigmoid * (1-sigmoid)
return sigmoid
References:
3. Derivatives of logarithmic and exponential functions
网友评论