之前讨论了如何计算标量函数的梯度 (gradient), 下面讨论矩阵梯度 (derivative) 的 计算过程. 这是深度学习链式法则计算梯度的基础.
在单变量复合函数计算梯度时, 梯度的计算只有一条路径, 不同的部分直接连接即可. 如下例中:
$$ y=x^2, z=\log(y) $$
计算 $\pd{z}{x}$ 只需要将两个函数的梯度串连.
$$ \frac{\partial z}{\partial x}= \frac{\partial z}{\partial y}\frac{\partial y}{\partial x}=\frac{1}{y}\cdot{2x} $$
而矩阵运算的求导, 输入是多变量, 输出也是多变量. 在梯度传播时, 对某一个变量, 可能有多条路径对其产生影响, 所以此时的 derivative 计算需要明确
- 计算的是哪个输出变量的梯度
- 相对于哪个输入变量.
如果是向量函数, 即输入输出均为向量, 函数的 derivative 为 Jacobin Matrix.
Jacobin Matrix
Jacobin Matirx 是向量函数所有的一阶偏微分组成的矩阵. 数学定义如下:
假设 $\mathbf{f}: \mathbb{R}^n \rightarrow \mathbb{R}^m$ 是以向量 $\mathbf{x} \in \mathbb{R}^n$ 作为输入, 输出 $\mathbf{f}(\mathbf{x}) \in \mathbb{R}^m$ 的向量函数, 则 $\mathbf{f}$ 的 Jacobin 矩阵 大小为 $m \times n$, 可按如下形式排列:
$$ \mathbf{J}= \left[ \frac{\partial \mathbf{f}}{\partial x_1} \ldots \frac{\partial \mathbf{f}}{\partial x_n} \right]= \left[ \begin{array}{ccc} \frac{\partial f_1}{\partial x_1} & \ldots & \frac{\partial f_1}{\partial x_n} \ \vdots & \ddots & \vdots \ \frac{\partial f_m}{\partial x_1} & \ldots & \frac{\partial f_m}{\partial x_n} \ \end{array} \right] $$
Basic operation
下面列举一些在计算 derivative 时通用的规则.
$$ \begin{align} \partial{\mathbf{A}} &= 0 \quad (\mathbf{A} \text{ is a constant}) \ \partial{(\alpha\mathbf{A})} &= \alpha\partial{\mathbf{A}} \ \partial{(\mathbf{X}\mathbf{Y})} &= (\partial{\mathbf{X}})\mathbf{Y}+ \mathbf{X}(\partial{\mathbf{Y}}) \ \partial{\mathbf{A}^T} & =(\partial{\mathbf{A}})^T \end{align} $$
Example
l2 normalization
$$ \mathbf{y}=\frac{\mathbf{x}}{|\mathbf{x}|^2} $$
$$ \frac{\partial \mathbf{y}}{\partial \mathbf{x}}= \mathbf{x}\frac{\partial |\mathbf{x}|_2^{-1}}{\partial \mathbf{x}}+ |\mathbf{x}|_2^{-1}\frac{\partial \mathbf{x}}{\partial \mathbf{x}} $$
softmax function
$$ S_j=\frac{e^{a_j}}{\sum_{k=1}^{N}e^{a_k}} \quad \forall j \in 1..N $$
参考文献:
http://eli.thegreenplace.net/2016/the-softmax-function-and-its-derivative/