【数学】矩阵乘法的求导

引子

最近我在用C语言手写一个机器学习库,涉及到了矩阵乘法的反向传播过程。发现网络上并没有非常好的矩阵乘法求导的资料,这里简单地记录一下。

标记

假设$\mathbf{A},\mathbf{B}$分别是一个\(m\)行\(n\)列的矩阵和一个\(n\)行\(p\)列的矩阵,那么我们有:

其中:

$$
\mathbf{Y}=\begin{bmatrix}
y_{11} & y_{12} & \cdots & y_{1p}\\
\cdots & \cdots & \cdots & \cdots\\
y_{m1} & y_{m2} & \cdots & y_{mp}\\
\end{bmatrix}
$$

$$
\mathbf{A}=\begin{bmatrix}
a_{11} & a_{12} & \cdots & a_{1n}\\
\cdots & \cdots & \cdots & \cdots\\
a_{m1} & a_{m2} & \cdots & a_{mn}\\
\end{bmatrix}
$$

$$
\mathbf{B}=\begin{bmatrix}
b_{11} & b_{12} & \cdots & b_{1p}\\
\cdots & \cdots & \cdots & \cdots\\
b_{n1} & b_{n2} & \cdots & b_{np}\\
\end{bmatrix}
$$

推导

根据矩阵乘法的定义我们知道:
$$
y_{ij}=\sum_{k=1}^{n}a_{ik}b_{kj}, i\in [1,m],j\in [1,p]
$$
其中,\(i,j,k\)为整数,那么我们有:
$$
\frac{\partial y_{ij}}{\partial a_{st}} = b_{tj}\ \text{if}\ s=i\ \text{otherwise}\ 0
$$

$$
\frac{\partial y_{ij}}{\partial b_{st}} = a_{is}\ \text{if}\ s = i\ \text{otherwise}\ 0
$$

如果应用科罗涅克delta函数进行表示:
$$
\frac{\partial y_{ij}}{\partial a_{st}} = b_{tj}\delta_{is}
$$

$$
\frac{\partial y_{ij}}{\partial b_{st}} = a_{is}\delta_{is}
$$

根据偏导数的加法规则以及链式法则:
$$
\frac{\partial \mathbf{Y}}{\partial a_{st}} = \sum_{i=1}^m\sum_{j=1}^p\frac{\partial \mathbf{Y}}{\partial y_{ij}}\frac{\partial y_{ij}}{\partial a_{st}}=\sum_{i=1}^m\sum_{j=1}^p \frac{\partial \mathbf{Y}}{\partial y_{ij}} b_{tj}\delta_{is}
$$
由于当\(i\neq s\)的时候,\(\delta_{is}=0\),故上式可变为更简单的形式:
$$
\frac{\partial \mathbf{Y}}{\partial a_{st}}=\sum_{j=1}^p \frac{\partial \mathbf{Y}}{\partial y_{sj}} b_{tj}
$$
这是这样一个矩阵:
$$
\frac{\partial \mathbf{Y}}{\partial a_{st}} = \begin{bmatrix}
0 & 0 & \cdots & 0\\
\cdots & \cdots & \cdots & \cdots\\
b_{t1} & b_{t2} & \cdots & b_{tp}\\
\cdots & \cdots & \cdots & \cdots\\
0 & 0 & \cdots & 0\\
\end{bmatrix}
$$
非0的行为第s行。那么\(\frac{\partial \mathbf{Y}}{\partial \mathbf{A}}\)也就很显然了,是一个矩阵的矩阵,也是一个高阶张量。

实际应用

那么这就衍生出来一个问题,在实际的反向传播过程中,每一个元素的梯度通常是一个标量,而不会是一个矩阵,我们该如何设计机器学习的反向传播过程呢?

其实,在手写机器学习库的过程中,我们所需要的并不是$\frac{\partial \mathbf{Y}}{\partial \mathbf{A}}$,而是$\frac{\partial L}{\partial \mathbf{A}}$,这里$L$是损失函数,是标量。

对于任意一层的矩阵来说,每一个元素的梯度实际上是下面的式子:

$$
\frac{\partial L}{\partial a_{st}} =\sum_{j=1}^p \frac{\partial L}{\partial y_{sj}} b_{tj}
$$

其中,$\frac{\partial L}{\partial y_{sj}}$是来自前面一层的梯度矩阵的某个元素,这里蕴含的公式是:

那么,上面的“每一个元素梯度”的式子其实就是一个矩阵的乘法,也就是说:

$$
\frac{\partial L}{\partial \mathbf{A}} =\frac{\partial L}{\partial \mathbf{Y}}\mathbf{B}^T
$$

类似的,我们有:

$$
\frac{\partial L}{\partial \mathbf{B}} =\mathbf{A}^T\frac{\partial L}{\partial \mathbf{Y}}
$$

最后这两个式子,是我们需要用在机器学习库中的式子。

文章作者:
文章链接: https://www.coderlock.site/2025/07/09/【数学】矩阵乘法的求导/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 寒夜雨