系列:《从小白到 AI 大模型开发工程师的进阶之路》 技术点:AI-0216 导数与偏导数 主人公:小蓝伞 前置:AI-0211 标量、向量和张量 本期产出:独立实验脚本、原始输出、失败样本和验收清单
小蓝伞在教学演练中校验指数函数的导数,将步长从千分之一缩到万亿分之一,结果却离解析值更远。本文用可复跑的数据解释这条反直觉曲线。 本期按准备环境、运行完整脚本、读取结果和复验失败的顺序完成实践。偏导固定其他坐标,只观察一个坐标的局部变化;梯度把所有偏导组织成向量;单位方向导数是梯度与单位方向向量的内积。有限差分只是对这些量的数值近似,步长越小并不总是越准。 输入均为教学合成数据,不是生产经历。
一、小蓝伞遇到的问题
导数回答的是在某个点附近,输入的微小变化怎样影响输出。指数函数在一处的解析导数就是该处指数值;这为差分实验提供独立参考。二元函数的偏导还要求固定另一个坐标,否则变化沿着另一条路径发生,算出来的量已经不是原偏导。讨论函数值、导数值和误差时要分开单位:函数值可能是金额,导数可能是金额相对于某个输入单位的变化,不能把它们放进同一列直接比较。
二、先给结论
偏导固定其他坐标,只观察一个坐标的局部变化;梯度把所有偏导组织成向量;单位方向导数是梯度与单位方向向量的内积。有限差分只是对这些量的数值近似,步长越小并不总是越准。
推荐:先用解析可解的函数检查实现,再扫描数个数量级步长;选择误差稳定区间,保留大步长和极小步长作为反例。
不推荐:省略输入语义和指标口径,仅凭单次输出扩大结论。
成功判据:零步长必须抛出ValueError;方向导数接近3.8;中心差分误差曲线应呈现中间较小、两端较大的趋势。
三、任务与数据契约
| 项目 | 本期约定 |
|---|---|
| 输入 | 完整代码构造的合成数据 |
| 输出 | 数值、图表或异常及原始日志 |
| 环境 | Windows 11、Python 3.13.9,依赖见记录 |
| 不在范围 | 真实业务、生产容量和跨设备性能 |
四、前置准备
在新目录保存工作目录中的实验.py为main.py,再执行:
python -m venv .venv .\.venv\Scripts\python.exe -m pip install numpy==2.3.5 .\.venv\Scripts\python.exe main.py
本次实际执行使用 Windows 11、Python 3.13.9;代码只生成合成输入,不依赖账号、令牌或隐藏文件。
五、核心原理
偏导:固定其他输入,对某一个坐标求导。
梯度:标量输出对各输入偏导组成的向量。
单位方向导数:梯度沿单位方向的投影。
截断误差:有限步长近似留下的数学误差。
舍入误差:浮点表示和运算带来的数值误差。
中心差分的两个误差来源
中心差分用左右两个函数值的差除以两倍步长。步长较大时,这条割线不能准确代表该点切线,产生截断误差;步长极小时,两个浮点函数值非常接近,相减消去有效数字,再被小分母放大。两种机制作用相反,所以误差往往先降后升。选择步长需要结合函数尺度和浮点精度,没有一个适用于所有变量的固定常数。
方向必须先单位化
本例二元函数在指定点的梯度为一和四,方向三和四的长度为五,单位方向为零点六和零点八,内积得到三点八。如果直接乘未归一化向量,就得到按更大步幅缩放的变化量。方向导数的常用定义比较单位移动,因此必须说明方向是否单位化;梯度方向给出局部上升最快的方向,不意味着沿它走任意距离都能保持上升。
把差分用作梯度检查
数值差分适合对小函数、少量参数和实现改动做独立校验。先固定参数状态,逐坐标扰动,保持随机分支和数据不变;再比较解析梯度与数值近似。相对误差分母不能在接近零时失效,应同时查看绝对误差。遇到不可微点,不同单侧差分可能不同,需要回到函数定义;不能用放宽容差掩盖真正的分支错误。
六、完整项目
完整脚本位于_work/第62期-导数与偏导数/实验.py。它包含正常、边界和失败断言;复制到main.py后可独立运行。
import numpy as np def f(x): """用非线性函数展示截断误差与相减消去。""" return np.exp(x) def central(x, h): """计算中心差分;零步长明确拒绝。""" if h <= 0: raise ValueError("步长必须为正") return (f(x+h)-f(x-h))/(2*h) for h in (1e-1,1e-3,1e-5,1e-8,1e-12,1e-15): value=central(1.,h) print(f"h={h:.0e} derivative={value:.10f} abs_error={abs(value-np.e):.3e}") gradient=np.array([1.,4.]) direction=np.array([3.,4.])/5 print("gradient",gradient.tolist(),"unit_direction",direction.tolist(),"directional",float(gradient@direction)) assert np.isclose(gradient@direction,3.8) try: central(1.,0.) except ValueError as exc: print("拒绝零步长",exc) 实现与结果的进一步核验
逐步重建这次误差曲线
第一步固定被求导函数和求值点,不混入随机噪声或外部文件;第二步把解析值单独计算,不从差分结果推参考;第三步遍历步长数量级,每一行同时保留近似值和绝对误差;第四步比较误差趋势。指数函数没有小数步长处的分支变化,因此这次曲线主要展示数值近似误差。若换成有截断或阈值的目标,左右采样可能落到不同分支,解释必须同时改变。
偏导的完整手算
对输入一平方、三倍两输入乘积和输入二平方求导,第一偏导是两倍输入一加三倍输入二,第二偏导是三倍输入一加两倍输入二。在二和负一处得到一和四。把第二输入也随第一输入改变,算出的不再是固定其他坐标的偏导,而是沿某条参数化路径的导数;这正是下一期链式法则要处理的依赖关系。
坐标尺度改变步长意义
相同步长对金额一百万和比例零点零一不是相同扰动程度。实际梯度校验可用基于坐标规模的步长策略,并报告绝对和相对变化。对于接近零梯度,单独相对误差会因分母很小而夸大差异;先检查绝对误差,再判定是否需要更合适的步长或精度。不要把本例十万分之一当成所有参数的最佳设置。
数值校验的成本与适用性
每个中心差分坐标要两次前向,高维参数数量巨大时全量检查昂贵。可以先用小模型和少量固定坐标,再抽取方向检查;抽样没有覆盖全部参数,报告必须写明范围。随机层或数据增强应固定状态,否则函数本身在两次前向不同,差分混入随机变化。这个限制比无条件加大容差更值得优先排查。
如何解释梯度方向
梯度与单位方向的内积决定一阶局部变化。单位方向垂直梯度时内积为零,不代表沿该方向有限移动后函数值永远不变;二阶及更高阶项仍可能存在。梯度为零也不直接说明最小值,后续优化会用极大值和鞍点补充这一边界。读者可以用这个区别避免将局部线性化推广到任意大步长。
七、可复现失败案例
零步长被明确拒绝;极小正步长虽可运行,但误差变大,属于结果质量失败。 这是构造的教学失败,不是线上事故。复现顺序是保存输入、运行脚本、记录输出、只改一个条件后重跑。修复后必须同时检查正常样本,不能用默认值掩盖错误。
八、实验设计与实际结果
零步长必须抛出ValueError;方向导数接近3.8;中心差分误差曲线应呈现中间较小、两端较大的趋势。 本次已经执行,退出状态为0;完整输出见工作目录。控制变量、样本量和参数写在脚本中。
h=1e-01 derivative=2.7228145639 abs_error=4.533e-03 h=1e-03 derivative=2.7182822815 abs_error=4.530e-07 h=1e-05 derivative=2.7182818285 abs_error=5.859e-11 h=1e-08 derivative=2.7182818219 abs_error=6.603e-09 h=1e-12 derivative=2.7184920981 abs_error=2.103e-04 h=1e-15 derivative=2.8865798640 abs_error=1.683e-01 gradient [1.0, 4.0] unit_direction [0.6, 0.8] directional 3.8000000000000003 拒绝零步长 步长必须为正
数字怎样对应本期机制
固定指数函数、输入一点、双精度和同一个解释器,步长十分之一时误差约零点零零四五三三;十万分之一降到约五点八六乘十的负十一次方;一千万亿分之一又升到约零点一六八三。只展示中间最好的一行会隐藏失效范围。读者应先比较同一实验中不同步长的趋势,再检查绝对误差是否符合自己的验收预算,而不是记住这个机器的最佳步长。
九、常见问题与排查顺序
先检查对象定义,再检查输入、形状、分母、索引或时间点,最后检查实现与环境。本次只跑双精度光滑函数和两个方向量,不覆盖低精度、噪声目标、边界截断和高维训练。有限差分每次需要额外前向,参数多时成本随坐标数量增长。自动微分能改变计算方式,但仍要求计算图和目标定义正确。下一期链式法则会建立局部导数的组合规则,本期保存的差分方法则成为独立检查工具。 不要把一次成功当成稳定性证明,也不要把技术指标直接换成业务价值。
十、系统与依赖差异
本次只在记录的 Windows 和库版本运行。浮点末位、计时、字体、编码和表格默认行为可能跨环境变化;未执行部分保持待核验。
十一、验证清单
执行脚本,核对退出状态与本篇实际输出。
重跑本篇正常、边界和失败样本,检查数值或拒绝结果。
更换数据时重新检查对象、分母和评价条件。
验收判据:零步长必须抛出ValueError;方向导数接近3.8;中心差分误差曲线应呈现中间较小、两端较大的趋势。
十二、面试题与追问
偏导在本期是什么?
答:固定其他输入,对某一个坐标求导。 导数回答的是在某个点附近,输入的微小变化怎样影响输出。指数函数在一处的解析导数就是该处指数值;这为差分实验提供独立参考。二元函数的偏导还要求固定另一个坐标,否则变化沿着另一条路径发生,算出来的量已经不是原偏导。讨论函数值、导数值和误差时要分开单位:函数值可能是金额,导数可能是金额相对于某个输入单位的变化,不能把它们放进同一列直接比较。
追问:改变这个条件后,哪一个输出或失败判据应该变化?
梯度在本期是什么?
答:标量输出对各输入偏导组成的向量。 中心差分用左右两个函数值的差除以两倍步长。步长较大时,这条割线不能准确代表该点切线,产生截断误差;步长极小时,两个浮点函数值非常接近,相减消去有效数字,再被小分母放大。两种机制作用相反,所以误差往往先降后升。选择步长需要结合函数尺度和浮点精度,没有一个适用于所有变量的固定常数。
追问:改变这个条件后,哪一个输出或失败判据应该变化?
单位方向导数在本期是什么?
答:梯度沿单位方向的投影。 固定指数函数、输入一点、双精度和同一个解释器,步长十分之一时误差约零点零零四五三三;十万分之一降到约五点八六乘十的负十一次方;一千万亿分之一又升到约零点一六八三。只展示中间最好的一行会隐藏失效范围。读者应先比较同一实验中不同步长的趋势,再检查绝对误差是否符合自己的验收预算,而不是记住这个机器的最佳步长。
追问:改变这个条件后,哪一个输出或失败判据应该变化?
截断误差在本期是什么?
答:有限步长近似留下的数学误差。 本例二元函数在指定点的梯度为一和四,方向三和四的长度为五,单位方向为零点六和零点八,内积得到三点八。如果直接乘未归一化向量,就得到按更大步幅缩放的变化量。方向导数的常用定义比较单位移动,因此必须说明方向是否单位化;梯度方向给出局部上升最快的方向,不意味着沿它走任意距离都能保持上升。
追问:改变这个条件后,哪一个输出或失败判据应该变化?
舍入误差在本期是什么?
答:浮点表示和运算带来的数值误差。 数值差分适合对小函数、少量参数和实现改动做独立校验。先固定参数状态,逐坐标扰动,保持随机分支和数据不变;再比较解析梯度与数值近似。相对误差分母不能在接近零时失效,应同时查看绝对误差。遇到不可微点,不同单侧差分可能不同,需要回到函数定义;不能用放宽容差掩盖真正的分支错误。
追问:改变这个条件后,哪一个输出或失败判据应该变化?
十三、工程判断与下一期
先用解析可解的函数检查实现,再扫描数个数量级步长;选择误差稳定区间,保留大步长和极小步长作为反例。 下一期为AI-0217 链式法则。本期保留的契约和反例会继续使用。
从本地证据到实际决策
用有限差分校验多变量目标的步骤
先把目标封装成纯函数,输入同一向量时返回同一标量。复制输入分别加减步长,不在原始参数上直接写入;逐坐标检查后,再选择一个固定单位方向验证梯度内积。每次记录坐标编号、步长、解析值、数值值和绝对差,若只汇总最大误差,应保留它对应哪个坐标。错误定位需要这个索引,而不是只留一个通过布尔值。
为什么函数状态会破坏差分
如果前向包含随机抽样、缓存写入或自动更新参数,左右扰动可能已经不是同一个函数。先冻结随机状态和参数,或把这些机制从最小样本中移除。若目标来自模拟且本身带噪声,需要讨论差分估计方差和重复平均,不能套本篇确定性指数函数的容差。代码可运行不证明对照实验条件稳定。
错误输入与低质量结果两种处理
零步长会除零,函数主动拒绝;极小正步长没有违反正值范围,却可能产生不可接受误差。后者需要结果质量阈值而不是简单类型校验。实际接口可分别输出参数错误、数值不稳定和正常估计,让调用方选择调整步长或切换方法。不要把三种情况都返回零,否则真实零导数与失败无从区分。
梯度的坐标依赖
改变输入单位会改变梯度数值,因为导数包含单位比值。两个字段梯度大小不同不自动代表业务重要性,也不能不经缩放就比较所谓敏感度。若对输入标准化,应说明梯度是对原坐标还是变换坐标计算,必要时用链式法则转换。这个问题与前期矩阵尺度一脉相承,解释数字首先要解释坐标。
读者可以追加的独立实验
把指数换为平方函数,中心差分在理想代数中能消去部分截断项,所以误差曲线会不同;把求值点移动,函数尺度也变化。建议同时保留原指数样本,确认实现没有退化,再研究新函数。本文没有为这些扩展提供伪造输出,读者应将实际结果记录为自己的新实验。
官方资料
Calculus III - Directional Derivatives:用于核对本期技术机制或接口,查阅日期为2026-10-13。
适用边界
只覆盖脚本中的合成数据、明确假设和已记录版本。真实业务需追加授权、监控、资源预算、回滚和领域验证。