新生任务-3
一、为什么机器学习中需要矩阵求导
这是一个非常自然的过程. 算法中需要数据喂进去, 对于数据来说可以用向量或者是矩阵来表示.
机器学习就是对优化算法围绕讨论. 本质上就是一个方程, 使用向量或者矩阵能够使得运算速度更快. 例如在使用 numpy 库计算向量之间内积的时候能体现出和使用循环计算内积方式的速度差距.
求导是为了获取到损失函数的变换趋势, 以便于对算法优化过程进行迭代处理.
二、向量函数
1. 标量函数
\[ f_1(x) = x^2 \quad \underset{x}{R} \longrightarrow \underset{x^2}{R} \]
函数 \(f_1(x)\) 输入是 \(x\), 输出是 \(x^2\), 输入输出都是一个数.
\[ f_2(x) = x_1^2 + x_2^2 \quad \underset{\begin{bmatrix}x_1\\x_2\end{bmatrix}}{R} \longrightarrow \underset{x_1^2 + x_2^2}{R} \]
函数 \(f_2(x)\) 输入是 \(\begin{bmatrix}x_1\\x_2\end{bmatrix}\) 这样一个向量, 输出是 \(x_1^2 + x_2^2\) 这样一个值.
所以把输出为标量的函数就叫做标量函数.
2. 向量函数
\[ f(x) = \begin{bmatrix}f_1(x)=x\\f_2(x)=x^2\end{bmatrix} \quad \underset{x}{R} \longrightarrow \underset{\begin{bmatrix}x\\x^2\end{bmatrix}}{R} \]
这样在函数中输入的是标量, 但是输出却为向量. 同样的还有这样的函数
\[ f(x) = \begin{bmatrix}f_{11}(x)=x_1 + x_2& f_{12}(x) = x_1^2+x_2^2\\f_{21}(x)=x_1^3+x_2^3& f_{22}(x) = x_1^4+x_2^4\end{bmatrix} \quad \underset{\begin{bmatrix}x_1\\x_2\end{bmatrix}}{R} \longrightarrow \underset{\begin{bmatrix}x_1 + x_2& x_1^2+x_2^2\\x_1^3+x_2^3& x_1^4+x_2^4\end{bmatrix}}{R} \]
输入是一个 2 维向量, 输出是 \(2 \times 2\) 的矩阵.
那么我们现在就有这样的东西
\[ \begin{aligned} \mathrm{Input} \longrightarrow 标量,向量\\ \mathrm{Output} \longrightarrow 标量,向量 \end{aligned} \]
输入和输出的组合, 一共就有 4 种方式.
三、矩阵求导
1. 矩阵求导本质
现有矩阵 \(A\) 和矩阵 \(B\), 那么矩阵求导式子 \(\frac{dA}{dB}\) 就是让矩阵 \(A\) 中的每一个元素对矩阵 \(B\) 中的每一个元素进行求导.
从求导后的个数就能有一个较为清晰的判断, 括号中为矩阵中元素个数
\[ A (1 \times 1) \quad B (1 \times 1) \quad \frac{dA}{dB}(1 \times 1) \]
\[ A (1 \times p) \quad B (1 \times n) \quad \frac{dA}{dB}(p \times n) \]
\[ A (1 \times p) \quad B (m \times n) \quad \frac{dA}{dB}(p \times q \times m \times n) \]
2. 矩阵求导技巧
需要记住两点技巧, 一是标量不变, 向量拉伸; 二是前面横向拉, 后面纵向拉. 下面举几个例子来感受一下.
例 1 : \(f(x)\) 为标量函数, \(x = [x_1,x_2,\cdots,x_n]^{\mathrm{T}}\) 为向量, 求 \(f(x)\) 关于 \(x\) 的导数.
\[ f(x) = f(x_1,x_2,\cdots,x_n) \]
那么就有
\[ \frac{df(x)}{dx} = \begin{bmatrix} \frac{\partial f(x)}{\partial x_1}\\ \frac{\partial f(x)}{\partial x_2}\\ \vdots\\ \frac{\partial f(x)}{\partial x_n}\\ \end{bmatrix} \]
因为 \(f(x)\) 是标量, 所以在求导中不变, 而 \(x\) 是向量, 所以求导中要变, 但是 \(x\) 是在后面, 所以就出现纵向拉伸, 换而言之拉伸的过程就是多元函数求导的过程.
例 2 : \(f(x)= \begin{bmatrix}f_1(x)\\f_2(x)\\ \vdots\\f_n(x)\end{bmatrix}\) 为向量函数, \(x\) 为标量, 求 \(f(x)\) 关于 \(x\) 的导数.
\[ \frac{df(x)}{dx} = \Bigg [ \frac{\partial f_1(x)}{\partial x}, \frac{\partial f_2(x)}{\partial x},\cdots, \frac{\partial f_n(x)}{\partial x} \Bigg ] \]
因为 \(x\) 是标量, 所以在求导中不变, 而 \(f(x)\) 是向量, 所以求导中要变, 但是 \(f(x)\) 是在前面, 所以就出现横向拉伸, 换而言之拉伸的过程就是不同函数对同一变量求导的过程.
例 3 : \(f(x)= \begin{bmatrix}f_1(x)\\f_2(x)\\ \vdots\\f_n(x)\end{bmatrix}\) 为向量函数, \(x = [x_1,x_2,\cdots,x_n]^{\mathrm{T}}\) 为向量, 求 \(f(x)\) 关于 \(x\) 的导数.
这个就是前两个例子的结合, 出现了横向和纵向的拉伸.
\[ \frac{df(x)}{dx} = \begin{bmatrix} \frac{\partial f_1(x)}{\partial x_1}& \frac{\partial f_2(x)}{\partial x_1}& \cdots& \frac{\partial f_n(x)}{\partial x_1}\\ \frac{\partial f_1(x)}{\partial x_2}& \frac{\partial f_2(x)}{\partial x_2}& \cdots& \frac{\partial f_n(x)}{\partial x_2}\\ \cdots& \cdots& \cdots & \cdots\\ \frac{\partial f_1(x)}{\partial x_n}& \frac{\partial f_2(x)}{\partial x_n}& \cdots&\frac{\partial f_n(x)}{\partial x_n} \end{bmatrix} \]
3. 常见公式推导
例 1 : \(f(x) = A^{\mathrm{T}}X\), 其中 \(A=\begin{bmatrix}a_1\\a_2\\ \vdots\\a_n\end{bmatrix}\), \(X=\begin{bmatrix}x_1\\x_2\\ \vdots\\x_n\end{bmatrix}\), 求 \(f(x)\) 关于 \(x\) 的导数.
首先就是把 \(f(x)\) 求出来, 这一看都知道 \(f(x)\) 是个标量函数.
\[ f(x) = A^{\mathrm{T}}X = \sum_{i=1}^{n}a_ix_i \]
那么就有
\[ \frac{df(x)}{dx} = \begin{bmatrix} \frac{\partial f(x)}{\partial x_1}\\ \frac{\partial f(x)}{\partial x_2}\\ \vdots \\ \frac{\partial f(x)}{\partial x_n} \end{bmatrix} \]
然后拿出 \(\frac{\partial f(x)}{\partial x_1}\) 来看有
\[ \frac{\partial (a_1x_1 + a_2x_2 + \cdots + a_nx_n)}{\partial x_1} = a_1 \]
所以就有
\[ \frac{df(x)}{dx} = \begin{bmatrix} a_1\\ a_n\\ \vdots \\ a_n \end{bmatrix} = A \]
这里又不难得出 \(A^{\mathrm{T}}X = X^{\mathrm{T}}A\), 故 \(f(x)=A^{\mathrm{T}}X=X^{\mathrm{T}}A\), 所以就有
\[ \frac{dA^{\mathrm{T}}X}{dx} = \frac{dX^{\mathrm{T}}A}{dx} = A \]
例 2 : \(f(x) = X^{\mathrm{T}}AX\), 其中 \(X=\begin{bmatrix}x_1\\x_2\\ \vdots\\x_n\end{bmatrix}\) \(A=\begin{bmatrix}a_{11} & a_{12}& \cdots& a_{1n}\\a_{21} & a_{22}& \cdots& a_{2n}\\ \vdots & \vdots& \cdots& \vdots\\a_{n1} & a_{n2}& \cdots& a_{nn}\end{bmatrix}\), 求 \(f(x)\) 关于 \(x\) 的导数.
首先可以看出结果是一个标量, 展开来看有
\[ f(x) = [x_1,x_2,\cdots,x_n]\begin{bmatrix} a_{11} & a_{12}& \cdots& a_{1n}\\ a_{21} & a_{22}& \cdots& a_{2n}\\ \vdots & \vdots& \cdots& \vdots\\ a_{n1} & a_{n2}& \cdots& a_{nn} \end{bmatrix}\begin{bmatrix} x_1\\ x_2\\ \vdots\\ x_n \end{bmatrix} \]
用表达式表示
\[ f(x) = \sum_{i=1}^{n} \sum_{j=1}^{n}a_{ij}x_ix_j \]
那么就有
\[ \begin{aligned} \frac{df(x)}{dx} &= \begin{bmatrix} \frac{\partial f(x)}{\partial x_1}\\ \frac{\partial f(x)}{\partial x_2}\\ \vdots \\ \frac{\partial f(x)}{\partial x_n} \end{bmatrix} = \begin{bmatrix} \sum_{j=1}^{n}a_{1j}x_j + \sum_{i=1}^{n}a_{i1}x_i\\ \sum_{j=1}^{n}a_{2j}x_j + \sum_{i=1}^{n}a_{i2}x_i\\ \vdots \\ \sum_{j=1}^{n}a_{nj}x_j + \sum_{i=1}^{n}a_{in}x_i \end{bmatrix} \\ &= \begin{bmatrix} \sum_{j=1}^{n}a_{1j}x_j\\ \sum_{j=1}^{n}a_{2j}x_j\\ \vdots \\ \sum_{j=1}^{n}a_{nj}x_j \end{bmatrix} + \begin{bmatrix} \sum_{i=1}^{n}a_{i1}x_i\\ \sum_{i=1}^{n}a_{i2}x_i\\ \vdots \\ \sum_{i=1}^{n}a_{in}x_i \end{bmatrix} \\ &= \begin{bmatrix} a_{11} & a_{12} & \cdots & a_{1n}\\ a_{21} & a_{22} & \cdots & a_{2n}\\ \vdots & \vdots & \cdots & \vdots\\ a_{n1} & a_{n2} & \cdots & a_{nn} \end{bmatrix}\begin{bmatrix} x_1\\ x_2\\ \vdots \\ x_n \end{bmatrix} + \begin{bmatrix} a_{11} & a_{21} & \cdots & a_{n1}\\ a_{12} & a_{22} & \cdots & a_{n2}\\ \vdots & \vdots & \cdots & \vdots\\ a_{1n} & a_{2n} & \cdots & a_{nn} \end{bmatrix}\begin{bmatrix} x_1\\ x_2\\ \vdots \\ x_n \end{bmatrix} \\ &= AX + A^{\mathrm{T}}X \end{aligned} \]
所以就有
\[ \frac{df(x)}{dx} = \frac{dX^{\mathrm{T}}AX}{dx} = (A+A^{\mathrm{T}})X \]
其实复杂程度也就如此, 了解了本质就知道如何正确求导.
更多公式推导参见知乎 : 矩阵求导公式的数学推导(矩阵求导——基础篇)