极限

极限描述的是:一个量越来越接近某个值时,另一个量会越来越接近什么值。

lim⁡x→af(x)=L\lim_{x\to a}f(x)=L

导数

一个量在某一点变换有多快:f′(x)=lim⁡h→0f(x+h)−f(x)hf'(x)=\lim_{h\to 0}\frac{f(x+h)-f(x)}{h}

常用求导法则:

  1. 常数:c′=0c'=0
  2. 和差:(f±g)′=f′±g′(f\pm g)'=f'\pm g'
  3. 乘积:(fg)′=f′g+fg′(fg)'=f'g+fg'
  4. 商:(fg)′=f′g−fg′g2\left(\frac{f}{g}\right)'=\frac{f'g-fg'}{g^2}
  5. 幂:(xn)′=nxn−1(x^n)'=nx^{n-1}
  6. 链式:ddxf(g(x))=f′(g(x))g′(x)\frac{d}{dx}f(g(x))=f'(g(x))g'(x)

记熟这几个就够了:(ex)′=ex(e^x)'=e^x,(ln⁡x)′=1x(\ln x)'=\frac{1}{x},(sin⁡x)′=cos⁡x(\sin x)'=\cos x,(ax)′=axln⁡a(a^x)'=a^x\ln a

链式法则

ddxf(g(x))=f′(g(x))⋅g′(x)\frac{d}{dx}f(g(x))=f'(g(x))\cdot g'(x)

外层函数求导之后,别忘了乘上内层的导数。

比如 f(x)=e2xf(x)=e^{2x}:外层是 eue^u,内层是 u=2xu=2x,外层求导得 eue^u,内层求导得 2,相乘得到 2e2x2e^{2x}。

这就是反向传播的全部数学内容:把一个巨大的复合函数拆成一串简单函数,每步只做局部求导,再把结果从后往前传。

写成连乘的形式,设 x→x1→x2→⋯→yx\to x_1\to x_2\to\cdots\to y,每一步都是 fif_i,则

dydx=dydxn⋅dxndxn−1⋯dx1dx\frac{dy}{dx}=\frac{dy}{dx_n}\cdot\frac{dx_n}{dx_{n-1}}\cdots\frac{dx_1}{dx}

链式法则的向量版本是雅可比矩阵:Jij=∂yi∂xjJ_{ij}=\frac{\partial y_i}{\partial x_j},也就是输入的每个分量对输出的每个分量的影响。一层网络的前向传播是 y=Wxy=Wx,它的雅可比就是 W 本身。

泰勒展开

泰勒展开把函数在某一点上「摊平」成多项式:

f(x)=∑n=0∞f(n)(x0)n!(x−x0)nf(x)=\sum_{n=0}^{\infty}\frac{f^{(n)}(x_0)}{n!}(x-x_0)^n

实际只用前几项做近似,最常用的是二阶:

f(x)≈f(x0)+f′(x0)(x−x0)+12f′′(x0)(x−x0)2f(x)\approx f(x_0)+f'(x_0)(x-x_0)+\frac{1}{2}f''(x_0)(x-x_0)^2

所以一个函数在一点附近其实就是个二次曲面。牛顿法就建在这上面:让二次近似的导数等于 0,解出下一步的位置:

xk+1=xk−f(xk)f′(xk)x_{k+1}=x_k-\frac{f(x_k)}{f'(x_k)}

和线性代数里的「对空间做线性近似」是同一个想法,区别只是这里近似的是函数值,那里近似的是映射本身。

积分

积分:把无数个非常微小的量累加起来,得到一个总量。

定积分:计算累计总量 ∫abf(x)dx\int_a^b f(x)dx

不定积分:寻找原函数 ∫f(x)dx\int f(x)dx

寻找原函数 F(x)F(x) 使得 F′(x)=f(x)F'(x) = f(x)

微积分基本定理:求导和积分互为逆运算。

∫abf′(x)dx=f(b)−f(a)\int_a^b f'(x)dx=f(b)-f(a)

于是:

  1. 定积分只要拿原函数在两端相减,不用真去算出不定积分再代入
  2. 求不定积分,就是找一个导数等于 f 的函数
  3. 导数描述局部变化率,积分把它累加回总量;局部和整体其实是同一件事的两种视角

多重积分

多重积分把普通积分从一维区间推广到二维、三维或更高维区间。

  • 一重积分:沿线累加
  • 二重积分:在面上累加
  • 三重积分:在空间中累加

偏导数与全微分

多元函数求导的办法:对某一个变量求导,其他变量全部当成常数固定住,这就是偏导数。

∂f∂xi\frac{\partial f}{\partial x_i}

把所有偏导数打包在一起,就是全微分,也就是函数在一小点附近的线性近似:

df=∑i=1n∂f∂xidxidf=\sum_{i=1}^{n}\frac{\partial f}{\partial x_i}dx_i

和一元的情况完全平行:一元里是 df=f′(x)dxdf=f'(x)dx,多元里就是各偏导数求和。同理,固定的 xix_i 换成矩阵就是雅可比。

梯度

把一个标量函数的所有偏导数打包成一个向量,就是梯度:

∇f=(∂f∂x1,∂f∂x2,⋯ ,∂f∂xn)\nabla f=\left(\frac{\partial f}{\partial x_1},\frac{\partial f}{\partial x_2},\cdots,\frac{\partial f}{\partial x_n}\right)

梯度有两个关键性质:

  1. ∇f\nabla f 的方向永远是函数上升最快的方向,−∇f-\nabla f 就是下降最快的方向
  2. ∇f⋅v\nabla f\cdot v 正好是 f 沿方向 v 的变化率

第 2 条正是线性代数中内积的用处:变化率由内积给出,所以梯度必然垂直于函数的等高线——沿着等高线走,变化率是 0。

梯度下降就是沿最陡的下坡方向反复走一步:

xk+1=xk−η∇f(xk)x_{k+1}=x_k-\eta\nabla f(x_k)

其中 η\eta 是学习率。因为负梯度垂直于等高线,所以这个过程本质上是一路垂直于等高线往下掉,直到落在谷底。

这就是所有机器学习训练的骨架:反向传播负责把梯度算出来,优化器负责沿着梯度往下走。