Skip to content

程序员数学 09:导数、积分与参数优化 ​

微积分适合描述连续变化。在程序中,文件数、线程数和批量大小通常是整数,但连续模型仍能帮助我们找到候选范围;最终还需要检查约束和真实成本。

导数是局部变化率 ​

对函数 f(x),导数描述输入发生很小变化时输出的变化率:

f′(x)=limh→0f(x+h)−f(x)h.

若 f(x)=x2,展开得到差商 2x+h,让 h 趋于 0 得到 f′(x)=2x。在 x=3 附近,输入增加 0.01,输出约增加 6×0.01=0.06;精确增量为 0.0601,近似忽略了二阶小量。

导数是局部描述,不能把局部线性近似不加检查地用于很大的变化。

用一个成本模型找批量大小 ​

假设每个任务的平均成本模型为:

C(b)=400b+b,b>0.

第一项表示固定开销被批量摊薄,第二项表示批量增大带来的额外成本。系数是教学设定,单位已统一,不是某个框架的经验定律。

求导得 C′(b)=−400/b2+1,令导数为零得到 b=20。再看 C″(b)=800/b3>0,说明函数在正区间严格凸,驻点是唯一最小点。此时 C(20)=40。

如果内存约束要求 b≤12,20 就不可用。在 (0,12] 上导数为负,成本随批量增大而下降,约束下的最优点是 12。真实批量还应为整数,并通过实验验证模型是否接近真实运行。

梯度下降是一种迭代 ​

以损失 L(x)=(x−3)2 为例,导数是 2(x−3)。沿负导数方向更新:

xt+1=xt−η2(xt−3).

取 x0=0,步长 η=0.1,得到 x1=0.6、x2=1.08,逐渐向 3 靠近。

js
let x = 0;
const learningRate = 0.1;
for (let step = 0; step < 2; step++) {
  x -= learningRate * 2 * (x - 3);
}
console.log(x); // 1.08

令误差 et=xt−3,有 et+1=(1−2η)et。这个特定二次函数在 0<η<1 时误差收缩;η=1 时通常来回震荡,超过 1 则可能发散。这个范围不是所有损失函数通用的学习率规则。

多变量时,把导数换成各偏导数组成的梯度。非凸问题中找到梯度接近零的位置,也不保证得到全局最优点。

积分把速率累加为总量 ​

若理想化处理速率为 r(t)=2t 个/秒,t 以秒计,从 0 到 3 秒的累计处理量是:

∫032tdt=[t2]03=9.

实际程序常按时间片求和近似积分。采样间隔、漏采和单位都会影响结果;速率乘以时间才是数量,不能直接把每秒速率相加当作任务总数。

练习 ​

  1. 上述批量模型若约束为整数 1≤b≤8,最优值在哪里?
  2. 梯度下降例子中,步长改为 1,从 0 开始的前两次更新是什么?
  3. 固定速率 5 个/秒持续 4 秒,累计量是多少?
查看答案与讲解
  1. b=8。这个区间上导数为负,选择允许的最大值;模型成本为 400/8+8=58。
  2. 0→6→0,并未收敛。只看第一步“跨过了最优点”不能判断接下来会变好。
  3. 5×4=20 个。若速率仅是区间内某一瞬间的采样,不能直接假设全程恒定。

资料与延伸 ​

MIT 18.01SC 单变量微积分 包含导数、优化与积分材料。多变量优化还需结合线性代数、偏导和数值稳定性继续学习。

继续阅读