标量求导

导数的定义:假设有一个函数$f:\mathbb{R} \rightarrow \mathbb{R}$,其输入输出都是标量。如果$f$的导数存在,那么这个极限被定义为:

$$ f’(x)= \lim_{h \to 0}\frac{f(x+h)-f(x)}{h} $$

来个代码演示下:

In [1]: def f(x):  # 定义一个函数
   ...:     return 3 * x ** 2 - 4 * x
   ...:

In [2]: def numerical_lim(f, x, h):  # 定义求导的计算方法
   ...:     return (f(x+h) - f(x)) / h
   ...:

In [3]: h = 0.1

In [4]: for i in range(5):  # 循环逐渐逼近求导
   ...:     print(f'h={h}, numerical limit={numerical_lim(f, 1, h, ):.5f}')
   ...:     h *= .1
   ...:
h=0.1, numerical limit=2.30000
h=0.010000000000000002, numerical limit=2.03000
h=0.0010000000000000002, numerical limit=2.00300
h=0.00010000000000000003, numerical limit=2.00030
h=1.0000000000000004e-05, numerical limit=2.00003

另$y=3x^2-4x$,所以$y'=6x-4$,即$y'(1)=6-4=2$。

常见导数

一元一次函数的求导:

$y$$a$$x^n$$a^x$$Inx$$sin(x)$
$\frac{dy}{dx}$0$nx^{n-1}$$(Ina)(a^x)$$\frac{1}{x}$$cos(x)$

$a$不是关于$x$的函数。

复合函数的求导:

$y$$u+v$$uv$$y=f(u), u=g(x)$
$\frac{dy}{dx}$$\frac{du}{dx} + \frac{dv}{dx}$$\frac{du}{dx}v + \frac{dv}{dx}u$$\frac{dy}{du}·\frac{du}{dx}$

导数拓展到向量与矩阵

可能出现的情况

Tips / 提示

没有特殊说明,本博文中提到的$x,y$都为标量,$\mathbf{x,y}$为一维Tensor——向量,$\mathbf{X,Y}$为二维Tensor——矩阵。

-$x$$\mathbf{x}$$\mathbf{X}$
$y$$\frac{\partial y}{\partial x}$$\frac{\partial y}{\partial \mathbf{x}}$$\frac{\partial y}{\partial \mathbf{X}}$
$\mathbf{y}$$\frac{\partial \mathbf{y}}{\partial x}$$\frac{\partial \mathbf{y}}{\partial \mathbf{x}}$$\frac{\partial \mathbf{y}}{\partial \mathbf{X}}$
$\mathbf{Y}$$\frac{\partial \mathbf{Y}}{\partial x}$$\frac{\partial \mathbf{Y}}{\partial \mathbf{x}}$$\frac{\partial \mathbf{Y}}{\partial \mathbf{X}}$

举个?

对于一个多元函数:

$$ f(x_1,x_2,x_3) = x_1^2+x_1x_2+x_2x_3 $$

可以将$f$对$x_1,x_2,x_3$的偏导数分别求出来,即:

$$ \begin{equation} \begin{cases} \frac{\partial f}{\partial x_1} = 2x_1+x_2 \\ \frac{\partial f}{\partial x_2} = x_1+x_3 \\ \frac{\partial f}{\partial x_3} = x_2 \end{cases} \end{equation} $$

所谓向量的求导,其实与多元函数的求导类似,只不过写成了向量的形式。

上式就可以理解为一个$f$关于向量$[x_1,x_2,x_3]^T$的函数:

$$ f([x_1,x_2,x_3]^T) = x_1^2+x_1x_2+x_2x_3 $$

对其进行求导的结果是:

$$ \frac{\partial f(\mathbf{x})}{\partial \mathbf{x}_{3×1}}= \left [ \begin{matrix} \frac{\partial f}{\partial x_1} \\ \frac{\partial f}{\partial x_2} \\ \frac{\partial f}{\partial x_3} \end{matrix} \right ] = \left [ \begin{matrix} 2x_1+x_2 \\ x_1+x_3 \\ x_2 \end{matrix} \right ] $$

上面这个形式就是一个标量$f$对一个向量求导的情况。

矩阵、向量的求导, 本质就是每个$f$分别对变元中的每个元素逐个求偏导,只不过写成了向量、矩阵形式而已。所以,如果function中有m个$f$,变元中有n个元素,那么每个$f$对变元中的每个元素逐个求偏导后,我们就会产生$m×n$个结果。

求导的各种情况
求导的各种情况

求导秘术

  1. 标量不变,向量拉伸;
  2. 前面横向拉,后面纵向拉;
  3. 分母布局——YX拉伸,分子布局——XY拉伸,通常$(分母布局)^T=(分子布局)$。

