一. 导数和微分

在深度学习中,对于每个参数, 如果我们把这个参数增加或减少一个无穷小的量,我们可以知道损失会以多快的速度增加或减少。
定义 u=f(x)=3x^2−4x

import numpy as np
import matplotlib.pyplot as plt

def f(x):
    return 3 * x ** 2 - 4 * x

计算观察x=1处的导数

def numerical_lim(f, x, h):
    return (f(x + h) - f(x)) / h

h = 0.1
for i in range(5):
    print(f'h={h:.5f}, numerical limit={numerical_lim(f, 1, h):.5f}')
    h *= 0.1
h=0.10000, numerical limit=2.30000
h=0.01000, numerical limit=2.03000
h=0.00100, numerical limit=2.00300
h=0.00010, numerical limit=2.00030
h=0.00001, numerical limit=2.00003

给定 y=f(x) ,其中 x 和 y 分别是函数 f 的自变量和因变量。以下表达式是等价的:
f ′ ( x ) = y ′ = d y d x = d f d x = d d x f ( x ) = D f ( x ) = D x f ( x ) f^{\prime}(x)=y^{\prime}=\frac{d y}{d x}=\frac{d f}{d x}=\frac{d}{d x} f(x)=D f(x)=D_{x} f(x) f(x)=y=dxdy=dxdf=dxdf(x)=Df(x)=Dxf(x)
为了微分一个由一些简单函数(如上面的常见函数)组成的函数,下面的法则使用起来很方便。 假设函数 f 和 g 都是可微的, C 是一个常数,我们有:
常数相乘法则
d d x [ C f ( x ) ] = C d d x f ( x ) \frac{d}{d x}[C f(x)]=C \frac{d}{d x} f(x) dxd[Cf(x)]=Cdxdf(x)
加法法则
d d x [ f ( x ) + g ( x ) ] = d d x f ( x ) + d d x g ( x ) \frac{d}{d x}[f(x)+g(x)]=\frac{d}{d x} f(x)+\frac{d}{d x} g(x) dxd[f(x)+g(x)]=dxdf(x)+dxdg(x)
乘法法则
d d x [ f ( x ) g ( x ) ] = f ( x ) d d x [ g ( x ) ] + g ( x ) d d x [ f ( x ) ] , \frac{d}{d x}[f(x) g(x)]=f(x) \frac{d}{d x}[g(x)]+g(x) \frac{d}{d x}[f(x)], dxd[f(x)g(x)]=f(x)dxd[g(x)]+g(x)dxd[f(x)],
除法法则
d d x [ f ( x ) g ( x ) ] = g ( x ) d d x [ f ( x ) ] − f ( x ) d d x [ g ( x ) ] [ g ( x ) ] 2 \frac{d}{d x}\left[\frac{f(x)}{g(x)}\right]=\frac{g(x) \frac{d}{d x}[f(x)]-f(x) \frac{d}{d x}[g(x)]}{[g(x)]^{2}} dxd[g(x)f(x)]=[g(x)]2g(x)dxd[f(x)]f(x)dxd[g(x)]
我们可以绘制函数 u=f(x) 及其在 x=1 处的切线 y=2x−3 ,其中系数 2 是切线的斜率。

x = np.arange(0, 3, 0.1)
y1 = f(x)
y2 = 2*x-3 #切线
plt.grid() #网格线
plt.xlabel('x') 
plt.ylabel('f(x)')
plt.plot(x, y1, label = 'f(x)')
plt.plot(x, y2, label = 'Tangent line (x=1)')
plt.legend(loc="upper left")

在这里插入图片描述

二. 偏导数

函数通常依赖于许多变量。因此,我们需要将微分的思想推广到这些多元函数(multivariate function)上。
设 y=f(x1,x2,…,xn) 是一个具有 n 个变量的函数。 y 关于第 i 个参数 xi 的偏导数(partial derivative)为:
∂ y ∂ x i = lim ⁡ h → 0 f ( x 1 , … , x i − 1 , x i + h , x i + 1 , … , x n ) − f ( x 1 , … , x i , … , x n ) h \frac{\partial y}{\partial x_{i}}=\lim _{h \rightarrow 0} \frac{f\left(x_{1}, \ldots, x_{i-1}, x_{i}+h, x_{i+1}, \ldots, x_{n}\right)-f\left(x_{1}, \ldots, x_{i}, \ldots, x_{n}\right)}{h} xiy=h0limhf(x1,,xi1,xi+h,xi+1,,xn)f(x1,,xi,,xn)
对于偏导数的表示,以下是等价的:
∂ y ∂ x i = ∂ f ∂ x i = f x i = f i = D i f = D x i f \frac{\partial y}{\partial x_{i}}=\frac{\partial f}{\partial x_{i}}=f_{x_{i}}=f_{i}=D_{i} f=D_{x_{i}} f xiy=xif=fxi=fi=Dif=Dxif

