Python与机器学习数学

Sigmoid函数的求导证明

2018-04-06  本文已影响136人  Jeru_d39e

前文提到了神经网络中的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

S1

Chain 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:

1. Differential on wiki

2. Chain rule on wiki

3. Derivatives of logarithmic and exponential functions

4. MIT open course - Multivariable Calculus

5. Mathematics Stack Exchange

上一篇下一篇

猜你喜欢

热点阅读