前言
从毕业到现在已经很久没有做过高等数学相关的内容,但是机器学习和神经网络里面有大量的关于导数的推倒公式,所以系统性的对于导数和相关的知识点做一个梳理,以及它的应用做一个说明。
导数的基本概念
$$\frac{\partial f}{\partial l}(x_0, y_0) = \lim_{\Delta l \to 0} \frac{f(x_0 + \Delta x, y_0 + \Delta y) – f(x_0, y_0)}{\Delta l}$$
什么是导数?
导数本质上是当前函数在某一点的线性逼近的变化率,也就是该点处切线的斜率。
导数的作用
在机器学习领域,导数的主要作用是通过计算函数的变化率来找到极值点,这在优化算法中极为重要。
驻点
驻点是导数为0的点,在函数图像上可能是极大值或极小值点。要进一步判断驻点的性质,需要观察导数在该点左右两侧的符号变化。
基本导数公式表
说明 | 公式 | 例子 |
常数的导数 |
\((C)’ = 0\) |
\((3)’ = 0\) |
幂函数的导数 |
\((x^α)’ = αx^{α-1}\) |
\((x^3)’ = 3x^2\) |
指数函数的导数 |
\((a^x)’ = a^x \ln a\) |
\((3^x)’ = 3^x \ln 3\) |
\((e^x)’ = e^x\) |
— |
|
对数函数的导数 |
\((\log_a x)’ = \frac{1}{x \ln a}\) |
\((\log_3 x)’ = \frac{1}{x \ln 3}\) |
\((\ln x)’ = \frac{1}{x}\) |
— |
|
三角函数的导数 |
\((\sin x)’ = \cos x\) |
— |
\((\cot x)’ = -\csc^2 x = -\frac{1}{\sin^2 x}\) |
— |
导数运算法则
说明 | 公式 |
两函数之和求导 |
\((f + g)’ = f’ + g’\) |
两函数之积求导 |
\((fg)’ = f’g + fg’\) |
两函数之商求导 |
\(\left(\frac{f}{g}\right)’ = \frac{f’g – fg’}{g^2}\) |
复合函数的导数 |
若 \(f(x) = h(g(x))\),则 \(f'(x) = h'(g(x)) \cdot g'(x)\) |
二阶导数
概述
二阶导数是对一阶导数继续求导得到的结果。
含义
- 一阶导数:表示某点处切线斜率的大小,即该点的变化率
- 二阶导数:表示变化率的变化率
在物理学中,二阶导数的含义就是加速度。
二阶导数的几何意义
二阶导数可以判断函数的凹凸性:
- 二阶导数恒为正数:函数向上弯曲(凹函数/下凸函数)
- 二阶导数恒为负数:函数向下弯曲(凸函数/上凸函数)
拐点
拐点是二阶导数左右异号的点,在这个点处:
- 函数的变化率从递增变为递减(或相反)
- 二阶导数必定为0
- 但二阶导数为0的点不一定是拐点,需要观察该点附近二阶导数的变化趋势
二阶导数的判别法
利用一阶导数和二阶导数可以判断函数的极值:
- 一阶导数为0,二阶导数大于0:极小值点
- 一阶导数为0,二阶导数小于0:极大值点
- 一阶导数为0,二阶导数等于0:可能是拐点
偏导数
概述
当函数有多个自变量时,如 f(x,y) = xy + x² + y²,我们可以针对其中一个变量求导,这就是偏导数。
计算方法
求偏导数时,将其他变量视为常量:
- 对y求偏导:∂f/∂y = x + 2y(将x视为常量)
- 对x求偏导:∂f/∂x = y + 2x(将y视为常量)
偏导数的数学定义
$$\frac{\partial f}{\partial x_i}(a_1, a_2, …, a_n) = \lim_{\Delta x_i \to 0} \frac{f(a_1, …, a_i + \Delta x_i, …, a_n) – f(a_1, …, a_i, …, a_n)}{\Delta x_i}$$
偏导数与方向导数的关系
偏导数实际上是特殊的方向导数:
- 当方向角α = 0°时,得到x方向的偏导数
- 当方向角β = 0°时,得到y方向的偏导数
方向导数
定义
方向导数不是针对某一个坐标轴方向求导,而是针对任意方向L进行求导,表示二元函数在某点沿着特定方向的变化率。
方向导数的几何意义
- α是方向l与x轴的夹角
- β是方向l与y轴的夹角
- 微小改变量的关系:Δx = Δl·cos α, Δy = Δl·cos β
方向导数的数学定义
$$\frac{\partial f}{\partial l}(x_0, y_0) = \lim_{\Delta l \to 0} \frac{f(x_0 + \Delta x, y_0 + \Delta y) – f(x_0, y_0)}{\Delta l}$$
方向导数的计算公式
$$\frac{\partial f}{\partial l}(x_0, y_0) = f_x(x_0, y_0)\cos α + f_y(x_0, y_0)\cos β$$
全微分公式
方向导数可以通过全微分公式来表示:
$$\frac{\partial f}{\partial l}(x_0, y_0) = f_x(x_0, y_0)\cos α + f_y(x_0, y_0)\cos β = |\nabla f| \cdot |l| \cdot \cos θ$$
其中:
- fx(x₀, y₀)、fy(x₀, y₀) 表示点(x₀, y₀)处f对x、y的偏导数
- cos α、cos β 是方向l的方向余弦
- l方向的单位方向向量可以表示为 l₀ = (cos α, cos β)
- θ是向量∇f和l的夹角
解释θ含义:
θ 的定义:
- θ 是梯度向量 ∇f 与方向向量 l 之间的夹角
- 根据向量点乘的几何意义:∇f · l = |∇f| |l| cos θ
- 由于 l 是单位向量(|l| = 1),所以:∇f · l = |∇f| cos θ
θ 的含义:
- 当 θ = 0° 时,cos θ = 1,方向向量 l 与梯度向量 ∇f 同向
- 此时方向导数 = |∇f| cos θ = |∇f|,达到最大值
- 当 θ = 90° 时,cos θ = 0,方向向量与梯度垂直,方向导数为0
- 当 θ = 180° 时,cos θ = -1,方向向量与梯度反向,方向导数为 -|∇f|,达到最小值
几何直观: θ 描述了我们选择的方向 l 与函数在该点增长最快的方向(梯度方向)之间的偏离程度。偏离得越小(θ 越小),沿该方向的变化率就越大。
这就是为什么说梯度指向函数增长最快的方向——因为只有当方向向量与梯度同向时(θ = 0),方向导数才能达到最大值 |∇f|。
梯度向量 ∇f
物理含义:
- 梯度向量是函数在某点处增长最快的方向
- 它的模长表示在该方向上的最大变化率
数学表示:
- 对于二元函数 f(x,y):∇f = (∂f/∂x, ∂f/∂y)
- 梯度向量是由各个偏导数组成的向量
几何直观:
- 想象一个山坡,梯度向量就是该点处最陡峭上坡的方向
- 梯度向量总是垂直于等高线(等值线)
方向向量 l
物理含义:
- 方向向量是我们人为选择的一个方向
- 它表示我们想要沿着哪个方向去观察函数的变化
数学表示:
- l = (cos α, cos β),其中 α, β 是方向角
- 必须是单位向量,即 |l| = 1
几何直观:
- 就像指南针上的一个方向
- 我们可以任意选择这个方向去”探索”函数的变化
形象比喻:
- 梯度向量 = 水流的方向(客观存在)
- 方向向量 = 我们划船选择的方向(主观选择)
- 方向导数 = 我们选择的方向与水流方向的”配合程度”
当我们选择的方向与梯度方向一致时,就能获得最大的变化率!
推导过程
设梯度向量:∇f = (fx(x), fy(x)),方向向量:l = (cos α, cos β)
通过向量点乘(对应位置相乘再求和): $$\nabla f \cdot l = \frac{\partial f}{\partial l}(x_0, y_0) = f_x(x_0, y_0)\cos α + f_y(x_0, y_0)\cos β$$
任意选取一个方向l,那么在某个点处的变化率就是l方向的方向导数。由于l是单位方向向量,其模长为1,因此:
当cos θ = 1时(即方向一致时),方向导数取得最大值,这个最大值就是梯度的模长。
梯度
定义
对于多元函数 f(x₁, …, xₙ),在点 a = (a₁, a₂, …, aₙ) 处的梯度定义为:
$$\nabla f(a) = \left[\frac{\partial f}{\partial x_1}(a), \frac{\partial f}{\partial x_2}(a), …, \frac{\partial f}{\partial x_n}(a)\right]$$
这个向量称为f在点a处的梯度,记作∇f(a)或grad f(a)。
形象理解:梯度是一个向量场,它描述了多元函数在空间中每一点的变化率和变化方向
梯度的计算示例
对于二元函数 f(x,y) = x² + xy + y²:
- ∂f/∂x = 2x + y,在(1,1)处值为3
- ∂f/∂y = x + 2y,在(1,1)处值为3
- 所以梯度为 ∇f(1,1) = [3, 3]
梯度的重要性质
- 梯度向量指向函数增长最快的方向
- 梯度的模长表示函数在该方向上的最大变化率
- 梯度与方向导数的关系:∂f/∂l = ∇f · e
因此,梯度是多元函数各个偏导数的向量组合。对于二维函数f(x,y),梯度就是x和y在某点处偏导数组成的向量。
工具使用:Python可视化
我们可以利用numpy和matplotlib结合jupyter notebook来画出函数及其导数的图像。
绘制sin(x)函数
import numpy as np
import matplotlib.pyplot as plt
# 定义函数 y = sin(x)
x = np.arange(0, 6, 0.1)
y = np.sin(x)
# 画出函数图像
plt.plot(x, y)
plt.xlabel('x')
plt.ylabel('y')
plt.title('y = sin(x)')
plt.show()
绘制导函数cos(x)
# 导函数 y' = cos(x) y1 = np.cos(x) # 画出函数图像 plt.plot(x, y1) plt.xlabel('x') plt.ylabel("y'") plt.title("y' = cos(x)") plt.show()
函数与导函数的对比
# 将函数和导函数放到一张图中
plt.plot(x, y, label='y = sin(x)')
plt.plot(x, y1, label="y' = cos(x)", linestyle='--')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.title('sin(x) and its derivative')
plt.show()
总结
导数是微积分的核心概念,从一阶导数到二阶导数,从单变量到多变量,从偏导数到方向导数再到梯度,这些概念构成了现代数学分析和机器学习的理论基础。通过Python等工具的可视化,我们可以更直观地理解这些抽象的数学概念。
导数在现代AI中的应用
机器学习中的核心作用
在机器学习中,导数的概念无处不在:
损失函数优化:机器学习的核心是最小化损失函数,而梯度下降算法正是利用梯度(多元函数的导数)来寻找函数的最小值点。算法通过计算损失函数相对于模型参数的梯度,然后沿着梯度的反方向更新参数。
反向传播算法:这是深度学习的基石,本质上是链式法则的应用。通过计算损失函数对每个权重的偏导数,网络可以有效地更新所有参数。
深度学习中的梯度计算
自动微分:现代深度学习框架(如PyTorch、TensorFlow)都内置了自动微分系统,能够自动计算复杂计算图中任意函数的梯度。这使得构建和训练复杂的神经网络成为可能。
梯度消失和梯度爆炸:在深度神经网络中,梯度在反向传播过程中可能会逐渐消失或爆炸,这直接影响了网络的训练效果。理解导数的链式法则有助于设计更好的网络架构和激活函数。
大模型时代的导数应用
Transformer架构:现代大语言模型的核心Transformer架构中,注意力机制的计算涉及大量的矩阵微分和梯度计算。
优化器进化:从简单的SGD到Adam、AdamW等现代优化器,都是基于梯度的一阶和二阶信息来设计的。这些优化器的核心都是如何更好地利用梯度信息来更新参数。
大规模并行训练:在训练GPT、BERT等大模型时,梯度的计算和同步成为了关键的技术挑战。理解梯度的性质有助于设计更高效的分布式训练策略。
实际应用示例
计算机视觉:在CNN中,卷积层的权重更新依赖于误差相对于卷积核的偏导数计算。
自然语言处理:在RNN/LSTM中,序列数据的处理需要计算损失函数相对于各个时间步参数的梯度。
推荐系统:协同过滤和深度推荐模型都需要通过梯度下降来优化用户和物品的嵌入向量。
未来展望
随着AI技术的发展,导数的概念在以下方面将发挥更重要的作用:
- 神经架构搜索(NAS):通过可微分的架构搜索来自动设计神经网络
- 元学习:利用二阶导数信息来快速适应新任务
- 物理信息神经网络:将物理定律的微分方程嵌入到神经网络中
导数不仅是数学分析的基础工具,更是现代人工智能革命的数学基石。掌握导数的概念和计算方法,对于深入理解和应用机器学习、深度学习技术具有重要意义,后续我会持续的更新人工智能学习过程中的高等数学相关的知识补充进来。