求向量$BAA^Tx$关于矩阵$A$的元素级导数
嘿,我来帮你搞定这个向量对矩阵的导数问题!咱们从基础到高效方法一步步拆解,保证讲清楚~
已知$A,B$是$n \times n$矩阵,$x$是$n$维列向量,定义$y = BAA^Tx$(这是一个$n$维列向量)。我们要求的是向量$y$关于矩阵$A$的导数——也就是$y$的每个元素$y_i$对$A$的每个元素$A_{jk}$的偏导数,最终会得到一个$n \times n \times n$的张量(或者按元素展开的形式)。
先写出$y$的第$i$个元素的展开式:
$$
y_i = \sum_{p=1}^n B_{ip} \cdot (AA^Tx)p
$$
再把$(AA^Tx)p$展开:
$$
(AA^Tx)p = \sum{q=1}^n A{pq} \cdot (A^Tx)q = \sum{q,r=1}^n A{pq}A_{rq}x_r
$$
代入$y_i$的表达式,得到:
$$
y_i = \sum_{p,q,r=1}^n B_{ip}A_{pq}A_{rq}x_r
$$
现在对$A_{jk}$求偏导,我们只需要找出展开式中所有包含$A_{jk}$的项:
- 第一种情况:当$p=j$且$q=k$时,对应的项是$B_{ij}A_{jk}A_{rk}x_r$,对$A_{jk}$求偏导后得到$B_{ij} \sum_{r=1}^n A_{rk}x_r = B_{ij}(A^Tx)_k$
- 第二种情况:当$r=j$且$q=k$时,对应的项是$B_{ip}A_{pk}A_{jk}x_j$,对$A_{jk}$求偏导后得到$x_j \sum_{p=1}^n B_{ip}A_{pk} = x_j(BA)_{ik}$
把两种情况合并,就得到最终的元素级偏导结果:
$$
\frac{\partial y_i}{\partial A_{jk}} = B_{ij}(A^Tx)k + x_j(BA){ik}
$$
如果你之前尝试过向量化的思路,这个方法会更符合你的预期。核心是利用微分和向量化的性质来推导,避免逐个元素展开的繁琐:
先求$y$的微分:
$$
dy = B(dA)A^Tx + BA(dA)^Tx
$$
这里$dA$是$A$的微分矩阵,每一项$dA_{jk}$对应$A_{jk}$的微小变化。对两边做向量化处理(列向量的向量化就是自身,矩阵向量化用$\text{vec}(\cdot)$表示):
$$
\text{vec}(dy) = \text{vec}(B(dA)A^Tx) + \text{vec}(BA(dA)^Tx)
$$利用向量化的核心公式$\text{vec}(P X Q) = (Q^T \otimes P)\text{vec}(X)$(其中
\otimes是克罗内克积):- 第一项:$\text{vec}(B(dA)A^Tx) = ((ATx)T \otimes B)\text{vec}(dA) = (x^T A \otimes B)\text{vec}(dA)$
- 第二项:通过$\text{vec}(X^T) = K_{n,n}\text{vec}(X)$($K_{n,n}$是交换矩阵)转换后再套用公式,最终映射回元素级的结果,会和方法一得到的$\frac{\partial y_i}{\partial A_{jk}} = B_{ij}(A^Tx)k + x_j(BA){ik}$完全一致。
这个方法的优势是不需要逐个元素展开,更适合大规模矩阵的导数推导,也能和你之前的向量化思路完美衔接。
内容的提问来源于stack exchange,提问作者Cousin

