1. 引言
上一篇文章主要介绍了机器人动力学的一些基础的数学知识,这篇文章将利用这些基础知识解决一类比较棘手的数学问题,即矩阵求导。这个操作在拉格朗日法推导机器人动力学方程时是很有用的。
2. 符号约定
为了便于区分标量、向量和矩阵,我们作如下约定:
1.小写的bellmt-italic字体x,y等代表标量
2.小写的times new roman字体\text{x}, \text{y}等代表向量
3.大写的times new roman-italic字体X, Y代表矩阵
3. 扩充的导数概念
在高中的时候我们学习过标量函数求导,对于函数y=f(x), 导数为f’(x)=\frac{dy}{dx}。其实矩阵导数是这种标量导数在概念上的一个扩充,本质上来说矩阵求导其实就是多个标量求导并按照一定的次序排列成矩阵。由于自变量和函数均可以是标量、向量、矩阵三种形式,因此矩阵求导可以有九种基本类型(标量对标量,标量对向量,标量对矩阵,向量对标量…)。
举个例子,现在有一个m维的向量函数\text{y}(x),自变量是标量x,即:
\text{y}(x) = \begin{pmatrix}
y_1(x)\\
y_2(x)\\
\vdots\\
y_m(x)
\end{pmatrix}公式1
那么对于这个问题所谓的矩阵导数就是向量函数\text{y}(x)的每一个元素分别对标量x求导,将求导结果重新排列成一个向量,即:
\frac{d\text{y}}{dx}=\begin{pmatrix}
\frac{dy_1}{dx}\\
\frac{dy_2}{dx}\\
\vdots\\
\frac{dy_m}{dx}
\end{pmatrix}公式2
所以从概念上讲矩阵导数是很容易的。有个问题需要说一下以上向量\text{y}对标量x的导数是列向量还是行向量呢?答案其实是都可以。但是不能乱来,因为在矩阵乘法如AB中要求A的列数等于B的行数。如果我们任意的排列矩阵求导的结果可能导致这些矩阵运算维度不相容。因此矩阵求导是需要有布局这个概念的。
4. 矩阵求导的布局
矩阵求导的布局约定了导数在矩阵中的排列方式,分为分子布局和分母布局两种。所谓分子布局,顾名思义就是求导结果按照分子的维度进行排列,分母布局就是求导结果按照分母的维度进行排列。单纯的这样说可能会让人一头雾水,举几个例子来说明一下这个问题。
首先举向量对标量求导的情况,如果按照分子布局,那么结果就是上面的公式2。因为分子是m维的向量函数\text{y}(x),因此对标量求导后的结果依然是m维的向量。如果是按照分母布局呢?因为分母是一个标量,可以认为是一个一行一列的矩阵,此时的求导结果应该是一个行向量,即:
\frac{d\text{y}}{dx}=\begin{pmatrix}
\frac{dy_1}{dx}&
\frac{dy_2}{dx}&
\dots&
\frac{dy_m}{dx}
\end{pmatrix}
借此我们可以总结出一个规律:如果是分子布局,那么求导结果矩阵的行数一定等于分子的行数; 如果是分母布局,那么求导结果矩阵的行数一定等于分母的行数。
其次我们举向量对向量求导的情况,这种情况会使规律更加明显。设\text{y}(\text{x})是一个m维的向量函数,它的自变量是一个n维向量\text{x},如下式
\text{y}(\text{x}) = \begin{pmatrix}
y_1\\
y_2\\
\vdots\\
y_m
\end{pmatrix}
,
\text{x} = \begin{pmatrix}
x_1 \\
x_2 \\
\vdots\\
x_n
\end{pmatrix}公式3
如果按照分子布局,那么求导的结果如下式,这将是一个m行n列的矩阵。
\text{y}(\text{x}) = \begin{pmatrix}
\color{red}{y_1}\\
\color{red}{y_2}\\
\vdots\\
\color{red}{y_m}
\end{pmatrix},
\frac{d\text{y}}{d\text{x}}=\begin{pmatrix}
\frac{\partial \color{red}{y_1}}{\partial \color{green}{x_1}} & \frac{\partial y_1}{\partial \color{green}{x_2}} & \dots & \frac{\partial y_1}{\partial \color{green}{x_n}}\\
\frac{\partial \color{red}{y_2}}{\partial x_1} & \frac{\partial y_2}{\partial x_2} & \dots & \frac{\partial y_2}{\partial x_n}\\
\vdots & \vdots & \ddots & \vdots\\
\frac{\partial \color{red}{y_m}}{\partial x_1} & \frac{\partial y_m}{\partial x_2} & \dots & \frac{\partial y_m}{\partial x_n}
\end{pmatrix}公式4
看一下公式4中所有标记为红色的元素,你会发现\frac{d \text{y}}{d\text{x}}第一列元素的分子排列顺序恰好和向量函数\text{y}(\text{x})一致!(\frac{d \text{y}}{d\text{x}}第一行的元素分母的排列顺序恰好和向量\text{x}一致)。其实不只是第一列,导数矩阵的所有列均满足上述规律。因此这验证了前面总结出的规律:分子布局中分子的行数等于导数矩阵的行数,分子的元素排布与导数矩阵中各个列的分子排布一致!
如果你还记得我们在机器人运动学中介绍的雅克比矩阵,会发现雅克比矩阵本身就是位姿向量对关节角向量的导数并且这个导数是按照分子布局的!
如果是分母布局呢?那么求导结果如下式,这将是一个n行m列的矩阵。
\text{x} = \begin{pmatrix}
\color{red}{x_1}\\
\color{red}{x_2}\\
\vdots\\
\color{red}{x_n}
\end{pmatrix},
\frac{d\text{y}}{d\text{x}}=\begin{pmatrix}
\frac{\partial \color{green}{y_1}}{\partial \color{red}{x_1}} & \frac{\partial \color{green}{y_2}}{\partial x_1} & \dots & \frac{\partial \color{green}{y_m}}{\partial x_1}\\
\frac{\partial y_1}{\partial \color{red}{x_2}} & \frac{\partial y_2}{\partial x_2} & \dots & \frac{\partial y_m}{\partial x_2}\\
\vdots & \vdots & \ddots & \vdots\\
\frac{\partial y_1}{\partial \color{red}{x_n}} & \frac{\partial y_2}{\partial x_n} & \dots & \frac{\partial y_m}{\partial x_n}
\end{pmatrix}公式5
再看一下公式5中所有标记为红色的元素,你会发现\frac{d \text{y}}{d\text{x}}第一列元素的分母排列顺序恰好与向量\text{x}一致。所以在分母布局中分母的行数等于导数矩阵的行数,分母的元素排布与导数矩阵中各个列的分母排布一致!
5. 微分法求矩阵导数
关于矩阵导数最朴素的定义就是逐元素求导然后按照一定的布局规则排列这些导数,但是在实际操作中我们很少会使用这种定义来求矩阵导数。有这样几个原因。一是复杂,定义法只适用于简单的矩阵求导场景,当面临矩阵乘法(如Y(\text{x})=C\cdot A(\text{x})\cdot B(\text{x}))、复合求导(如Y(\text{z}(\text{x})))等情况时使用定义法恐怕要被折磨死。第二是为了追求整体性,矩阵中的元素本应该是一个相互关联的整体,在进行导数运算时不应该破坏这种整体性。实际上利用上一篇文章介绍的微分和迹既可以保证矩阵求导的整体性又能简化求导的过程。
5.1 微分与迹的性质
在介绍微分法求矩阵导数之前我们需要了解几个矩阵微分和迹的性质。矩阵微分的性质如下:
1.微分加法:d(X+Y)=dX+dY
2.微分乘法:d(XY)=(dX)dY+X(dY)
3.微分转置:d(X^T)=(dX)^T
4.微分的轨迹:dtr(X)=tr(dX)
机器人中的矩阵求导通常不会很复杂,应用这几个矩阵微分的性质基本已够用。矩阵迹的性质如下:
1.标量的迹等于它本身:tr(x)=x
2.转置不变性:tr(A^T)=tr(A)
3.加法:tr(A+B)=tr(A)+tr(B)
4.交换律:tr(AB)=tr(BA)
5.2 标量对矩阵求导
机器人动力学中应用到的主要是标量对矩阵的导数,我们以此为例来探讨矩阵求导与微分和迹的联系。对于高中学的标量导数,很容易建立微分方程:dy=f’(x)dx。同样如果面对的是多元函数仍然能通过梯度建立微分方程:
dy=\frac{\partial y}{\partial x_1}dx_1+\frac{\partial y}{\partial x_2}dx_2+\dots+\frac{\partial y}{\partial x_n}dx_n=\begin{pmatrix}
\frac{\partial y}{\partial x_1}\\
\frac{\partial y}{\partial x_2}\\
\vdots \\
\frac{\partial y}{\partial x_n}
\end{pmatrix}^T \begin{pmatrix}
dx_1 \\
dx_2 \\
\vdots \\
dx_n
\end{pmatrix} = \left (\frac{\partial y}{\partial \text{x}}\right)^T d\text{x}
可以看到标量函数y的微分dy最终转化为梯度向量(导数)\frac{\partial y}{\partial \text{x}}和自变量微分向量d\text{x}的内积!
标量对矩阵的求导会不会有类似的形式呢?答案是肯定的,我们举例来看一下。现在有一个标量函数y(X),它的自变量是一个二维矩阵X=\begin{pmatrix}
x_{11} & x_{12}\\
x_{21} & x_{22}
\end{pmatrix}。那么如何计算导数\frac{dy}{dX}?首先按照矩阵求导的含义标量对矩阵求导就是标量对矩阵中的每一个元素求导然后再排列成矩阵。因此按照分母布局,这个导数应该是:
\frac{dy}{dX}=\begin{pmatrix}
\frac{\partial y}{\partial x_{11}} & \frac{\partial y}{\partial x_{12}}\\
\frac{\partial y}{\partial x_{21}} & \frac{\partial y}{\partial x_{22}}
\end{pmatrix}公式6
标量函数y的微分此时应为:
dy = \frac{\partial y}{\partial x_{11}}dx_{11}+\frac{\partial y}{\partial x_{12}}dx_{12}+\frac{\partial y}{\partial x_{21}}dx_{21}+\frac{\partial y}{\partial x_{22}}dx_{22}\ \ \ 公式7
再来看dX是个啥?
dX=\begin{pmatrix}
dx_{11} & dx_{12}\\
dx_{21} & dx_{22}
\end{pmatrix}公式8
现在我们其实想找到矩阵导数,函数微分以及自变量微分之间的关系,即公式6,7,8之间的关系,可以尝试把公式6和公式8乘一下看看
\begin{pmatrix}
\frac{\partial y}{\partial x_{11}} & \frac{\partial y}{\partial x_{12}}\\
\frac{\partial y}{\partial x_{21}} & \frac{\partial y}{\partial x_{22}}
\end{pmatrix} ^T \begin{pmatrix}
dx_{11} & dx_{12}\\
dx_{21} & dx_{22}
\end{pmatrix}=\begin{pmatrix}
\frac{\partial y}{\partial x_{11}}dx_{11}+\frac{\partial y}{\partial x_{21}}dx_{21} & sth\\
sth & \frac{\partial y}{\partial x_{12}}dx_{12}+\frac{\partial y}{\partial x_{22}}dx_{22}
\end{pmatrix}
你会发现这个矩阵的对角线元素之和恰好是全微分,对角线之和其实就是迹!因此
dy=tr\left( \left(\frac{dy}{dX}\right) ^T dX \right)
另外非常凑巧的是公式右侧\color{red}{tr\left( \left(\frac{dy}{dX}\right) ^T dX \right)}恰好是矩阵导数\color{red}{\frac{dy}{dX}}与自变量微分\color{red}{dX}的矩阵内积!如果你忘记了矩阵内积的定义,可以看一下上一篇文章。
通过上面的一系列推导我们总结出了这样一个规律,无论是标量求导、标量对向量求导还是标量对矩阵求导最终都存在如下关系:函数的微分等于函数的导数与自变量微分的内积!也正因如此,我们可以借助求解微分dy和自变量微分dX之间的关系间接地求解导数!这个过程远比直接求导数容易得多,因为微分只是一个函数而导数是一个极限。
6. 微分法求导实例
最后举两个典型的例子,一个是存在矩阵乘法运算的函数求导问题,另一个是存在复合情况下的函数求导问题。
6.1 存在矩阵乘法的求导实例
设标量函数y与自变量向量\text{x}存在如下关系:y=\text{x} ^T A \text{x},求矩阵导数\frac{dy}{d\text{x}}。因为y是标量,加上迹之后仍是它本身:y=tr(y)=tr\left( \text{x}^T A \text{x} \right)。
按照前面的思路先求标量函数y的全微分:dy=dtr(\text{x}^TA\text{x})=tr(d(\text{x}^T A \text{x})),注意这里使用了微分的性质4
接下来使用微分的性质2和3来操作以上等式:
dy=tr(d(\text{x}^T A \text{x}))=tr(d(\text{x}^T)A\text{x}+\text{x}^TA(d\text{x}))=tr((d\text{x})^TA\text{x}+\text{x}^TA(d\text{x}))
接下来应用迹的性质2来操作以上等式:
dy=tr((d\text{x})^TA\text{x}+\text{x}^TA(d\text{x}))=tr(\text{x}^TA^T(d\text{x}) + \text{x}^TA(d\text{x}))=tr\left(\left[ \color{red}{ \left(A+A^T\right)\text{x}}\color{black} \right]^T d\text{x}\right)
到这一步就可以直观的看出这个向量函数的导数为\frac{dy}{d\text{x}}=\left(A+A^T\right)\text{x}
总结一下我们其实就是把求导数转化为推导全微分并寻找函数全微分dy和自变量微分d\text{x}之间类似于dy=tr(F^Td\text{x})关系,此时F就是要求的导数了。
6.2 存在复合的矩阵求导实例
所谓复合是指自变量本身又是另外一组自变量的函数即y=f(Z(X)),可以看到y是矩阵Z的函数,而矩阵Z又是矩阵X的函数,那么如何求\frac{dy}{dX}。
比较常见的情况是Z=AXB(矩阵A和B是常量),按照经验由于函数是标量我们先给它加上迹然后求全微分:
dy = dtr(y)=tr(dy)=tr\left(\left(\frac{\partial y}{\partial Z}\right)^TdZ\right)
接下来把Z的表达式代入并使用微分的性质2:
dy=tr\left(\left(\frac{\partial y}{\partial Z}\right)^TdZ\right)=tr\left(\left(\frac{\partial y}{\partial Z}\right)^Td\left( AXB \right)\right)=tr\left(\left(\frac{\partial y}{\partial Z}\right)^TA(dX)B\right)
其实到现在已经很接近结果了,只是现在自变量微分矩阵dX还没有移动到末尾。我们进一步使用迹的第4个性质即交换律。将除了矩阵B以外的部分视为一个整体那么:
dy=tr\left(\left(\frac{\partial y}{\partial Z}\right)^TA(dX)B\right)=tr\left(B\left(\frac{\partial y}{\partial Z}\right)^TA(dX)\right)=tr\left(\left(A^T\frac{\partial y}{\partial Z}B^T\right) ^T dX \right)
这样就又看到了熟悉的形式:\frac{dy}{dX}=A^T\frac{\partial y}{\partial Z}B^T。因此可以先求\frac{\partial y}{\partial Z}即标量函数y对矩阵Z的导数,只需对这个导数左乘A^T右乘B^T就得到了标量函数y对矩阵X的导数了。
借此可以再反思一个问题如果按照我们之前关于链式法则的思维惯性很可能会得出以下错误的结论:
\xcancel{\frac{dy}{dX}=\frac{\partial y}{\partial Z}\frac{\partial (AXB)}{\partial X}=\frac{\partial y}{\partial Z}(AB)}
7. 总结
这篇文章主要介绍了利用微分简化矩阵求导的过程,矩阵求导分为了九个基本类型,这里介绍了我们经常用到的向量对向量以及标量对矩阵的导数,其实矩阵对矩阵的导数常见的处理方法也是将矩阵变为列向量再求导,由于目前还用不到这种情况暂时先不讨论了。
关于动力学的数学基础部分基本就分享完了,后面用到这部分内容时再来回顾和补充。接下来将介绍物理学的一些基础内容,主要探讨单刚体的运动学和动力学。
由于个人能力有限,所述内容难免存在疏漏,欢迎指出,欢迎讨论。
8. 参考文献
[1]. 机器学习中的矩阵向量求导
[2]. 矩阵求导术
[3]. 张贤达,矩阵分析与应用