Day8 神经网络中的导数基础
导数的定义
导数(Derivative)是微积分中的一个核心概念,用于描述函数在某一点的变化率。简单来说,导数就是函数值随自变量微小变化而产生的变化量,即斜率或变化率。假设有一个函数 f ( x ) f(x) f(x),其中 x x x 是自变量, y = f ( x ) y = f(x) y=f(x) 是因变量。函数 f ( x ) f(x) f(x) 在某一点 x 0 x_0 x0 处的导数表示为 f ′ ( x 0 ) f'(x_0) f′(x0),也可以写作 d y d x \frac{dy}{dx} dxdy 或 d f d x \frac{df}{dx} dxdf。导数的定义是:
f ′ ( x 0 ) = lim h → 0 f ( x 0 + h ) − f ( x 0 ) h f'(x_0) = \lim_{{h \to 0}} \frac{f(x_0 + h) - f(x_0)}{h} f′(x0)=h→0limhf(x0+h)−f(x0)
其中, h h h 表示自变量 x x x 的一个微小变化量,也经常用 Δ x \Delta x Δx标识。
注:希腊字母 ∆ 读作 delta,对应拉丁字母 D。此外,带有 '(prime)符号的函数或变量表示导函数。
神经网络中用到的导数公式
在神经网络中,导数主要用于计算损失函数对各个参数的梯度,从而进行反向传播和参数更新。以下是一些常用的导数公式:
- 常数函数的导数: c ′ = 0 c' = 0 c′=0( c c c 为常数)
- 幂函数的导数: ( x a ) ′ = a x a − 1 (x^a)' = ax^{a-1} (xa)′=axa−1( a a a 为常数且 a ≠ 0 a \neq 0 a=0), a = 1 时有 ( x ) ′ = 1 a=1时有(x)'=1 a=1时有(x)′=1
- 指数函数的导数: ( e x ) ′ = e x (e^x)' = e^x (ex)′=ex , ( e − x ) ′ = − e − x (e^{-x})' = -e^{-x} (e−x)′=−e−x
- 对数函数的导数: ( ln x ) ′ = 1 x (\ln x)' = \frac{1}{x} (lnx)′=x1( x > 0 x > 0 x>0)
- 三角函数的导数: ( sin x ) ′ = cos x (\sin x)' = \cos x (sinx)′=cosx, ( cos x ) ′ = − sin x (\cos x)' = -\sin x (cosx)′=−sinx
这些公式在神经网络中计算各层参数的梯度时非常有用。
导数符号
在神经网络中,我们经常使用以下符号来表示导数:
- d L d x \frac{dL}{dx} dxdL:表示损失函数 L L L 对变量 x x x 的导数(在单变量情况下)。
- c ′ = 0 c' = 0 c′=0( c c c 为常数),也可以记为 d c d x = 0 \frac{dc}{dx}=0 dxdc=0
- ( x ) ′ = 1 (x)'=1 (x)′=1 ,也可以记为 d x d x = 1 \frac{dx}{dx}=1 dxdx=1
- ∂ L ∂ w \frac{\partial L}{\partial w} ∂w∂L:表示损失函数 L L L 对权重 w w w 的偏导数。(后续Day深入解释)
- ∇ L \nabla L ∇L:表示损失函数 L L L 关于所有参数的梯度向量。(后续Day深入解释)
导数的性质
导数具有一些重要的性质,这些性质在神经网络的梯度计算中非常有用:
- 线性性质:如果 f ′ ( x ) f'(x) f′(x) 和 g ′ ( x ) g'(x) g′(x) 都存在,那么 ( a f ( x ) + b g ( x ) ) ′ = a f ′ ( x ) + b g ′ ( x ) (af(x) + bg(x))' = af'(x) + bg'(x) (af(x)+bg(x))′=af′(x)+bg′(x)。
- 链式法则:如果 u = g ( x ) u = g(x) u=g(x) 且 g ′ ( x ) g'(x) g′(x) 存在,那么 ( f ( u ) ) ′ = f ′ ( u ) g ′ ( x ) (f(u))' = f'(u)g'(x) (f(u))′=f′(u)g′(x)。这个法则在多层神经网络中计算梯度时至关重要。
证明 ( e − x ) ′ = − e − x (e^{-x})' = -e^{-x} (e−x)′=−e−x
利用后Day的链式法则(复合函数的求导公式),我们可以简单地推导出标题中的公式,如下所示。
y = e u , u = − x , y ′ = d y d x = d y d u d u d x = e u ⋅ ( − 1 ) = − e − x y = e^{u}, \quad u = -x, \quad y' = \frac{dy}{dx} = \frac{dy}{du} \frac{du}{dx} = e^{u} \cdot (-1) = -e^{-x} y=eu,u=−x,y′=dxdy=dudydxdu=eu⋅(−1)=−e−x
分数函数的导数
分数函数(或称为有理函数)在数学中通常指形式为 U V \frac{U}{V} VU 的函数,其中 U U U 和 V V V 都是关于自变量(如 x x x)的函数。分数函数的导数公式为:
( U V ) ′ = U ′ V − U V ′ V 2 \left(\frac{U}{V}\right)' = \frac{U'V - UV'}{V^2} (VU)′=V2U′V−UV′
这个公式在神经网络中处理复杂函数时非常有用。例如,当损失函数中包含分数形式时,我们可以使用这个公式来计算其导数。
Sigmoid 函数的导数
Sigmoid 函数是神经网络中常用的激活函数之一,其定义为:
σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+e−x1
Sigmoid 函数的导数有一个非常简洁的形式:
σ ′ ( x ) = σ ( x ) ( 1 − σ ( x ) ) \sigma'(x) = \sigma(x)(1 - \sigma(x)) σ′(x)=σ(x)(1−σ(x))
这个导数公式在神经网络的反向传播过程中非常重要,因为它用于计算激活函数的梯度。
为了从分数函数的导数公式推导出Sigmoid函数的导数公式,可以按照以下步骤进行:
定义Sigmoid函数: Sigmoid函数定义为: σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+e−x1 这可以看作是一个分数函数,其中 U = 1 U = 1 U=1 且 V = 1 + e − x V = 1 + e^{-x} V=1+e−x。
应用分数函数的导数公式:分数函数的导数公式为: ( U V ) ′ = U ′ V − U V ′ V 2 \left(\frac{U}{V}\right)' = \frac{U'V - UV'}{V^2} (VU)′=V2U′V−UV′ 将 U U U 和 V V V 的定义代入此公式,得到:
σ ′ ( x ) = U ′ ( 1 + e − x ) − 1 ⋅ V ′ ( 1 + e − x ) 2 \sigma'(x) = \frac{U'(1 + e^{-x}) - 1 \cdot V'}{(1 + e^{-x})^2} σ′(x)=(1+e−x)2U′(1+e−x)−1⋅V′ 其中 U ′ = 0 U' = 0 U′=0(因为 U = 1 U = 1 U=1 是常数),而 V ′ = − e − x V' = -e^{-x} V′=−e−x(因为 V = 1 + e − x V = 1 + e^{-x} V=1+e−x)。
简化表达式: 代入 U ′ U' U′ 和 V ′ V' V′ 的值,我们得到: σ ′ ( x ) = 0 ⋅ ( 1 + e − x ) − 1 ⋅ ( − e − x ) ( 1 + e − x ) 2 \sigma'(x) = \frac{0 \cdot (1 + e^{-x}) - 1 \cdot (-e^{-x})}{(1 + e^{-x})^2} σ′(x)=(1+e−x)20⋅(1+e−x)−1⋅(−e−x) = e − x ( 1 + e − x ) 2 = \frac{e^{-x}}{(1 + e^{-x})^2} =(1+e−x)2e−x
进一步化简: 注意到 σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+e−x1,我们可以将上面的表达式重写为:
σ ′ ( x ) = e − x ( 1 + e − x ) ⋅ 1 ( 1 + e − x ) \sigma'(x) = \frac{e^{-x}}{(1 + e^{-x})} \cdot \frac{1}{(1 + e^{-x})} σ′(x)=(1+e−x)e−x⋅(1+e−x)1 = σ ( x ) ⋅ ( 1 − σ ( x ) ) = \sigma(x) \cdot (1 - \sigma(x)) =σ(x)⋅(1−σ(x)) 这里我们用到了 σ ( x ) \sigma(x) σ(x) 的定义,并且利用了 1 − σ ( x ) = e − x 1 + e − x 1 - \sigma(x) = \frac{e^{-x}}{1 + e^{-x}} 1−σ(x)=1+e−xe−x 这一事实。
因此,我们成功地从分数函数的导数公式推导出了Sigmoid函数的导数公式: σ ′ ( x ) = σ ( x ) ( 1 − σ ( x ) ) \sigma'(x) = \sigma(x)(1 - \sigma(x)) σ′(x)=σ(x)(1−σ(x))
最小值的条件
一、基本概念
函数的最小值:
- 如果对于函数 f ( x ) f(x) f(x)的定义域内的所有 x x x,都有 f ( x ) ≥ f ( a ) f(x) \geq f(a) f(x)≥f(a),则称 f ( a ) f(a) f(a)是函数 f ( x ) f(x) f(x)的最小值。
导数与函数单调性:
- 导数 f ′ ( x ) f'(x) f′(x)反映了函数 f ( x ) f(x) f(x)在某一点的切线斜率,也反映了函数在该点附近的增减性。
- 当 f ′ ( x ) > 0 f'(x) > 0 f′(x)>0时,函数在该区间内单调递增;当 f ′ ( x ) < 0 f'(x) < 0 f′(x)<0时,函数在该区间内单调递减。
二、最小值的一阶必要条件
- 费马小定理(Fermat’s Theorem):
- 如果函数 f ( x ) f(x) f(x)在点 x = a x = a x=a处取得局部最小值,且 f ( x ) f(x) f(x)在 a a a点可导,则必有 f ′ ( a ) = 0 f'(a) = 0 f′(a)=0。
- 这意味着,在最小值点处,函数的切线斜率为零,即函数在该点处“平缓”。
三、最小值的二阶充分条件
二阶导数的作用:
- 为了进一步确定一个临界点(即一阶导数为零的点)是最大值、最小值还是拐点,我们需要考察二阶导数。
二阶充分条件:
- 假设函数 f ( x ) f(x) f(x)在点 x = a x = a x=a处有一阶导数 f ′ ( a ) = 0 f'(a) = 0 f′(a)=0,且二阶导数 f ′ ′ ( a ) f''(a) f′′(a)存在。
- 如果 f ′ ′ ( a ) > 0 f''(a) > 0 f′′(a)>0,则函数在 x = a x = a x=a处取得局部最小值。
- 如果 f ′ ′ ( a ) < 0 f''(a) < 0 f′′(a)<0,则函数在 x = a x = a x=a处取得局部最大值。
- 如果 f ′ ′ ( a ) = 0 f''(a) = 0 f′′(a)=0,则无法直接通过二阶导数判断该点的性质,可能需要进一步的分析(如考察更高阶的导数或利用其他方法)。
四、全局最小值与局部最小值
局部最小值:
- 只在函数定义域的某个小区间内是最小的值。
全局最小值:
- 在函数整个定义域内都是最小的值。
- 要找到全局最小值,通常需要考察函数的所有局部最小值,并比较它们的大小。
五、实例分析
考虑函数 f ( x ) = x 2 + 4 x + 4 f(x) = x^2 + 4x + 4 f(x)=x2+4x+4。
求一阶导数:
- f ′ ( x ) = 2 x + 4 f'(x) = 2x + 4 f′(x)=2x+4。
找临界点:
- 令 f ′ ( x ) = 0 f'(x) = 0 f′(x)=0,解得 x = − 2 x = -2 x=−2。
判断最小值:
- 计算二阶导数: f ′ ′ ( x ) = 2 f''(x) = 2 f′′(x)=2。
- 因为 f ′ ′ ( − 2 ) = 2 > 0 f''(-2) = 2 > 0 f′′(−2)=2>0,所以函数在 x = − 2 x = -2 x=−2处取得局部最小值。
- 由于该函数是一个开口向上的抛物线,且在整个实数域内只有一个临界点,因此这个局部最小值也是全局最小值。