该方法来自Bilibili @GRNovmbrain1

例如,当$\mathbf{f}(\mathbf{x})$以及$\mathbf{x}_{n×1}$都为向量时:

$$ \mathbf{f}(\mathbf{x})= \left [ \begin{matrix} f_1(\mathbf{x}) \\ f_2(\mathbf{x}) \\ ... \\ f_n(\mathbf{x}) \end{matrix} \right ], \ \mathbf{x} = \left [ \begin{matrix} x_1 \\ x_2 \\ ... \\ x_n \end{matrix} \right ] $$

那么求导结果为:

$$ \frac{\partial \mathbf{f}(\mathbf{x})}{\partial \mathbf{x}}= \left [ \begin{matrix} \frac{\partial \mathbf{f}}{\partial x_1} \\ \frac{\partial \mathbf{f}}{\partial x_2} \\ \cdots \\ \frac{\partial \mathbf{f}}{\partial x_n} \end{matrix} \right ] = \left [ \begin{matrix} \frac{\partial f_1}{\partial x_1} & \frac{\partial f_2}{\partial x_1} & \cdots & \frac{\partial f_n}{\partial x_1} \\ \frac{\partial f_1}{\partial x_2} & \frac{\partial f_2}{\partial x_2} & \cdots & \frac{\partial f_n}{\partial x_2} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial f_1}{\partial x_n} & \frac{\partial f_2}{\partial x_n} & \cdots & \frac{\partial f_n}{\partial x_n} \end{matrix} \right ] $$

Tips / 提示
  1. 由上式可以看出,先对后面(X)进行了纵向拉伸,在对前面(Y)进行了横向拉伸。
  2. 同时也可以看出,一个$n×1$的向量对一个$n×1$的向量求导后,得到了一个$n×n$的矩阵。

导数拓展到矩阵

矩阵求导结果的布局

包括:分子布局或分母布局。

  • 分子布局:求导结果的维度以分子为主。拿标量对向量求导的例子来说,假如向量是一个行向量,那么求导结果是列向量,假如向量是一个列向量,那么求导结果是行向量。
  • 分母布局:求导结果的维度以分母为主。拿标量对向量求导的例子来说,假如向量是一个行向量,那么求导结果是行向量,假如向量是一个列向量,那么求导结果是列向量。

可见,分子布局和分母布局两者相差一个转置

分子布局,就是分子是列向量形式,分母是行向量形式:

$$ \frac{\partial f_{2×1}(\mathbf{x})}{\partial \mathbf{x}_{3×1}^T}= \left [ \begin{matrix} \frac{\partial f_1}{\partial x_1} & \frac{\partial f_1}{\partial x_2} & \frac{\partial f_1}{\partial x_3}\\ \frac{\partial f_2}{\partial x_1} & \frac{\partial f_2}{\partial x_2} & \frac{\partial f_2}{\partial x_3} \end{matrix} \right ]_{2×3} $$

分母布局,就是分母是列向量形式,分母是行向量形式:

$$ \frac{\partial f^T_{2×1}(\mathbf{x})}{\partial \mathbf{x}_{3×1}}= \left [ \begin{matrix} \frac{\partial f_1}{\partial x_1} & \frac{\partial f_2}{\partial x_1} \\ \frac{\partial f_1}{\partial x_2} & \frac{\partial f_2}{\partial x_2} \\ \frac{\partial f_1}{\partial x_3} & \frac{\partial f_2}{\partial x_3} \end{matrix} \right ]_{3×2} $$

Expand / 拓展

可以看出,$(分母布局)^T=(分子布局)$,且分子布局中求导后的结果行数与分子相同,分母布局中求导后的结果行数与分母相同。

举个?

设存在函数:

$$ f(\mathbf{x}), \ \mathbf{x}= \left [ \begin{matrix} x_1 \\ x_2 \\ \cdots \\ x_n \end{matrix} \right ]_{n×1} $$

求导可以得:

$$ \frac{\partial f(\mathbf{x})}{\partial \mathbf{x}}= \left [ \begin{matrix} \frac{\partial f}{\partial x_1}\\ \frac{\partial f}{\partial x_2}\\ \cdots \\ \frac{\partial f}{\partial x_n} \end{matrix} \right ]_{n×1} $$

因为$f(\mathbf{x})$为标量函数,所以行数为1,$\mathbf{x}$为$n×1$向量,求导的结果为$n×1$向量,求导后的结果与分母具有相同得行数,所以上述为分母布局。

求导方式也可以写为行向量形式:

