机器学习高等数学基础——多元微分总结

本文详细介绍了多元微分的基本概念,包括n维空间、二元函数、偏导数及其计算,以及方向导数、梯度和Hessian矩阵。此外,还探讨了函数的极值与最值,包括无条件极值和条件极值(拉格朗日乘子法),并讨论了基于梯度的优化方法,如梯度下降法和牛顿迭代法。这些理论在机器学习和最优化问题中有着广泛应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多元微分求偏导

多元函数相关概念

n维空间

  设 n n n为取定的一个正整数,我们用 R n R^n Rn表示 n n n元有序实数组 ( x 1 , x 2 , . . . , x n ) (x_1,x_2,...,x_n) (x1,x2,...,xn)的全体所构成的集合,即
KaTeX parse error: Expected 'EOF', got '}' at position 88: …, i = 1,2,...,n}̲
R n R^n Rn中的元素 ( x 1 , x 2 , . . . , x n ) (x_1,x_2,...,x_n) (x1,x2,...,xn)有时也用单个字母 x x x来表示,即 x = ( x 1 , x 2 , . . . , x n ) x = (x_1,x_2,...,x_n) x=(x1,x2,...,xn).当所有的 x i ( i = 1 , 2 , . . . , n ) x_i(i = 1,2,...,n) xi(i=1,2,...,n)都为零时,称这样的元素为 R n R^n Rn中的零元,记为0或O。在解析几何中,通过直角坐标系, R 2 R^2 R2(或 R 3 R^3 R3)中的元素分别与平面(或空间)中的点或向量建立一一对应的关系。
  为了在集合 R n R^n Rn中的元素之间建立联系,在 R n R^n Rn中定义线性运算如下:
x + y = ( x 1 + y 1 , x 2 + y 2 , . . . , x n + y n ) λ x = ( λ x 1 , λ x 2 , . . . , λ x n ) x + y = (x_1 + y_1 , x_2 + y_2, ... , x_n + y_n) \\ \lambda x = (\lambda x_1, \lambda x_2, ..., \lambda x_n) x+y=(x1+y1,x2+y2,...,xn+yn)λx=(λx1,λx2,...,λxn)
这样定义了线性运算的集合 R n R^n Rn称为 n n n维空间。
  此外, R n R^n Rn中点 x x x和点 y y y之间的距离,记作 ρ = ( x , y ) \rho = (x, y) ρ=(x,y),规定
ρ = ( x , y ) = ( x 1 + y 1 ) 2 + ( x 2 + y 2 ) 2 + . . . + ( x n + y n ) 2 \rho = (x, y) = \sqrt{{(x_1 + y_1)}^2 + {(x_2 + y_2)}^2 + ... + {(x_n + y_n)}^2} ρ=(x,y)=(x1+y1)2+(x2+y2)2+...+(xn+yn)2

二元函数

  设 D D D R 2 R^2 R2的一个非空子集,称映射 f : D − > R f:D->R f:D>R为定义在 D D D上的二元函数,通常记为
z = f ( x , y ) , ( x , y ) ∈ D z = f(x, y) , (x,y) \in D z=f(x,y),(x,y)D

z = f ( P ) , P ∈ D z = f(P) , P \in D z=f(P),PD

二元函数图像


求偏导数

  个人理解:为什么要求偏导,而不是像在一元函数中那样求导数?在一元函数中,我们仅需要求解 f ( x ) f(x) f(x) x x x的导数即可获得函数的性态,因为此时 f ( x ) f(x) f(x)只与 x x x对应。而在多元函数(这里以二元函数为例)中, f ( x , y ) f(x,y) f(x,y) x x x y y y对应。观察下图,我们发现,此时, M 0 M_0 M0点的方向不再固定,为了能够更好地描述函数性态,我们主要对 x x x y y y两个方向进行求导,也就是 f ( x , y ) f(x,y) f(x,y)分别对 x x x y y y求偏导数,类似于做降维处理(一元函数求导),简化了计算。当然,从数学角度讲,可能延伸到求二元极限(导数的定义)、求全微分等内容,这里不作展开。
  偏导数定义如下图:
偏导数定义


  举例:求 z = x 2 + 3 x y + y 2 z = x^2 + 3xy + y^2 z=x2+3xy+y2在点 ( 1 , 2 ) (1,2) (1,2)处的偏导数。
  把 y y y看做常数,得
