QiuQiu

练习 · 微积分

一阶 Taylor 展开

f(θ+td)=f(θ)+t gᵀd+o(t) 这一行里每个记号的含义、怎么算、哪一步是近似哪一步是恒等式。

13 题

一行公式

f(θ+td)=f(θ)+tgd+o(t),g=f(θ)f(\theta+td)=f(\theta)+t\,g^{\top}d+o(t),\qquad g=\nabla f(\theta)

θ\theta 是当前点,dd 是方向,t>0t>0 是步长。gdg^{\top}dffθ\theta 沿 dd 的方向导数。o(t)o(t) 是余项的缩写。严格说:令 r(t)=f(θ+td)f(θ)tgdr(t)=f(\theta+td)-f(\theta)-t\,g^{\top}d,则断言 limt0r(t)/t=0\lim_{t\to0}r(t)/t=0

导数在哪:上面那行把导数藏进了 gg。写全是一条链。先是可微的定义,导数 Df(θ)Df(\theta) 作用在位移 tdtd 上:

f(θ+td)=f(θ)+Df(θ)[td]+o(t)f(\theta+td)=f(\theta)+Df(\theta)[td]+o(t)

然后把 Df(θ)[td]Df(\theta)[td] 一步步改写成 tgdt\,g^{\top}d:

Df(θ)[td]  =线性  tDf(θ)[d]  =Riesz  tg,d  =记法  tgdDf(\theta)[td]\;\overset{\text{线性}}{=}\;t\,Df(\theta)[d]\;\overset{\text{Riesz}}{=}\;t\,\langle g,d\rangle\;\overset{\text{记法}}{=}\;t\,g^{\top}d

第一行是近似(余项 o(t)o(t)),第二行三个等号都是恒等式。导数一律写 Df(θ)Df(\theta),Lean 片段里按 Mathlib 习惯叫 f';字母 L\mathcal L 只用于损失函数,不用来表示导数。

先给每个记号一个类型(Mathlib 写法,Rn\mathbb R^nEuclideanSpace ℝ (Fin n),它是带 2-范数的 Fin n → ℝ):

记号 类型 说明
θ\theta, dd EuclideanSpace ℝ (Fin n) 点和方向是同一种东西,都是 Rn\mathbb R^n 里的向量
tt 标量
θ+td\theta+td EuclideanSpace ℝ (Fin n) Lean 写 θ + t • d, 是标量乘向量
ff EuclideanSpace ℝ (Fin n) → ℝ 输入向量,输出一个数
φ\varphi ℝ → ℝ fun t => f (θ + t • d),一元函数
φ(0)\varphi'(0) 一元导数,撇号记法:φ(0)=limt0φ(t)φ(0)t\varphi'(0)=\lim_{t\to0}\frac{\varphi(t)-\varphi(0)}{t}deriv φ 0,命题形式 HasDerivAt φ φ' 0
Df(θ)Df(\theta) EuclideanSpace ℝ (Fin n) →L[ℝ] ℝ 连续线性映射。fderiv ℝ f θ,Mathlib 引理里常叫 f'。输入方向,输出一阶变化量
Df(θ)[d]Df(\theta)[d] 导数作用在方向上,一个数
g=f(θ)g=\nabla f(\theta) EuclideanSpace ℝ (Fin n) gradient f θ,和 θ\thetadd 同类型
gdg^{\top}d inner ℝ g d,写 ⟪g, d⟫inner_gradient_left 说它等于 fderiv ℝ f θ d
fθi(θ)\dfrac{\partial f}{\partial\theta_i}(\theta) Df(θ)Df(\theta) 作用在第 ii 个基向量上:fderiv ℝ f θ (EuclideanSpace.single i 1)
rr ℝ → ℝ 余项函数 r(t)=φ(t)φ(0)φ(0)tr(t)=\varphi(t)-\varphi(0)-\varphi'(0)\,t
o(t)o(t) 不是一个值,是一个命题 r =o[𝓝 0] (fun t => t),即 Asymptotics.IsLittleO。展开是 ε>0, δ>0, 0<t<δr(t)εt\forall\varepsilon>0,\ \exists\delta>0,\ 0<\lvert t\rvert<\delta\Rightarrow\lvert r(t)\rvert\le\varepsilon\lvert t\rvert