$$ \frac{\partial f(\mathbf{x})}{\partial \mathbf{x}}= \left [ \begin{matrix} \frac{\partial f}{\partial x_1}, \ \frac{\partial f}{\partial x_2}, \ \cdots, \ \frac{\partial f}{\partial x_n} \end{matrix} \right ]_{1×n} $$

求导的结果为$1×n$向量,求导后的结果与分子具有相同得行数,所以上述为分母布局。

证明:$(分母布局)^T=(分子布局)$,另

$$ f(x_1, \ x_2)=x_1^2+x_2^2, \ \mathbf{x}= \left [ \begin{matrix} x_1\\ x_2 \end{matrix} \right ]_{2×1} $$

对应的分母布局为:

$$ \frac{\partial f(\mathbf{x})}{\partial \mathbf{x}}= \left [ \begin{matrix} \frac{\partial f}{\partial x_1}\\ \frac{\partial f}{\partial x_2} \end{matrix} \right ]_{2×1}= \left [ \begin{matrix} 2x_1\\ 2x_2 \end{matrix} \right ]_{2×1} $$

对应的分子布局为:

$$ \frac{\partial f(\mathbf{x})}{\partial \mathbf{x}}= \left [ \begin{matrix} \frac{\partial f}{\partial x_1}, \ \frac{\partial f}{\partial x_2} \end{matrix} \right ]_{1×2}= \left [ \begin{matrix} 2x_1, \ 2x_2 \end{matrix} \right ]_{1×2} = \left [ \begin{matrix} 2x_1\\ 2x_2 \end{matrix} \right ]_{2×1}^T $$

分母布局
分母布局

该方法来自Bilibili @DR_CAN2

梯度指向值变化最大的方向。

常用公式推导

1、如果存在$f(x)=A^T\mathbf{x}$,那么:

$$ \frac{\partial f}{\partial \mathbf{x}}=A^T $$

另:

$$ A= \left [ \begin{matrix} a_1 \\ a_2 \\ \cdots \\ a_n \end{matrix} \right ]_{n×1}, \ \mathbf{x}= \left [ \begin{matrix} x_1 \\ x_2 \\ \cdots \\ x_n \end{matrix} \right ]_{n×1}, \ $$

$f(x)=A^T\mathbf{x}$为一个标量:

$$ f(x) = A^T\mathbf{x} = \sum_{i=1}^{n}a_ix_i $$

所以,对其求导得:

$$ \frac{\partial f(\mathbf{x})}{\partial \mathbf{x}}= \left [ \begin{matrix} \frac{\partial f}{\partial \mathbf{x_1}} \\ \frac{\partial f}{\partial \mathbf{x_2}} \\ \cdots \\ \frac{\partial f}{\partial \mathbf{x_n}} \\ \end{matrix} \right ] = \left [ \begin{matrix} \frac{\partial (\sum_{n}^{i=1}a_ix_i)}{\partial \mathbf{x_1}} \\ \frac{\partial (\sum_{n}^{i=1}a_ix_i)}{\partial \mathbf{x_2}} \\ \cdots \\ \frac{\partial (\sum_{n}^{i=1}a_ix_i)}{\partial \mathbf{x_n}} \\ \end{matrix} \right ] = \left [ \begin{matrix} a_1 \\ a_2 \\ \cdots \\ a_n \end{matrix} \right ] = A $$

上面是分子布局的结果,如果是分母布局,结果应该为:

$$ \frac{\partial f(\mathbf{x})}{\partial \mathbf{x}}=A^T $$

由线性代数基本公式可以推导出:$A^T \mathbf{x}=\sum_{i=1}^{n} a_ix_i=\mathbf{x}^TA$,所以说对于$\mathbf{x}^TA$也适用于本结论。

2、如果存在$\mathbf{y}=A\mathbf{x}$,则:

$$ \frac{\partial \mathbf{y}}{\partial \mathbf{x}}=\frac{\partial (A\mathbf{x})}{\partial \mathbf{x}}=A $$

证明过程
证明过程

讲解

矩阵的求导是真抽象啊?,参考学习链接:

  1. 矩阵求导的本质与分子布局、分母布局的本质(矩阵求导——本质篇)
  2. 矩阵求导公式的数学推导(矩阵求导——基础篇)
  3. 矩阵求导公式的数学推导(矩阵求导——进阶篇)

  1. 【手推机器学习】矩阵求导--合集:https://www.bilibili.com/video/BV1xk4y1B7RQ/
  2. 【矩阵的导数运算】1_标量向量方程对向量求导_分母布局_分子布局:https://www.bilibili.com/video/BV1av4y1b7MM/