libtorch学习笔记(15)- 方向导数和梯度的推导

几个基本数学概念

  • 线性近似(linear approximation):又称线性逼近,在数学中,线性近似是指使用线性函数对一般函数进行近似处理的方法。线性近似就是用线性函数对普通函数进行近似。这个线性函数称为仿射函数。
  • 梯度向量(gradient vector):一个标量函数的偏导数矩阵, f : R n → R ( c o n f u s e d ? ) f:\bold R^n \to \bold R(\color{red}{confused?)} f:RnR(confused?),是一个 1 × n 1 \times n 1×n行矩阵:
    D f ( x ) = [ ∂ f ∂ x 1 ( x ) ∂ f ∂ x 2 ( x ) ∂ f ∂ x 3 ( x ) ⋅ ⋅ ⋅ ∂ f ∂ x n ( x ) ] Df(\bold x) = \begin{bmatrix} {{\bold ∂f}\over{\bold ∂x1}}\small \mathrm {(x)} \normalsize \enspace {{\bold ∂f}\over{\bold ∂x2}}\small \mathrm {(x)} \normalsize \enspace {{\bold ∂f}\over{\bold ∂x3}}\small \mathrm {(x)} \normalsize \cdot\cdot\cdot {{\bold ∂f}\over{\bold ∂xn}}\small \mathrm {(x)} \normalsize\end{bmatrix} Df(x)=[x1f(x)x2f(x)x3f(x)xnf(x)]
    通常我们不能将一个一行的矩阵看作一个向量,但是在这里我们还是将它看作一个向量,便于后面处理
    ∇ f ( x ) = ( ∂ f ∂ x 1 ( x ) ∂ f ∂ x 2 ( x ) ∂ f ∂ x 3 ( x ) ⋅ ⋅ ⋅ ∂ f ∂ x n ( x ) ) \nabla f(\bold x) = \begin{pmatrix} {{\bold ∂f}\over{\bold ∂x1}}\small \mathrm {(x)} \normalsize \enspace {{\bold ∂f}\over{\bold ∂x2}}\small \mathrm {(x)} \normalsize \enspace {{\bold ∂f}\over{\bold ∂x3}}\small \mathrm {(x)} \normalsize \cdot\cdot\cdot {{\bold ∂f}\over{\bold ∂xn}}\small \mathrm {(x)} \normalsize\end{pmatrix} f(x)=(x1f(x)x2f(x)x3f(x)xnf(x))

方向导数、方向向量和梯度的关系推导

在上文中展示了方向导数背后的概念。要点是,给定一个多变量的标量值函数 f : R n → R ( c o n f u s e d ? ) f:\bold R^n \to \bold R(\color{red}{confused?)} f:RnR(confused?)

  1. 方向导数 D u f D_uf Duf是在任意给定单位向量 u \bold u uf斜率的偏微分统一形式。
  2. 梯度 ∇ f \nabla f f是最大向上斜率对应方向上的一个向量,并且它的长度方向导数在这个方向上的长度
  3. 方向导数是梯度和单位向量点乘结果: D u f = ∇ f ⋅ u D_uf = \nabla f \cdot \bold u Duf=fu

这个介绍缺少一个重要的信息:梯度的切确含义是什么?怎样从f计算出它?实际上计算梯度还是相当简单的,当然你得知道一个函数可导意味着什么。

在点 x = a \bold x= \bold a x=a一个函数 f ( x ) f(\bold x) f(x)可导意味着什么?这个函数在一个极小区间基本上线性得,这是微积分得基本概念,比如这里必须可以线性逼近。
L ( x ) = f ( a ) + D f ( a ) ( x − a ) L(\bold x) = f(\bold a) + Df(\bold a)(\bold x-\bold a) L(x)=f(a)+Df(a)(xa)
对于所有靠近 a \bold a a x \bold x x,这个值与 f ( x ) f(\bold x) f(x)非常近似。可导的定义意味着,对所有从 a \bold a a出发的方向, f ( x ) f(\bold x) f(x) L ( x ) L(\bold x) L(x)有相同的斜率。这样我们就可以用 L L L来代替 f f f来计算在 x \bold x x点上f的方向导数。

使用方向导数的定义,我们能计算沿着 u \bold u u方向,在 a \bold a a f f f的方向导数:
D u f ( a ) = D u L ( a ) = lim ⁡ h → 0 L ( a + h u ) − L ( a ) h = lim ⁡ h → 0 f ( a ) + D f ( a ) ( a + h u − a ) − ( f ( a ) + D f ( a ) ( a − a ) ) h = lim ⁡ h → 0 D f ( a ) ( h u ) h = lim ⁡ h → 0 D f ( a ) u = D f ( a ) u \begin{aligned} D_uf(\bold a) &= D_uL(\bold a) = \lim_{\mathclap{h\to0}} {{L(\bold a+h\bold u) - L(\bold a)} \over {h}}\\ &= \lim_{\mathclap{h\to0}} {{f(\bold a) + Df(\bold a)({\bold a + h\bold u - \bold a}) - (f(\bold a) + Df(\bold a)(\bold a-\bold a))} \over {h}}\\ &= \lim_{\mathclap{h\to0}} {{Df(\bold a)({h\bold u}) } \over {h}} = \lim_{\mathclap{h\to0}} {{Df(\bold a){\bold u} } } = Df(\bold a)u \end{aligned} Duf(a)=DuL(a)=h0limhL(a+hu)L(a)=h0limhf(a)+Df(a)(a+hua)(f(a)+Df(a)(aa))=h0limhDf(a)(hu)=h0limDf(a)u=Df(a)u
因为 D f ( x ) Df(\bold x) Df(x)是一个 1 × n 1 \times n 1×n的行向量,并且u是一个 n × 1 n \times 1 n×1的列向量,它们相乘将会得到一个标量。我们也可以重写这个公式,把它表示两个向量的点乘形式。把 1 × n 1 \times n 1×n偏导数矩阵写成一个向量,并将其记录为 ∇ f \nabla f f,并将其称为梯度。我们可以得到方向导数:
D u f ( a ) = ∇ f ( a ) ⋅ u D_uf(\bold a) = \nabla f(\bold a) \cdot \bold u Duf(a)=f(a)u

你可能感兴趣的:(偏导数,导数,梯度,算法,线性代数,抽象代数)