注意最后一行。课本里 o(t)o(t) 像一个数,可以加到等式右边;在 Lean 里它是关于余项函数 r(t)=φ(t)φ(0)φ(0)tr(t)=\varphi(t)-\varphi(0)-\varphi'(0)t 的断言:r=o(t)r=o(t)。所以“f(θ+td)=f(θ)+tgd+o(t)f(\theta+td)=f(\theta)+t\,g^{\top}d+o(t)“的严格写法是两句话:定义 rr,然后断言 r =o[𝓝 0] id

矩阵版对应的类型:

记号 类型 说明
WW, ΔW\Delta W, GG Matrix (Fin n) (Fin m) ℝ 三个同类型,和 θ\thetaddgg 同类型是一个道理
L\mathcal L Matrix (Fin n) (Fin m) ℝ → ℝ 损失函数本身,普通函数,和 ff 同一层,不要求线性
DL(W)D\mathcal L(W) Matrix (Fin n) (Fin m) ℝ →L[ℝ] ℝ 导数,和 Df(θ)Df(\theta) 同一层,连续线性。fderiv ℝ 𝓛 W
DL(W)[H]D\mathcal L(W)[H] 导数作用在更新方向 HH 上,等于 G,HF\langle G,H\rangle_F
Tr(GΔW)\operatorname{Tr}(G^{\top}\Delta W) Matrix.trace (Gᵀ * ΔW),GΔWG^{\top}\Delta Wm×mm\times m 方阵
G,ΔWF\langle G,\Delta W\rangle_F ∑ i, ∑ j, G i j * ΔW i j
ΔWF|\Delta W|_F Matrix.frobenius_norm_def。Mathlib 里矩阵默认范数不是 Frobenius,要显式选这个实例

它从哪来:三步。

第一步,把多元函数压成一元。固定 θ\thetadd,定义

φ(t)=f(θ+td),φ:RR\varphi(t)=f(\theta+td),\qquad \varphi:\mathbb R\to\mathbb R

第二步,φ\varphi 只有一个变量,所以有普通的一元导数(撇号记法)。在 t=0t=0 处:

φ(0)=limt0φ(t)φ(0)t\varphi'(0)=\lim_{t\to0}\frac{\varphi(t)-\varphi(0)}{t}

含义是从 θ\theta 出发沿 dd 刚起步时 ff 的变化率。