∂ z ∂ x = 2 x + 3 y \frac{\partial z}{\partial x} = 2x + 3y xz=2x+3y
  把 x x x看做常数,得
∂ z ∂ y = 3 x + 2 y \frac{\partial z}{\partial y} = 3x + 2y yz=3x+2y
( 1 , 2 ) (1,2) (1,2)带入上面结果即可求解。

二元函数图像


方向导数求梯度

  在上一小节中,提到了多元函数求偏导时的方向问题。这里就引出了方向导数,那么方向导数可以理解为在函数定义域内的某一点,对该点的某一方向求得的导数。结合一元导数的意义(变化率),可以进一步理解为一个函数沿指定方向的变化率
  以下图为例,可以把它看作“山”的模型,而山的表面可以通过一个函数来表达。此时,我们在山上的某一点想要下山。在下山的过程中,我们总是有很多的方向(方向导数)可以选择,有的方向可以引导我们更快地下山,有的方向甚至可以引导我们上山,那么沿着哪个方向才是最快的下山路径?这就引出了梯度这一概念。
方向导数与梯度的关联

  通过上面的例子,易知梯度是有方向的,它是一个向量,这与方向导数有本质的区别(方向导数本质上是数值,可以直观理解为“下山”例子中的“下山速度”)。
  梯度表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(该梯度的方向)变化最快,变化率最大(该梯度的模)。
  定义:设二元函数 z = f ( x , y ) z=f(x,y) z=f(x,y)在平面区域 D D D上具有一阶连续偏导数,则对于每一个点 P ( x , y ) P(x,y) P(x,y)都可定义出一个向量 { ∂ f ∂ x , ∂ f ∂ y } = f x ( x , y ) i + f y ( x , y ) j \{\frac{\partial f}{\partial x} , \frac{\partial f}{\partial y}\} = f_{x}(x,y)\boldsymbol{i} + f_{y}(x,y)\boldsymbol{j} {xf,yf}=fx(x,y)i+fy(x,y)j,该函数就称为函数 z = f ( x , y ) z=f(x,y) z=f(x,y)在点 P ( x , y ) P(x,y) P(x,y)的梯度,记为 g r a d   f ( x , y ) \boldsymbol{grad} {\,} f(x,y) gradf(x,y) ∇   f ( x , y ) \nabla {\,} f(x,y) f(x,y)
  其中, ∇ \nabla 称为(二维的)向量微分算子或Nabla算子。
  举例:计算 f ( x , y ) = x 2 + y 2 f(x,y) = x^2 + y^2 f(x,y)=x2+y2的梯度向量。

一阶偏导求Jacobian矩阵

  假设𝐹:ℝ𝑛→ℝ𝑚是一个从 n n n维欧氏空间映射到 m m m维欧氏空间的函数。该函数由 m m m个实函数组成: y 1 ( x 1 , . . . , x n ) , . . . , y m ( x 1 , . . . , x n ) y_1(x_1, ... , x_n) , ... , y_m(x_1, ... , x_n) y1(x1,...,xn),...,ym(x1,...,xn)。这些函数的偏导数(如果存在)可以组成一个 m m m n n n列的矩阵,这个矩阵就是所谓的Jacobian(雅可比)矩阵:
[ ∂ y 1 ∂ x 1 ⋯ ∂ y 1 ∂ x n ⋮ ⋱ ⋮ ∂ y m ∂ x 1 ⋯ ∂ y m ∂ x n ] \left[ \begin{matrix} \frac{\partial y_1}{\partial x_1} & \cdots & \frac{\partial y_1}{\partial x_n} \\ \vdots & \ddots & \vdots \\ \frac{\partial y_m}{\partial x_1} & \cdots & \frac{\partial y_m}{\partial x_n} \end{matrix} \right] x1y1x1ymxny1xnym
  对比梯度公式:
∇   y ( x 1 , x 2 ) = { ∂ y ∂ x 1 , ∂ y ∂ x 2 } \nabla {\,} y(x_1,x_2) = \{\frac{\partial y}{\partial x_1} , \frac{\partial y}{\partial x_2}\} y(x1,x2)={x1y,x2y}
  观察Jacobian矩阵公式和梯度公式,可以把Jacobian矩阵公式化为梯度向量形式:
