本篇内容摘自CMU 16-745最优控制的第10讲 "Nonlinear Trajectory Optimization"。
如何在不涉及张量运算的前提下,计算矩阵对向量的导数并写出二阶泰勒展开
在多维微积分中,计算矩阵对向量的导数和二阶泰勒展开是一项重要的任务。本文将介绍如何在不涉及张量运算的前提下,完成该导数计算。
1. 导数计算的背景和动机
在许多工程问题中,我们需要计算一个矩阵函数对一个向量变量的导数,这些导数在求解优化问题过程中非常重要。但是矩阵对向量的求导结果,是一个三维张量。这导致在不具有张量运算知识的情况下很难进行数学推导和代码编写。
为了避免复杂的张量运算,我们可以利用矩阵的向量化和克罗内克积等技巧,简化计算过程。主要思想是将矩阵对向量的导数 (这是一个张量)转换为向量对向量的导数 (这是一个矩阵)。然后通过"Vec技巧",使得求得的矩阵可以用于泰勒展开式或其他数学推导中,作为张量的代替。
1.1. 克罗内克积(Kronecker Product)
克罗内克积是一种用于计算多维数组(如矩阵)的运算。假设 A ∈ R l × m \mathbf{A} \in \mathbb{R}^{l \times m} A∈Rl×m, B ∈ R n × p \mathbf{B} \in \mathbb{R}^{n \times p} B∈Rn×p,则它们的克罗内克积定义为:
A ⊗ B = [ a 11 B ⋯ a 1 m B ⋮ ⋱ ⋮ a l 1 B ⋯ a l m B ] ∈ R l n × m p . \mathbf{A} \otimes \mathbf{B} = \begin{bmatrix} a_{11} \mathbf{B} & \cdots & a_{1m} \mathbf{B} \\ \vdots & \ddots & \vdots \\ a_{l1} \mathbf{B} & \cdots & a_{lm} \mathbf{B} \end{bmatrix} \in \mathbb{R}^{ln \times mp}. A⊗B= a11B⋮al1B⋯⋱⋯a1mB⋮almB ∈Rln×mp.
1.2. 向量化操作符(Vectorization Operator)
向量化操作符用于将矩阵转换为向量。假设:
A = [ a 1 a 2 ⋯ a m ] ∈ R l × m . \mathbf{A} = \begin{bmatrix} \mathbf{a}_1 & \mathbf{a}_2 & \cdots & \mathbf{a}_m \end{bmatrix} \in \mathbb{R}^{l \times m}. A=[a1a2⋯am]∈Rl×m.
向量化操作符定义为:
vec ( A ) = [ a 1 a 2 ⋮ a m ] ∈ R l m × 1 . \text{vec}(\mathbf{A}) = \begin{bmatrix} \mathbf{a}_1 \\ \mathbf{a}_2 \\ \vdots \\ \mathbf{a}_m \end{bmatrix} \in \mathbb{R}^{lm \times 1}. vec(A)= a1a2⋮am ∈Rlm×1.
2. Vec技巧
Vec技巧是利用向量化和克罗内克积简化矩阵导数计算的一个方法。具体公式如下:
vec ( A B C ) = ( C ⊤ ⊗ A ) vec ( B ) . \text{vec}(\mathbf{A}\mathbf{B}\mathbf{C}) = (\mathbf{C}^{\top} \otimes \mathbf{A}) \text{vec}(\mathbf{B}). vec(ABC)=(C⊤⊗A)vec(B).
对于两个矩阵 A \mathbf{A} A和 B \mathbf{B} B,可以进一步简化为:
vec ( A B ) = ( B ⊤ ⊗ I ) vec ( A ) = ( I ⊗ A ) vec ( B ) . \text{vec}(\mathbf{A}\mathbf{B}) = (\mathbf{B}^{\top} \otimes \mathbf{I}) \text{vec}(\mathbf{A}) = (\mathbf{I} \otimes \mathbf{A}) \text{vec}(\mathbf{B}). vec(AB)=(B⊤⊗I)vec(A)=(I⊗A)vec(B).
引入该技巧后,这使得我们可以通过向量化操作计算矩阵对向量的导数。考虑到记号简明性,在未加说明的情况下,我们将"向量化后的矩阵对向量的导数"来指代"矩阵对向量的导数":
∂ A ( x ) ∂ x = ∂ vec ( A ( x ) ) ∂ x ∈ R l m × n . \frac{\partial \mathbf{A}(\mathbf{x})}{\partial \mathbf{x}} = \frac{\partial \text{vec}(\mathbf{A}(\mathbf{x}))}{\partial \mathbf{x}} \in \mathbb{R}^{lm \times n}. ∂x∂A(x)=∂x∂vec(A(x))∈Rlm×n.
3. 应用于二阶泰勒展开
通过上述技巧,我们可以计算出二阶泰勒展开的结果。设 A = ∂ f ∂ x \mathbf{A} = \frac{\partial \mathbf{f}}{\partial \mathbf{x}} A=∂x∂f,则二阶导数为:
∂ ∂ x ( vec ( I A Δ x ) ) = ( Δ x ⊤ ⊗ I ) ∂ vec ( A ) ∂ x . \frac{\partial}{\partial\mathbf{x}}\left(\text{vec}\left(\mathbf{I}\mathbf{A}\Delta \mathbf{x}\right)\right) = \left(\Delta \mathbf{x}^{\top} \otimes \mathbf{I}\right) \frac{\partial \text{vec}(\mathbf{A})}{\partial \mathbf{x}}. ∂x∂(vec(IAΔx))=(Δx⊤⊗I)∂x∂vec(A).
最终,我们得到二阶泰勒展开式:
f ( x + Δ x ) = f ( x ) + A Δ x + 1 2 ( Δ x ⊤ ⊗ I ) ∂ vec ( A ) ∂ x Δ x . \mathbf{f}(\mathbf{x}+\Delta \mathbf{x}) = \mathbf{f}(\mathbf{x}) + \mathbf{A} \Delta \mathbf{x} + \frac{1}{2} \left(\Delta \mathbf{x}^{\top} \otimes \mathbf{I}\right) \frac{\partial \text{vec}(\mathbf{A})}{\partial \mathbf{x}} \Delta \mathbf{x}. f(x+Δx)=f(x)+AΔx+21(Δx⊤⊗I)∂x∂vec(A)Δx.
这样对于接下来的数学推导或者代码编写都带来了便利。
在某些情况下,我们需要对转置矩阵求导,此时可以使用换位矩阵(commutator matrix) T \mathbf{T} T,满足 T vec ( A ) = vec ( A ⊤ ) \mathbf{T}\text{vec}(\mathbf{A}) = \text{vec}(\mathbf{A}^{\top}) Tvec(A)=vec(A⊤)。公式如下:
∂ ∂ x ( A ⊤ ( x ) B ) = ( B ⊤ ⊗ I ) T ∂ A ∂ x . \frac{\partial }{\partial \mathbf{x}}(\mathbf{A}^{\top}(\mathbf{x}) \mathbf{B}) = (\mathbf{B}^{\top} \otimes \mathbf{I}) \mathbf{T}\frac{\partial \mathbf{A}}{\partial \mathbf{x}}. ∂x∂(A⊤(x)B)=(B⊤⊗I)T∂x∂A.