三. 梯度

连结一个多元函数对其所有变量的偏导数,以得到该函数的梯度(gradient)向量。函数 f(x) 相对于 x 的梯度是一个包含 n 个偏导数的向量:
∇ x f ( x ) = [ ∂ f ( x ) ∂ x 1 , ∂ f ( x ) ∂ x 2 , … , ∂ f ( x ) ∂ x n ] ⊤ \nabla_{\mathbf{x}} f(\mathbf{x})=\left[\frac{\partial f(\mathbf{x})}{\partial x_{1}}, \frac{\partial f(\mathbf{x})}{\partial x_{2}}, \ldots, \frac{\partial f(\mathbf{x})}{\partial x_{n}}\right]^{\top} xf(x)=[x1f(x),x2f(x),,xnf(x)]
其中 ∇xf(x) 通常在没有歧义时被 ∇f(x) 取代

  • 对于所有 A ∈ R m × n \mathbf{A} \in \mathbb{R}^{m \times n} ARm×n, 都有 ∇ x A x = A ⊤ \nabla_{\mathbf{x}} \mathbf{A} \mathbf{x}=\mathbf{A}^{\top} xAx=A
  • 对于所有 A ∈ R n × m \mathbf{A} \in \mathbb{R}^{n \times m} ARn×m, 都有 ∇ x x ⊤ A = A \nabla_{\mathbf{x}} \mathbf{x}^{\top} \mathbf{A}=\mathbf{A} xxA=A
  • 对于所有 A ∈ R n × n \mathbf{A} \in \mathbb{R}^{n \times n} ARn×n, 都有 ∇ x x ⊤ A x = ( A + A ⊤ ) x \nabla_{\mathbf{x}} \mathbf{x}^{\top} \mathbf{A} \mathbf{x}=\left(\mathbf{A}+\mathbf{A}^{\top}\right) \mathbf{x} xxAx=(A+A)x
  • ∇ x ∥ x ∥ 2 = ∇ x x ⊤ x = 2 x \nabla_{\mathbf{x}}\|\mathbf{x}\|^{2}=\nabla_{\mathbf{x}} \mathbf{x}^{\top} \mathbf{x}=2 \mathbf{x} xx2=xxx=2x

同样,对于任何矩阵 X \mathbf{X} X, 我们都有 ∇ X ∥ X ∥ F 2 = 2 X \nabla_{\mathbf{X}}\|\mathbf{X}\|_{F}^{2}=2 \mathbf{X} XXF2=2X 。正如我们之后将看到的,梯度对 于设计深度学习中的优化算法有很大用处。

三. 链式法则

然而,上面方法可能很难找到梯度。 这是因为在深度学习中,多元函数通常是复合(composite)的,所以我们可能没法应用上述任何规则来微分这些函数。 幸运的是,链式法则使我们能够微分复合函数。
d y d x = d y d u d u d x \frac{d y}{d x}=\frac{d y}{d u} \frac{d u}{d x} dxdy=dudydxdu
假设可微分函数 y 有变量 u1,u2,…,um ,其中每个可微分函数 ui 都有变量 x1,x2,…,xn 。注意, y 是 x1,x2,…,xn 的函数。对于任意 i=1,2,…,n ,链式法则给出:
d y d x i = d y d u 1 d u 1 d x i + d y d u 2 d u 2 d x i + ⋯ + d y d u m d u m d x i \frac{d y}{d x_{i}}=\frac{d y}{d u_{1}} \frac{d u_{1}}{d x_{i}}+\frac{d y}{d u_{2}} \frac{d u_{2}}{d x_{i}}+\cdots+\frac{d y}{d u_{m}} \frac{d u_{m}}{d x_{i}} dxidy=du1dydxidu1+du2dydxidu2++dumdydxidum

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