[ ∇   y 1 ( x 1 , x 2 , . . . , x n ) ⋮ ∇   y m ( x 1 , x 2 , . . . , x n ) ] \left[ \begin{matrix} \nabla {\,} y_1(x_1,x_2,...,x_n) \\ \vdots \\ \nabla {\,} y_m(x_1,x_2,...,x_n) \end{matrix} \right] y1(x1,x2,...,xn)ym(x1,x2,...,xn)
Jacobian矩阵的行向量即是对应函数的梯度向量。
  显而易见,梯度向量是Jacobian矩阵的特例!
  举例:求 F = ( f 1 ( x , y ) , f 2 ( x , y ) ) T F = (f_1(x,y),f_2(x,y))^T F=(f1(x,y),f2(x,y))T的雅可比矩阵,其中 f 1 ( x , y ) = 2 x 2 + y 2 f_1(x,y) = 2x^2 + y^2 f1(x,y)=2x2+y2 f 2 ( x , y ) = x 2 + 3 y 2 f_2(x,y) = x^2 + 3y^2 f2(x,y)=x2+3y2

二阶偏导求Hessian矩阵

  Hessian矩阵(黑塞矩阵/海森矩阵),是由一个多元函数的二阶偏导数构成的方阵,描述了函数的局部曲率。在数学中,Hessian矩阵是一个自变量为向量的实值函数的二阶偏导数组成的方块矩阵,假设有一实数函数 f ( x 1 , x 2 , . . . , x n ) f(x_1,x_2,...,x_n) f(x1,x2,...,xn)如果 f f f所有的二阶偏导数都存在,那么 f f f的Hessian矩阵的第 i j ij ij项,即:
H ( f i j ( x ) ) = D i D j f ( x ) H(f_{ij}(x)) = D_iD_jf(x) H(fij(x))=DiDjf(x)
其中 x = ( x 1 , x 2 , . . . , x n ) T x = (x_1,x_2,...,x_n)^T x=(x1,x2,...,xn)T,即
[ ∂ 2 f ∂ x 1 2 ∂ 2 f ∂ x 1 ∂ x 2 ⋯ ∂ 2 f ∂ x 1 ∂ x n ∂ 2 f ∂ x 2 ∂ x 1 ∂ 2 f ∂ x 2 2 ⋯ ∂ 2 f ∂ x 2 ∂ x n ⋮ ⋮ ⋱ ⋮ ∂ 2 f ∂ x n ∂ x 1 ∂ 2 f ∂ x n ∂ x 2 ⋯ ∂ 2 f ∂ x n 2 ] \left[ \begin{matrix} \frac{\partial^{2}f}{\partial x^{2}_1} & \frac{\partial^{2}f}{\partial x_1\partial x_2} & \cdots & \frac{\partial^{2}f}{\partial x_1\partial x_n}\\ \frac{\partial^{2}f}{\partial x_2\partial x_1} & \frac{\partial^{2}f}{\partial x^{2}_2} & \cdots & \frac{\partial^{2}f}{\partial x_2\partial x_n} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial^{2}f}{\partial x_n\partial x_1} & \frac{\partial^{2}f}{\partial x_n\partial x_2} & \cdots & \frac{\partial^{2}f}{\partial x^{2}_n} \end{matrix} \right] x122fx2x12fxnx12fx1x22fx222fxnx22fx1xn2fx2xn2fxn22f

  现求符合Hessian矩阵公式要求的一实数函数 f ( x 1 , x 2 , . . . , x n ) f(x_1,x_2,...,x_n) f(x1,x2,...,xn)的梯度向量 g ( x ) g(x) g(x)
