标量求导
导数的定义:假设有一个函数$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$个结果。
求导秘术
- 标量不变,向量拉伸;
- 前面横向拉,后面纵向拉;
- 分母布局——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 / 提示
- 由上式可以看出,先对后面(X)进行了纵向拉伸,在对前面(Y)进行了横向拉伸。
- 同时也可以看出,一个$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 $$
讲解
矩阵的求导是真抽象啊?,参考学习链接:
- 【手推机器学习】矩阵求导--合集:https://www.bilibili.com/video/BV1xk4y1B7RQ/ ↩
- 【矩阵的导数运算】1\_标量向量方程对向量求导\_分母布局\_分子布局:https://www.bilibili.com/video/BV1av4y1b7MM/ ↩