《算法的微积分基础》
梯度下降法简单来说就是一种通过导数来寻找目标函数最小化的方法。而对函数求解梯度的过程中就牵扯了很多的数学知识,有很多概念许久不用也有点生疏了,整理一篇博客用于巩固一下数学基础知识。
Key Words:导数、偏导数、泰勒级数
Beijing, 2020
数学基础知识
Derivative & Taylor Series
Derivative
导数的定义:导数是微积分中的重要概念,也叫导函数,又名微商。当函数 y = f ( x ) y=f(x) y=f(x)的自变量 x x x在一点 x 0 x_0 x0上产生一个增量 Δ x \Delta x Δx时,函数的输出值的增量 Δ y \Delta y Δy与自变量 Δ x \Delta x Δx的比值在 Δ x \Delta x Δx趋于0时的极限a如果存在,a即为在 x 0 x_0 x0处的导数,记作 f ′ ( x 0 ) f^{'}(x_0) f′(x0)或 d f ( x 0 ) d x \frac{df(x_0)}{dx} dxdf(x0)。
f ′ ( x 0 ) = lim x − > x 0 f ( x ) − f ( x 0 ) x − x 0 f^{'}(x_0) = \lim_{x->x_0}\frac{f(x) - f(x_0)}{x - x_0} f′(x0)=x−>x0limx−x0f(x)−f(x0)
导数是函数的局部性质。一个函数在某一点的导数描述了这个函数在这一点附近的变化率。如果函数的自变量和取值都是实数的话,导数的几何意义是函数 f ( x ) f(x) f(x)在 x 0 x_0 x0点出的切线方向。导数的本质是通过极限的概念对函数进行局部的线性逼近。例如在运动学中,物体的位移对于时间的导数就是物体的瞬时速度。
可导的函数一定连续;连续未必可导,不连续的函数一定不可导。不是所有的函数都有导函数,一个函数也不一定在所有的点上都有导数。若某函数在某一点导数存在,则称其在这一点可导,否则称为不可导。然而,
函数某点可导的充分必要条件:函数在该点的左右导数存在而且相等。函数在某一点导函数连续的充分必要条件是:导函数在该点的左右极限存在且相等,且该点的导数值等于极限值。
Taylor Series
在某个点附近用多项式函数来近似其他函数——泰勒级数,原因在于多项式比其他函数处理起来要容易的多。因为现实中太多非常复杂的函数,而幂级数相对来说是比较平易近人研究很透彻的函数,可以用平易近人的幂级数来逼近复杂的函数,从而可以通过研究幂级数来了解复杂函数。
函数项级数:设 u 1 ( x ) , u 2 ( x ) , . . . , u n ( x ) u_1(x),u_2(x),...,u_n(x) u1(x),u2(x),...,un(x),…是定义在某区间I上的函数列,则表达式
u 1 ( x ) , u 2 ( x ) , . . . , u n ( x ) + . . . = ∑ n = 0 ∞ u n ( x ) ( 1 ) u_1(x),u_2(x),...,u_n(x)+...=\sum_{n=0}^{\infty}u_n(x) \space\space\space\space (1) u1(x),u2(x),...,un(x)+...=n=0∑∞un(x) (1)
称为定义在区间I上的函数项级数。
幂级数:如果式(1)上的各项 u n ( x ) u_n(x) un(x)都是定义在区间 ( − ∞ , + ∞ ) (-\infty, +\infty ) (−∞,+∞)上的幂函数,函数项级数:
a 0 + a 1 ( x − x 0 ) + a 2 ( x − x 0 ) 2 + . . . + a n ( x − x 0 ) n + . . . = ∑ n = 0 ∞ a n ( x − x 0 ) n ( 2 ) a_0 + a_1(x-x_0) + a_2(x - x_0)^2 + ... + an(x - x_0)^n+... = \sum_{n=0}^{\infty}a_n(x - x_0)^n \space\space\space\space (2) a0+a1(x−x0)+a2(x−x0)2+...+an(x−x0)n+...=n=0∑∞an(x−x0)n (2)
称为幂级数,其中 x 0 x_0 x0为常数, a 0 , a 1 , . . . , a n a_0, a_1,...,a_n a0,a1,...,an为幂级数的系数。
幂级数在一定范围内具有类似多项式的性质,在收敛区间内能进行逐项微分和逐项积分等运算。幂级数 ∑ x n n ! \sum \frac{x^n}{n!} ∑n!xn在实数轴上收敛。幂级数一定要收敛才有意义,发散级数不能用来逼近函数。
泰勒级数定义:用无限项连加式——级数来表示一个函数,如果 f ( x ) f(x) f(x)在点 x = x 0 x=x_0 x=x0具有任意阶导数,则幂级数:
∑ n = 0 ∞ f ( n ) ( x 0 ) n ! ( x − x 0 ) n = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) + f ′ ′ ( x 0 ) 2 ! ( x − x 0 ) 2 + . . . + f n ( x 0 ) 2 ! ( x − x 0 ) n + . . . \sum_{n=0}^{\infty}\frac{f^{(n)}(x_0)}{n!}(x - x_0)^n = f(x_0) + f^{'}(x_0)(x - x_0) + \frac{f^{''}(x_0)}{2!}(x-x_0)^2 + ... + \frac{f^{n}(x_0)}{2!}(x-x_0)^n + ... n=0∑∞n!f(n)(x0)(x−x0)n=f(x0)+f′(x0)(x−x0)+2!f′′(x0)(x−x0)2+...+2!fn(x0)(x−x0)n+...
称为 f ( x ) f(x) f(x)在点 x = x 0 x=x_0 x=x0处的泰勒级数。
麦克劳林级数:在泰勒公式中,取 x 0 = 0 x_0=0 x0=0,得到的级数称为麦克劳林级数
∑ n = 0 ∞ f ( n ) ( 0 ) n ! ( x ) n \sum_{n=0}^{\infty}\frac{f^{(n)}(0)}{n!}(x)^n n=0∑∞n!f(n)(0)(x)n
Gradient & Multivariable Taylor Series
偏导数和导数的意义相同,偏导数需要函数至少有两个变量,偏导数反映的是函数沿坐标轴正方向的变化率。
Gradient
梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率值(为该梯度的模)最大。
梯度定义:设二元函数 z = f ( x , y ) z=f(x,y) z=f(x,y)在平面区域D上具有一阶连续偏导数,则对于每一个点 P ( x 0 , y 0 ) P(x_0,y_0) P(x0,y0)都可以定出一个向量 { ∂ f ∂ x 0 , ∂ f ∂ y 0 } = f x 0 ( x , y ) ⋅ i + f y 0 ( x , y ) ⋅ j \{\frac{\partial f}{\partial x_0},\frac{\partial f}{\partial y_0}\} = f_{x_0}(x,y) \cdot i + f_{y_0}(x,y) \cdot j {∂x0∂f,∂y0∂f}=fx0(x,y)⋅i+fy0(x,y)⋅j,其中 i , j i,j i,j 表示平行于坐标轴的单位向量。二维向量微分算子也即二维梯度可以表示为:
∇ f = ∂ f ∂ x 0 i + ∂ f ∂ y 0 j \nabla f = \frac{\partial f}{\partial x_0}i + \frac{\partial f}{\partial y_0}j ∇f=∂x0∂fi+∂y0∂fj
很容易推广到多维度的情况,比如三维的情况:
{ ∂ f ∂ x 0 , ∂ f ∂ y 0 , ∂ f ∂ z 0 } = ∂ f ∂ x 0 i , ∂ f ∂ y 0 j , ∂ f ∂ z 0 k \{\frac{\partial f}{\partial x_0},\frac{\partial f}{\partial y_0}, \frac{\partial f}{\partial z_0} \} = \frac{\partial f}{\partial x_0}i,\frac{\partial f}{\partial y_0}j, \frac{\partial f}{\partial z_0}k {∂x0∂f,∂y0∂f,∂z0∂f}=∂x0∂fi,∂y0∂fj,∂z0∂fk
一元函数也是存在梯度的,如果一元函数在定义域内可导,那么对于 ∀ x 0 \forall x_0 ∀x0 的梯度可以表示为 f ′ ( x ) ∗ i \space f'(x)*i f′(x)∗i,$i $ 表示平行于坐标轴的单位向量,模长为 ∣ f ′ ( x ) ∣ |f'(x)| ∣f′(x)∣。
一元函数的梯度下降过程,下图是一个 f ( x ) = 1 2 x 2 f(x)=\frac{1}{2}x^2 f(x)=21x2的函数图像(蓝色)及其导数 f ′ ( x ) = x f'(x)=x f′(x)=x图像(绿色),所以该函数的在 x = x 0 x=x_0 x=x0处的梯度为 f ′ ( x 0 ) ∗ i f'(x_0)*i f′(x0)∗i,当 x > 0 x > 0 x>0时,有 f ′ ( x ) > 0 f'(x) > 0 f′(x)>0,此时 f ( x ) f(x) f(x)在任意的 x > 0 x > 0 x>0处的梯度 x i x_i xi应水平向右。同理当 x < 0 x<0 x<0时, f ( x ) f(x) f(x)在任意的 x < 0 x < 0 x<0处梯度方向为水平向左,因此负梯度方向则向右,此时 f ( x ) f(x) f(x)便减小,逐步更新,直到达到最小值点。
梯度下降算法是一种非常经典的求极小值的算法,比如在线性回归里我们可以用最小二乘法去解析最优解,但是其中会涉及到对矩阵求逆,由于多重共线性问题的存在是很让人难受的,无论进行L1正则化的Lasso回归还是L2正则化的岭回归,其实并不让人满意,因为它们的产生是为了修复此漏洞,而不是为了提升模型效果,甚至使模型效果下降。但是换一种思路,比如用梯度下降算法去优化线性回归的损失函数,完全就可以不用考虑多重共线性带来的问题。
其实不仅是线性回归,逻辑回归同样是可以用梯度下降进行优化,因为这两个算法的损失函数都是严格意义上的凸函数,即存在全局唯一极小值,较小的学习率和足够的迭代次数,一定可以达到最小值附近,满足精度要求是完全没有问题的。
Multivariable Taylor Series
二元函数在点 ( x k , y k ) (x_k, y_k) (xk,yk)处的泰勒展开式:
f ( x , y ) = f ( x k , y k ) + f ′ ( x k , y k ) ( x − x k ) + f ′ ( x k , y k ) ( y − y k ) + 1 2 ! f x x ′ ′ ( x k , y k ) ( x − x k ) 2 + 1 2 ! f x y ′ ′ ( x k , y k ) ( x − x k ) ( y − y k ) + 1 2 ! f y x ′ ′ ( x k , y k ) ( x − x k ) ( y − y k ) + 1 2 ! f y y ′ ′ ( x k , y k ) ( y − y k ) 2 + o n f(x,y) = f(x_k, y_k) + \\ f'(x_k, y_k)(x - x_k) + f'(x_k, y_k)(y - y_k) + \\ \frac{1}{2!}f''_{xx}(x_k, y_k)(x - x_k)^2 + \\ \frac{1}{2!}f''_{xy}(x_k, y_k)(x - x_k)(y - y_k) + \\ \frac{1}{2!}f''_{yx}(x_k, y_k)(x - x_k)(y - y_k) + \\ \frac{1}{2!}f''_{yy}(x_k, y_k)(y - y_k)^2 + o^n f(x,y)=f(xk,yk)+f′(xk,yk)(x−xk)+f′(xk,yk)(y−yk)+2!1fxx′′(xk,yk)(x−xk)2+2!1fxy′′(xk,yk)(x−xk)(y−yk)+2!1fyx′′(xk,yk)(x−xk)(y−yk)+2!1fyy′′(xk,yk)(y−yk)2+on
多元函数(n)在点 x k x_k xk处的泰勒展开式:
f ( x 1 , x 2 , . . . , x n ) = f ( x k 1 , x k 2 , . . . , x k n ) + ∑ i = 1 n f x i ′ ( x k 1 , x k 2 , . . . , x k n ) ( x i − x k i ) + 1 2 ! ∑ i , j = 1 n f x i x j ′ ′ ( x k 1 , x k 2 , . . . , x k n ) ( x i − x k i ) ( x j − x k j ) + o n f(x^1,x^2,...,x^n)=f(x_k^1,x_k^2,...,x_k^n) + \sum_{i=1}^nf'_{x^i}(x_k^1, x_k^2,...,x_k^n)(x^i - x_k^i) + \\ \frac{1}{2!}\sum_{i,j=1}^nf''_{x^ix^j}(x_k^1, x_k^2,...,x_k^n)(x^i - x_k^i)(x^j - x_k^j) + o^n f(x1,x2,...,xn)=f(xk1,xk2,...,xkn)+i=1∑nfxi′(xk1,xk2,...,xkn)(xi−xki)+2!1i,j=1∑nfxixj′′(xk1,xk2,...,xkn)(xi−xki)(xj−xkj)+on
利用黑塞矩阵表示多元泰勒展开式,黑塞矩阵是由函数的二阶偏导数组成的方阵,描述了函数的局部曲率。黑塞矩阵常用于牛顿法解决优化问题,利用黑塞矩阵可判定多元函数的极值问题。
f ( x ) = f ( x k ) + [ ∇ f ( x k ) ] T ( x − x k ) + 1 2 ! [ x − x k ] T H ( x k ) [ x − x k ] + o n f(x) = f(x_k) + [\nabla f(x_k)]^T(x - x_k) + \frac{1}{2!}[x - x_k]^T H(x_k)[x - x_k] + o^n f(x)=f(xk)+[∇f(xk)]T(x−xk)+2!1[x−xk]TH(xk)[x−xk]+on
函数在某点处用泰勒展开式对函数进行逼近,距离某点处范围越小,泰勒展开的时候就越不需要高阶幂函数项的参与。