[ ∂ ∂ x 1 f ( x 1 , x 2 , . . . , x n ) ∂ ∂ x 2 f ( x 1 , x 2 , . . . , x n ) ⋮ ∂ ∂ x n f ( x 1 , x 2 , . . . , x n ) ] \left[ \begin{matrix} \frac{\partial}{\partial x_1}f(x_1,x_2,...,x_n) \\ \frac{\partial}{\partial x_2}f(x_1,x_2,...,x_n) \\ \vdots \\ \frac{\partial }{\partial x_n}f(x_1,x_2,...,x_n) \end{matrix} \right] x1f(x1,x2,...,xn)x2f(x1,x2,...,xn)xnf(x1,x2,...,xn)
  此时,可以很明显地得出,列向量(梯度向量)的每一个元素都是包含自变量 x 1 , x 2 , . . . , x n x_1,x_2,...,x_n x1,x2,...,xn全新函数(相当于 y 1 , y 2 , . . . , y n y_1,y_2,...,y_n y1,y2,...,yn,再对该梯度向量求Jacobian矩阵,即对其中每一全新函数分别求他们的梯度向量(从数学计算角度来说,类似于求每一个一阶导数对应的全微分,这也是我们需要该实数函数(符合Hessian矩阵公式要求)的所有的二阶偏导数都存在的原因之一):
∇ x   g ( x ) = ∇ x [ ∂ ∂ x 1 f ( x 1 , x 2 , . . . , x n ) ∂ ∂ x 2 f ( x 1 , x 2 , . . . , x n ) ⋮ ∂ ∂ x n f ( x 1 , x 2 , . . . , x n ) ] = [ ∂ 2 f ∂ x 1 2 ∂ 2 f ∂ x 1 ∂ x 2 ⋯ ∂ 2 f ∂ x 1 ∂ x n ∂ 2 f ∂ x 2 ∂ x 1 ∂ 2 f ∂ x 2 2 ⋯ ∂ 2 f ∂ x 2 ∂ x n ⋮ ⋮ ⋱ ⋮ ∂ 2 f ∂ x n ∂ x 1 ∂ 2 f ∂ x n ∂ x 2 ⋯ ∂ 2 f ∂ x n 2 ] \nabla_x {\,} g(x) = \nabla_x \left[ \begin{matrix} \frac{\partial}{\partial x_1}f(x_1,x_2,...,x_n) \\ \frac{\partial}{\partial x_2}f(x_1,x_2,...,x_n) \\ \vdots \\ \frac{\partial }{\partial x_n}f(x_1,x_2,...,x_n) \end{matrix} \right] = \left[ \begin{matrix} \frac{\partial^{2}f}{\partial x^{2}_1} & \frac{\partial^{2}f}{\partial x_1\partial x_2} & \cdots & \frac{\partial^{2}f}{\partial x_1\partial x_n}\\ \frac{\partial^{2}f}{\partial x_2\partial x_1} & \frac{\partial^{2}f}{\partial x^{2}_2} & \cdots & \frac{\partial^{2}f}{\partial x_2\partial x_n} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial^{2}f}{\partial x_n\partial x_1} & \frac{\partial^{2}f}{\partial x_n\partial x_2} & \cdots & \frac{\partial^{2}f}{\partial x^{2}_n} \end{matrix} \right] xg(x)=xx1f(x1,x2,...,xn)x2f(x1,x2,...,xn)xnf(x1,x2,...,xn)=x122fx2x12fxnx12fx1x22fx222fxnx22fx1xn2fx2xn2fxn22f
  显然,Hessian矩阵是梯度向量g(x)对自变量x的Jacobian矩阵。

多元函数求极值

函数的极值与最值的概念

  极值:设函数 f ( x ) f(x) f(x) x 0 x_0 x0的某邻域 U ( x 0 ) U(x_0) U(x0)内有定义,如果对于去心邻域 U ( x 0 ) U(x_0) U(x0)内的任意x,有 A A A
f ( x ) < f ( x 0 )   或   f ( x ) > f ( x 0 ) f(x) < f(x_0) {\,} 或 {\,} f(x) > f(x_0) f(x)<f(x0)f(x)>f(x0)
那么就称 f ( x 0 ) f(x_0) f(x0)是函数的一个极大值或极小值。如果熟悉极限定义的同学就会发现,极值只在某一范围内(并不是函数定义域)起作用,当超出这个范围后,该极值不一定适用。
极值与鞍点

而最值是函数在其定义域内取得最大值(或最小值)的点的函数值。
  综上所述,极值是局部性概念,而最值是全局性概念。在西瓜书·第五章·神经网络章节,我们会学到参数寻优的方法,即在局部极值的基础上去寻找全局最优,这并不容易~

最优性条件

  在一元函数前提下,我们会利用判断极值的两个充分条件解决问题。在实际计算中,通常使用求导结合区间单调性的方式,判断函数的极值,相对比较容易,这里不作展开。
  在多元函前提下,我们分为条件极值和无条件极值两种情况讨论。