第三步,对一元函数 φ\varphi 做一阶 Taylor 展开,这是整段的关键一行:

  φ(t)=φ(0)+φ(0)t+o(t)  \boxed{\;\varphi(t)=\varphi(0)+\varphi'(0)\,t+o(t)\;}

φ(t)=f(θ+td)\varphi(t)=f(\theta+td)φ(0)=f(θ)\varphi(0)=f(\theta) 代回去,和开头那行逐项对照,就能看出 φ(0)\varphi'(0) 应该等于什么。它怎么用链式法则算出来、为什么会出现 \partial\sum,留给第 3、4、5 题自己推。

两步要分开:“可微给出一阶项 Df(θ)[td]Df(\theta)[td] 加余项”是近似;“把线性映射 Df(θ)Df(\theta) 写成 gdg^{\top}d“是精确恒等式(Riesz 表示)。Mathlib 里前者是 HasFDerivAt 的定义,后者是 gradient 的定义。

矩阵版:参数是矩阵 WW 时,同一行公式写成 L(W+ΔW)=L(W)+Tr(GΔW)+o(ΔWF)\mathcal L(W+\Delta W)=\mathcal L(W)+\operatorname{Tr}(G^{\top}\Delta W)+o(\|\Delta W\|_F),其中 Tr(GΔW)=G,ΔWF=i,jGijΔWij\operatorname{Tr}(G^{\top}\Delta W)=\langle G,\Delta W\rangle_F=\sum_{i,j}G_{ij}\Delta W_{ij}

相关阅读:Calculus - Descent Direction

题目

1. o(t)o(t) 的含义

展开式里的 o(t)o(t) 是什么意思?

  1. 一类函数的记号:余项 r(t)r(t) 满足 limt0r(t)/t=0\lim_{t\to0}r(t)/t=0,等价地 ε>0δ>0\forall\varepsilon>0\,\exists\delta>0,0<t<δr(t)εt0<\lvert t\rvert<\delta\Rightarrow\lvert r(t)\rvert\le\varepsilon\lvert t\rvert
  2. 一个绝对值小于 tt 的常数
  3. 二阶项 12t2dHd\tfrac12 t^{2}d^{\top}Hd 本身
  4. 数值计算里的舍入误差
解析

o(t)o(t) 不是一个具体的量,是一类函数的记号:所有满足 limt0r(t)/t=0\lim_{t\to0}r(t)/t=0rr。三层写法从松到紧:r(t)=o(t)r(t)=o(t);limt0r(t)/t=0\lim_{t\to0}r(t)/t=0;ε>0δ>0t, 0<t<δr(t)εt\forall\varepsilon>0\,\exists\delta>0\,\forall t,\ 0<\lvert t\rvert<\delta\Rightarrow\lvert r(t)\rvert\le\varepsilon\lvert t\rvert。Mathlib 取第三种当定义(isLittleO_iff),因为它不用除法,在 tt 是向量时也成立;第二种是定理 isLittleO_iff_tendsto,要求分母为 0 时分子也为 0。二阶项 12t2dHd\tfrac12t^{2}d^{\top}Hd 确实属于 o(t)o(t),但 o(t)o(t) 不等于它,余项可能还有三阶、四阶,也可能根本没有二阶展开(只要求一阶可微)。

2. 谁是自变量

定义 φ(t)=f(θ+td)\varphi(t)=f(\theta+td)φ\varphi 的自变量是谁?

  1. tt
  2. θ\theta
  3. dd
  4. θ+td\theta+td
解析

θ\thetadd 在定义 φ\varphi 时就固定了,只有 tt 在变。这就是“把多元函数压成一元”的意思:沿一条直线走,位置只由一个数 tt 决定。所以 φ\varphi' 只能是对 tt 求导。

2b. Df(θ)Df(\theta) 的类型

Df(θ)Df(\theta),即 fderiv ℝ f θ。它的类型是?

  1. ,一个数
  2. EuclideanSpace ℝ (Fin n),一个向量
  3. EuclideanSpace ℝ (Fin n) →L[ℝ] ℝ,一个连续线性映射
  4. EuclideanSpace ℝ (Fin n) → ℝ,和 ff 同类型
解析

导数不是数也不是向量,是“输入方向、输出一阶变化量”的规则,所以是映射。它线性(→ₗ)且连续(→L)。gg 是把这个映射用内积表示出来的那个向量,Df(θ)[d]=g,dDf(\theta)[d]=\langle g,d\rangle,两者类型不同但信息相同(Riesz 表示)。D 错在 ff 一般不线性。

2c. o(t)o(t) 的类型

在 Lean 里,“r(t)=o(t)r(t)=o(t)” 是什么?

  1. 一个类型为 的值,可以和 tgdt\,g^{\top}d 相加
  2. 一个命题:(fun t => r t) =o[𝓝 0] (fun t => t),断言余项函数 rrtt 更快趋于 0
  3. 一个类型为 ℝ → ℝ 的函数,就是 rr 本身
  4. 一个类型为 EuclideanSpace ℝ (Fin n) 的向量
解析

课本把 o(t)o(t) 写在等式右边像一个加项,那是缩写。严格地说先定义 r(t)=φ(t)φ(0)φ(0)tr(t)=\varphi(t)-\varphi(0)-\varphi'(0)\,t(这是一个 ℝ → ℝ),然后断言 r =o[𝓝 0] idAsymptotics.IsLittleO 的值是 Prop。所以“等式里有 o(t)o(t)“其实是”等式加一条关于 rr 的断言“。这也是为什么 HasFDerivAt 的定义就是这条断言:第 9 题。

3. φ(0)\varphi'(0) 是什么

g=f(θ)g=\nabla f(\theta)dd 写出 φ(0)\varphi'(0)

解析
φ(0)=ifθi(θ)di=gd\varphi'(0)=\sum_{i}\frac{\partial f}{\partial\theta_i}(\theta)\,d_i=g^{\top}d

写成 dgd^{\top}gg,d\langle g,d\ranglegdg\cdot d 都是同一个数,内积对称。它有自己的名字:方向导数 Ddf(θ)D_df(\theta)

4. 为什么一元导数里冒出 \partial\sum

φ\varphi 是一元函数,但算 φ(t)\varphi'(t) 时写成 ifθi(θ+td)di\sum_i\frac{\partial f}{\partial\theta_i}(\theta+td)\cdot d_i\partial\sum 从哪来?

  1. 因为 φ\varphi 其实是多元函数
  2. 因为 φ\varphi 是复合函数,外层 ffnn 个输入,链式法则要对每个输入求偏导再把 nn 份贡献加起来
  3. 因为 tt 是向量
  4. 这是 Taylor 展开的定义,不需要解释
解析

φ=fu\varphi=f\circ u,内层 u(t)=θ+tdu(t)=\theta+tdnn 个分量 ui(t)=θi+tdiu_i(t)=\theta_i+td_i。多元链式法则:ddtf(u1,,un)=ifuiduidt\frac{d}{dt}f(u_1,\dots,u_n)=\sum_i\frac{\partial f}{\partial u_i}\frac{du_i}{dt}\partial 是因为 ff 多元,只能求偏导;\sum 是因为 nn 条路径各贡献一份。duidt=di\frac{du_i}{dt}=d_i

5. 数值题

f(x,y)=x2+3yf(x,y)=x^{2}+3y,θ=(1,2)\theta=(1,2),d=(1,1)d=(1,-1)

梯度 g=f(θ)g=\nabla f(\theta),写成 (x,y)(x,y):

φ(0)=gd\varphi'(0)=g^{\top}d 的值:

解析

fx=2x=2\frac{\partial f}{\partial x}=2x=2,fy=3\frac{\partial f}{\partial y}=3,所以 g=(2,3)g=(2,3)gd=21+3(1)=1g^{\top}d=2\cdot1+3\cdot(-1)=-1

验算:直接代入 φ(t)=(1+t)2+3(2t)=t2t+7\varphi(t)=(1+t)^{2}+3(2-t)=t^{2}-t+7,φ(0)=1\varphi'(0)=-1,一致。

6. 下降方向的判据

在点 θ\theta,方向 dd 是下降方向(沿它走足够小的一步函数值变小)的一阶判据是什么?

  1. d<1\|d\|<1
  2. gd>0g^{\top}d>0
  3. gd<0g^{\top}d<0
  4. d=gd=-g
解析

f(θ+td)f(θ)=tgd+o(t)f(\theta+td)-f(\theta)=t\,g^{\top}d+o(t),t>0t>0 很小时符号由 gdg^{\top}d 决定。d=gd=-g 是一个下降方向(此时 gd=g2<0g^{\top}d=-\|g\|^{2}<0),但不是唯一的:所有与 gg 成钝角的方向都下降。

7. 一阶看不出的情形

g=(2,3)g=(2,3),d=(3,2)d=(-3,2)。沿 dd 走一小步,ff 怎么变?

  1. 一定下降
  2. 一定上升
  3. 不变
  4. 一阶判断不了,gd=0g^{\top}d=0,要看二阶
解析

gd=2(3)+32=0g^{\top}d=2\cdot(-3)+3\cdot2=0,dd 与梯度正交。一阶项消失,变化量是 o(t)o(t),符号由二阶项 12t2dHd\tfrac12t^{2}d^{\top}Hd 决定,而 HH 题目没给。C 是错的:o(t)o(t) 不是 0。

8. 哪一步是近似

矩阵版推导分两步:(甲)Fréchet 可微给出 L(W+ΔW)L(W)=DL(W)[ΔW]+R(ΔW)\mathcal L(W+\Delta W)-\mathcal L(W)=D\mathcal L(W)[\Delta W]+R(\Delta W);(乙)梯度表示导数,DL(W)[H]=G,HF=Tr(GH)D\mathcal L(W)[H]=\langle G,H\rangle_F=\operatorname{Tr}(G^{\top}H)。哪一步含近似?

  1. 只有甲。乙是精确恒等式
  2. 只有乙。甲是定义
  3. 两步都是近似
  4. 两步都是精确的
解析

甲把 R(ΔW)R(\Delta W) 丢掉才变成 \approx,近似在这里,严格含义是 R=o(ΔWF)R=o(\|\Delta W\|_F)。乙只是把一个线性映射用内积写出来(Riesz 表示),再用有限求和恒等式把内积改写成迹,没有任何舍弃。这是 FirstOrderMatrixLoss 那篇文章开头强调的“两个必须分开的步骤”。

9. Mathlib 里的定义

HasFDerivAt f f' x 在 Mathlib 里等价于下面哪一条?

  1. ff 的所有偏导数在 xx 处存在
  2. hf(x+h)f(x)f(x)[h]h\mapsto f(x+h)-f(x)-f'(x)[h]o(h)o(h),当 h0h\to0
  3. limh0f(x+h)f(x)h\lim_{h\to0}\frac{f(x+h)-f(x)}{h} 存在
  4. ffxx 处连续
解析

hasFDerivAt_iff_isLittleO_nhds_zero 就是这条。课本先讲导数再证 Taylor,Mathlib 反过来:一阶 Taylor 展开就是可微的定义。A 太弱,偏导都存在不保证可微;C 是一元导数,多元时 hh 是向量,除不了;D 更弱。

10. 矩阵版的数值验证

G=(1021)G=\begin{pmatrix}1&0\\2&1\end{pmatrix},ΔW=(1101)\Delta W=\begin{pmatrix}1&1\\0&1\end{pmatrix}

Frobenius 内积 G,ΔWF=i,jGijΔWij\langle G,\Delta W\rangle_F=\sum_{i,j}G_{ij}\Delta W_{ij} 的值:

Tr(GΔW)\operatorname{Tr}(G^{\top}\Delta W) 的值:

解析

逐位相乘:11+01+20+11=21\cdot1+0\cdot1+2\cdot0+1\cdot1=2

G=(1201)G^{\top}=\begin{pmatrix}1&2\\0&1\end{pmatrix},GΔW=(1301)G^{\top}\Delta W=\begin{pmatrix}1&3\\0&1\end{pmatrix},迹 =1+1=2=1+1=2

两者相等不是巧合:Tr(GH)=jiGijHij\operatorname{Tr}(G^{\top}H)=\sum_j\sum_i G_{ij}H_{ij},换一下求和顺序就是 Frobenius 内积。Tr(ΔWG)\operatorname{Tr}(\Delta W\,G^{\top}) 也等于 2,那是 trace_mul_comm

11. 哪一步用了 Finset.sum_comm

推导 Tr(GH)=G,HF\operatorname{Tr}(G^{\top}H)=\langle G,H\rangle_F:

Tr(GH)=(a)j(GH)jj=(b)ji(G)jiHij=(c)jiGijHij=(d)ijGijHij\operatorname{Tr}(G^{\top}H) \overset{(a)}{=}\sum_{j}(G^{\top}H)_{jj} \overset{(b)}{=}\sum_{j}\sum_{i}(G^{\top})_{ji}H_{ij} \overset{(c)}{=}\sum_{j}\sum_{i}G_{ij}H_{ij} \overset{(d)}{=}\sum_{i}\sum_{j}G_{ij}H_{ij}

哪一步是 Finset.sum_comm?

  1. (a)
  2. (b)
  3. (c)
  4. (d)
解析

(a) 是迹的定义 Matrix.trace;(b) 是矩阵乘法定义 Matrix.mul_apply;(c) 是转置定义 Matrix.transpose_apply;(d) 交换两个求和号,才是 Finset.sum_comm。这条链和 Trace 篇里 trace_transpose_mul 的证明是同一批工具。