Sigmoid函数导数推导详解

  • 在逻辑回归中,Sigmoid函数的导数推导是一个关键步骤,它使得梯度下降算法能够高效地计算。

1. Sigmoid函数定义

首先回顾Sigmoid函数的定义:

g(z)=11+e−zg(z) = \frac{1}{1 + e^{-z}}g(z)=1+ez1

2. 导数推导过程

  1. 从Sigmoid函数出发:
    g(z)=11+e−zg(z) = \frac{1}{1 + e^{-z}}g(z)=1+ez1

  2. u=1+e−zu = 1 + e^{-z}u=1+ez,则g(z)=u−1g(z) = u^{-1}g(z)=u1

  3. 使用链式法则:
    dgdz=dgdu⋅dudz=−u−2⋅(−e−z)=e−z(1+e−z)2\frac{dg}{dz} = \frac{dg}{du} \cdot \frac{du}{dz} = -u^{-2} \cdot (-e^{-z}) = \frac{e^{-z}}{(1 + e^{-z})^2}dzdg=dudgdzdu=u2(ez)=(1+ez)2ez

  4. 现在,我们将其表示为g(z)g(z)g(z)的函数:
    e−z1+e−z=1−11+e−z=1−g(z)\frac{e^{-z}}{1 + e^{-z}} = 1 - \frac{1}{1 + e^{-z}} = 1 - g(z)1+ezez=11+ez1=1g(z)

  5. 因此:
    g′(z)=11+e−z⋅e−z1+e−z=g(z)⋅(1−g(z))g'(z) = \frac{1}{1 + e^{-z}} \cdot \frac{e^{-z}}{1 + e^{-z}} = g(z) \cdot (1 - g(z))g(z)=1+ez11+ezez=g(z)(1g(z))

3. 代码实现

import numpy as np
import matplotlib.pyplot as plt

def sigmoid(z):
    return 1 / (1 + np.exp(-z))

def sigmoid_derivative(z):
    return sigmoid(z) * (1 - sigmoid(z))

z = np.linspace(-10, 10, 100)
plt.figure(figsize=(10, 6))
plt.plot(z, sigmoid(z), label="Sigmoid function")
plt.plot(z, sigmoid_derivative(z), label="Sigmoid derivative")
plt.xlabel("z")
plt.ylabel("g(z)")
plt.title("Sigmoid Function and its Derivative")
plt.legend()
plt.grid(True)
plt.show()

在这里插入图片描述

4. 导数性质分析

  1. 最大值:当g(z)=0.5g(z) = 0.5g(z)=0.5时,导数达到最大值0.250.250.25
  2. 对称性:导数在z=0z=0z=0时最大,随着∣z∣|z|z增大而迅速减小
  3. 非负性:导数始终非负,因为0<g(z)<10 < g(z) < 10<g(z)<1

5. 导数形式的重要型

  • 在逻辑回归的梯度下降中,需要计算损失函数对参数的导数。由于损失函数中包含Sigmoid函数,这个导数形式使得计算变得非常简洁:

∂∂θjJ(θ)=1m∑i=1m(hθ(x(i))−y(i))xj(i)\frac{\partial}{\partial \theta_j}J(\theta) = \frac{1}{m}\sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)})x_j^{(i)}θjJ(θ)=m1i=1m(hθ(x(i))y(i))xj(i)

  • 其中hθ(x)=g(θTx)h_\theta(x) = g(\theta^T x)hθ(x)=g(θTx)。如果没有这个简洁的导数形式,梯度计算会复杂得多。

  • 推导损失函数对θj\theta_jθj的偏导数:
    ∂∂θjJ(θ)=−1m∑i=1m(yi1hθ(xi)−(1−yi)11−hθ(xi))∂∂θjhθ(xi)=−1m∑i=1m(yi1g(θTxi)−(1−yi)11−g(θTxi))g(θTxi)(1−g(θTxi))xij=−1m∑i=1m(yi(1−g(θTxi))−(1−yi)g(θTxi))xij=1m∑i=1m(hθ(xi)−yi)xij \begin{align*} \frac{\partial}{\partial \theta_j} J(\theta) &= -\frac{1}{m}\sum_{i=1}^m \left(y_i \frac{1}{h_\theta(x_i)} - (1-y_i)\frac{1}{1-h_\theta(x_i)}\right) \frac{\partial}{\partial \theta_j} h_\theta(x_i) \\ &= -\frac{1}{m}\sum_{i=1}^m \left(y_i \frac{1}{g(\theta^T x_i)} - (1-y_i)\frac{1}{1-g(\theta^T x_i)}\right) g(\theta^T x_i)(1-g(\theta^T x_i)) x_i^j \\ &= -\frac{1}{m}\sum_{i=1}^m \left(y_i(1-g(\theta^T x_i)) - (1-y_i)g(\theta^T x_i)\right) x_i^j \\ &= \frac{1}{m}\sum_{i=1}^m (h_\theta(x_i) - y_i) x_i^j \end{align*} θjJ(θ)=m1i=1m(yihθ(xi)1(1yi)1hθ(xi)1)θjhθ(xi)=m1i=1m(yig(θTxi)1(1yi)1g(θTxi)1)g(θTxi)(1g(θTxi))xij=m1i=1m(yi(1g(θTxi))(1yi)g(θTxi))xij=m1i=1m(hθ(xi)yi)xij
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