无条件极值

  二元函数取得极值的充分条件:如果函数 z = f ( x , y ) z=f(x,y) z=f(x,y)在点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)的某邻域内具有连续的二阶偏导数, ( x 0 , y 0 ) (x_0,y_0) (x0,y0)是它的驻点,令:
A = f x x ( x 0 , y 0 ) , B = f x y ( x 0 , y 0 ) , C = f y y ( x 0 , y 0 ) Δ = B 2 − A C A = f_{xx}(x_0,y_0),B = f_{xy}(x_0,y_0),C = f_{yy}(x_0,y_0) \\ \Delta = B^2 - AC A=fxx(x0,y0),B=fxy(x0,y0),C=fyy(x0,y0)Δ=B2AC
则:

  1. Δ < 0 \Delta < 0 Δ<0时, f ( x , y ) f(x,y) f(x,y) ( x 0 , y 0 ) (x_0,y_0) (x0,y0)取得极值。其中 A > 0 A > 0 A>0时,取极小值, A < 0 A < 0 A<0时,取极大值;
  2. Δ > 0 \Delta > 0 Δ>0时, f ( x 0 , y 0 ) f(x_0,y_0) f(x0,y0)不是极值;
  3. Δ = 0 \Delta = 0 Δ=0时,不能确定,需进一步判断。

  更严谨的表述:设 n n n元实函数 f ( x 1 , x 2 , . . . , x n ) f(x_1,x_2,...,x_n) f(x1,x2,...,xn)在点 M 0 ( a 1 , a 2 , . . . , a n ) M_0(a_1,a_2,...,a_n) M0(a1,a2,...,an)的邻域内有二阶连续偏导,若有:
∂ f ∂ x j ∣ ( a 1 , a 2 , . . . , a n ) = 0   ,   j = 1 , 2 , . . . , n \left. \frac{\partial f}{\partial x_j} \right|_{(a_1,a_2,...,a_n)} = 0 {\,} , {\,} j = 1,2,...,n xjf(a1,a2,...,an)=0,j=1,2,...,n

A = [ ∂ 2 f ∂ x 1 2 ∂ 2 f ∂ x 1 ∂ x 2 ⋯ ∂ 2 f ∂ x 1 ∂ x n ∂ 2 f ∂ x 2 ∂ x 1 ∂ 2 f ∂ x 2 2 ⋯ ∂ 2 f ∂ x 2 ∂ x n ⋮ ⋮ ⋱ ⋮ ∂ 2 f ∂ x n ∂ x 1 ∂ 2 f ∂ x n ∂ x 2 ⋯ ∂ 2 f ∂ x n 2 ] A = \left[ \begin{matrix} \frac{\partial^{2}f}{\partial x^{2}_1} & \frac{\partial^{2}f}{\partial x_1\partial x_2} & \cdots & \frac{\partial^{2}f}{\partial x_1\partial x_n}\\ \frac{\partial^{2}f}{\partial x_2\partial x_1} & \frac{\partial^{2}f}{\partial x^{2}_2} & \cdots & \frac{\partial^{2}f}{\partial x_2\partial x_n} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial^{2}f}{\partial x_n\partial x_1} & \frac{\partial^{2}f}{\partial x_n\partial x_2} & \cdots & \frac{\partial^{2}f}{\partial x^{2}_n} \end{matrix} \right] A=x122fx2x12fxnx12fx1x22fx222fxnx22fx1xn2fx2xn2fxn22f
则有如下结果:

  1. A A A是正定矩阵时, f ( x 1 , x 2 , . . . , x n ) f(x_1,x_2,...,x_n) f(x1,x2,...,xn) M 0 ( a 1 , a 2 , . . . , a n ) M_0(a_1,a_2,...,a_n) M0(a1,a2,...,an)处是极小值;
  2. A A A是负定矩阵时, f ( x 1 , x 2 , . . . , x n ) f(x_1,x_2,...,x_n) f(x1,x2,...,xn) M 0 ( a 1 , a 2 , . . . , a n ) M_0(a_1,a_2,...,a_n) M0(a1,a2,...,an)处是极大值;
  3. A A A是不定矩阵时, M 0 ( a 1 , a 2 , . . . , a n ) M_0(a_1,a_2,...,a_n) M0(a1,a2,...,an)不是极值点;
  4. A A A是半正定矩阵或半负定矩阵时, M 0 ( a 1 , a 2 , . . . , a n ) M_0(a_1,a_2,...,a_n) M0(a1,a2,...,an)是“可疑”极值点,尚需要利用其他方法来判定。

条件极值(拉格朗日乘子法)

  条件极值更严谨地表述为带等式约束的优化问题,显然我们需要使用拉格朗日乘子法
举例:求函数 z = f ( x , y ) z = f(x,y) z=f(x,y)在条件 φ ( x , y ) = 0 \varphi(x,y) = 0 φ(x,y)=0下的极值。

引入拉格朗日函数 L ( x , y ) = f ( x , y ) + λ φ ( x , y ) L(x,y) = f(x,y) + \lambda \varphi(x,y) L(x,y)=f(x,y)+λφ(x,y)
则极值点满足: { L x ( x 0 , y 0 ) = 0 L y ( x 0 , y 0 ) = 0 φ ( x 0 , y 0 ) = 0 \begin{cases} L_x(x_0,y_0) = 0\\ L_y(x_0,y_0) = 0 \\ \varphi(x_0,y_0) = 0 \end{cases} Lx(x0,y0)=0Ly(x0,y0)=0φ(x0,y0)=0
接下来联立方程组,求解出 x x x y y y即可。

基于梯度的优化方法

Taylor公式

  Taylor公式就是用一个多项式函数去逼近一个给定的函数,即尽量使多项式函数图像拟合给定的函数图像
。如果一个非常复杂的函数,想求其某点的值,直接求无法实现。此时,可以使用Taylor公式去近似地求该值,这是Taylor公式的应用之一。Taylor公式在机器学习中主要应用于梯度迭代。
  定义:设 n n n是一个正整数。如果定义一个包含 a a a的区间上的函数 f f f a a a点处 n + 1 n+1 n+1次可导,那么对于这个区间上的任意 x x x都有:
f ( x ) = f ( a ) 0 ! + f ′ ( a ) 1 ! ( x − a ) + f ′ ′ ( a ) 2 ! ( x − a ) 2 + ⋅ ⋅ ⋅ + f ( n ) ( a ) n ! ( x − a ) n + R n ( x ) = ∑ n = 0 N f ( n ) ( a ) n ! ( x − a ) n + R n ( x ) f(x) = \frac{f(a)}{0!} + \frac{f^{\prime}(a)}{1!}(x-a) + \frac{f^{\prime\prime}(a)}{2!}(x-a)^2+···+\frac{f^{(n)}(a)}{n!}(x-a)^n + R_n(x)\\=\sum_{n=0}^N \frac{f^{(n)}(a)}{n!}(x-a)^n + R_n(x) f(x)=0!f(a)+1!f(a)(xa)+2!f(a)(xa)2++n!f(n)(a)(xa)n+Rn(x)=n=0Nn!f(n)(a)(xa)n+Rn(x)
其中, ∑ n = 0 N f ( n ) ( a ) n ! ( x − a ) n \sum_{n=0}^N \frac{f^{(n)}(a)}{n!}(x-a)^n n=0Nn!f(n)(a)(xa)n称为函数在 a a a处的Taylor展开式, R n ( x ) R_n(x) Rn(x)称为Taylor公式的余项。

Taylor


梯度下降法

  举例:使用梯度下降法求函数 y = c o s ( x ) y = cos(x) y=cos(x)在区间 x ∈ [ 0 , 2 π ] x \in [0,2\pi] x[0,2π]的极小值点。

import numpy as np
import matplotlib.pyplot as plt
import random

#y = cos(x)
def f(x):
    return np.cos(x)

#导数定义求某点导数值    
def qiudao(f, x, delta = 1e-4):
    return (f(x + delta) - f(x - delta)) / (2 * delta)

#画图
xs = np.linspace(0, 2*np.pi, 100)
plt.plot(xs, f(xs))


learning_rate = 0.1
max_loop = 200 #迭代次数

#随机选取初始值
start = random.uniform(0, 2 * np.pi)
x = start
x_list = [] #记录梯度下降过程

for i in range(max_loop):
    qd = qiudao(f, x) #求梯度
    x = x - learning_rate * qd #梯度下降法找到下一个点
    x_list.append(x)

#画图
x_list = np.array(x_list)
plt.scatter(x_list, f(x_list), c = "r")
plt.show()

print("initial x = ", start)
print("arg min f(x) of x = ", x)
print("f(x) = ", f(x))

输出结果:
梯度下降法

  • initial x = 1.5355280934997437
  • arg min f(x) of x = 3.1415926520680157
  • f(x) = -1.0

牛顿迭代法

  函数值为 0 0 0时,自变量如何取值?这里引出牛顿迭代法(一下简称牛顿法)。
  利用牛顿法求解目标函数的最小值,实际上就是转化成求解使目标函数的一阶导为 0 0 0的参数值。这一转化的理论依据:函数的极值点处的一阶导数为0。
  以一元函数举例:
  迭代过程是在当前位置 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)的横坐标 x 0 x_0 x0求该函数的切线(求一阶导),该切线和 x x x轴的交点 x 1 x_1 x1,作为新的“ x 0 x_0 x0”。
  重复这一过程,直到交点和函数(实际上是目标函数的一阶导数)的零点重合。此时的参数值就是使得目标函数取得极值的参数值。其迭代过程如图:

牛顿迭代法过程


迭代公式如下:
θ : = θ − α ℓ ′ ( θ ) ℓ ′ ′ ( θ ) \theta := \theta - \alpha \frac{\ell^{\prime}(\theta)}{\ell^{\prime\prime}(\theta)} θ:=θα(θ)(θ)
θ \theta θ是向量时,牛顿法可以下面的等式表示:
θ : = θ − α H − 1 ∇ θ ℓ ( θ ) \theta := \theta - \alpha H^{-1} \nabla_{\theta}\ell(\theta) θ:=θαH1θ(θ)
其中 H H H称为Hessian矩阵,其实就是目标函数对参数 θ \theta θ的二阶导数。

  举例:使用牛顿迭代法求函数 y = c o s ( x ) y = cos(x) y=cos(x)在区间 x ∈ [ 0 , 2 π ] x \in [0,2\pi] x[0,2π]的极小值点。

import numpy as np
import matplotlib.pyplot as plt
import random

#y = cos(x)
def f(x):
    return np.cos(x)

#一阶导   
def qiudao_1(x):
    return -np.sin(x)

#二阶导
def qiudao_2(x):
    return -np.cos(x)

#画图
xs = np.linspace(0, 2*np.pi, 100)
plt.plot(xs, f(xs))


learning_rate = 0.1
max_loop = 1000 #迭代次数

#随机选取初始值
start = random.uniform(0, 2 * np.pi)
x = start
x_list = [] #记录牛顿迭代过程

for i in range(max_loop):
    grad = qiudao_1(x) #求梯度——求一阶导
    hessian = qiudao_2(x)      #求海森矩阵——求二阶导
    x = x - learning_rate * (grad / hessian) #梯度下降法找到下一个点
    x_list.append(x)

#画图
x_list = np.array(x_list)
plt.scatter(x_list, f(x_list), c = "r")
plt.show()

print("initial x = ", start)
print("arg min f(x) of x = ", x)
print("f(x) = ", f(x))

输出结果:
![牛顿法](https://img-blog.csdnimg.cn/20210114095642256.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDgwNzcxNA==,size_16,color_FFFFFF,t_70

  • initial x = 4.351193487874113
  • arg min f(x) of x = 3.1415926535897953
  • f(x) = -1.0

牛顿迭代法与梯度下降法比较

牛顿迭代法梯度下降法
优点

①通过求解目标函数的一阶导数为0时的参数,进而求出目标函数最小值时的参数。实际上,通过迭代过程图和推导公式可知,牛顿迭代法与二阶导数息息相关,这就使得牛顿法的收敛速度很快。
②Hessian矩阵的逆矩阵在迭代过程中不断减小,可以起到逐步减小步长的作用。

通过梯度方向和步长,直接求解目标函数的最小值时候的参数。

缺点

Hessian矩阵的逆运算复杂,代价比较大,因此有了拟牛顿法。

越接近最优值时,步长应不断减小,否则会在最优值附近来回震荡

参考

最优化理论之负梯度方法与Newton型方法——知乎
统计学习方法·李航
机器学习——李宏毅
偏导数定义——知乎
方向导数和梯度的理解
梯度向量、Jacobian矩阵、Hessian矩阵

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值