矩阵求导基础
算是忙里偷闲,学一点无用之用。其实很早就想学一下矩阵求导这东西,但是总是无所事事地忙忙碌碌。难得现在有空那就好好学点有用的东西。
0,一点有用的小东西
在正式开始之前,先分享记录一下刚刚学会的一个小技巧:查看网页上面公式的tex代码。
和以前学爬虫的时候一样,方法很简单,就是开发者工具。Ctrl+Shift+C选中需要的元素,然后在右侧开发者工具中找到这个,复制粘贴就可以了。
1,矩阵求导的本质
最开始接触矩阵求导,应该还是大一的时候,最开接触神经网络的时候,那时候看着哪些五花八门乱七八糟的公式。说起来惭愧,接触的挺早的,但是那时候都只是浅尝辄止,没有认真去学。直到现在才肯静下心来,认真去看看。
其实,更加高阶的矩阵求导知识,似乎要到矩阵论里面,我暂时还只是开个头,等大四了再好好充实自己。
最开始,我们可以给出一个简单的例子和结论,后面再继续探究。
1.1,矩阵函数的表示
求导的一个前提就是有一个函数,所以我们先定义一个函数的表达方式。
\[function(input)\]这里定义的很简单,function就是函数,input就是输入。
下面我们要分别讨论输入和输出分别是标量、向量和矩阵的情况。实际上张量用得比较少,但是你可以从前面的继续推理出来。
我们先对\(function(input)\)做一个粗略的表示定义
当 \(function\) 是一个标量时,我们称之为实标量函数。用细体小写字母\(f\)表示。
当 \(function\) 是一个向量时,我们称之为实向量函数。用粗体小写字母字母\(\pmb{f}\)表示。
当 \(function\) 是一个矩阵时,我们称之为实矩阵函数。用粗体大写字母\(\pmb{F}\)表示。
同样的,当\(input\)为标量、向量和矩阵时候,我们称之为标量变元、向量变元和矩阵变元,分别用\(x\)、\(\pmb{x}\)和\(\pmb{X}\)表示。
下面我举出一个矩阵变元的实矩阵函数的表达,标量变元和向量变元可以看作是他的特化。
\[\begin{align*} \pmb{F}_{3\times2}(\pmb{X})&= \left[ \matrix{ f_{11}(\pmb{X}) & f_{12}(\pmb{X})\\ f_{21}(\pmb{X}) & f_{22}(\pmb{X})\\ f_{31}(\pmb{X}) & f_{32}(\pmb{X})\\ } \right]\\\\ &= \left[ \matrix{ x_{11}+x_{12}+x_{21}+x_{22}+x_{31}+x_{32} & 2x_{11}+x_{12}+x_{21}+x_{22}+x_{31}+x_{32}\\ 3x_{11}+x_{12}+x_{21}+x_{22}+x_{31}+x_{32} & 4x_{11}+x_{12}+x_{21}+x_{22}+x_{31}+x_{32}\\ 5x_{11}+x_{12}+x_{21}+x_{22}+x_{31}+x_{32} & 6x_{11}+x_{12}+x_{21}+x_{22}+x_{31}+x_{32} } \right] \end{align*} \\\\\]当我们的函数,为向量或者标量的时候,我们可以将\(\pmb{F}_{3\times2}(X)\)改成\(\pmb{F}_{3\times1}(X)\)甚至是\(\pmb{F}_{1\times1}(X)\),而第一行中右边的矩阵则改成对应的形式。同时变元的改变,只是意味着,第一行右边里面的实标量函数所拥有的变量数量发生了改变。
到这里,我们已经很好地认识到了矩阵函数的表达形式,那么下一步,就是基础的求导了。
1.2,偏导和矩阵求导
在高等数学里面,我们学过多元函数的求偏导,我们可以用这个求偏导得到他的梯度,就像下面这个函数。
\[f(x_1,x_2,x_3)=x_1^2+x_1x_2+x_2x_3\]然后我们可以很简单的求出它的偏导:
\[\left\{ \begin{align*} \frac{\partial f}{\partial x_1} & = 2x_1+x_2 \\\\ \frac{\partial f}{\partial x_2} & = x_1+x_3 \\\\ \frac{\partial f}{\partial x_3} & = x_2 \end{align*} \right. \\\\\]然后我们把它的三个偏导,按照顺序组成向量的形式,就可以得到它的梯度。其实按照前一小节的定义,这个函数可以看成一个向量变元的实标量函数。而我们通过上面高等数学中的写法,转化成矩阵的表达方式,那我们就得到了向量变元的实标量函数的梯度求法。
\[\nabla_{\pmb{x}}f(\pmb{x})= \frac{\partial f(\pmb{x})}{\partial \pmb{x}}= \left[ \frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, \cdots, \frac{\partial f}{\partial x_n} \right]^T \\\\\]那么在这里,我们就可以得到矩阵求导的本质,简单来说,所以,如果\(function\)中有\(m\)个\(f\) ,变元中有\(n\)个元素,那么,每个\(f\)对变元中的每个元素逐个求偏导后,我们就会产生\(m\times n\)个结果。
2,求导结果的布局
上面那个只是一个基础的结论,实际上我们面临一个很严肃的问题。矩阵求导的结果往往也是一个矩阵,那么这些矩阵中的元素应该怎么分布呢。
2.0,前提
在讨论这种分子分母的布局之前,还有一个前提,那就是这对分子分母,需要满足下面两个条件之一。
- 分子分母都是向量,且一个是行向量,另一个是列向量
- 分子分母一个是标量,另一个是行向量或列向量(实际上,在后文中,是矩阵也是可以的)
如果,分子分母中,出现了矩阵,那么我们就可以要对矩阵进行处理。
2.1,行列向量之间的布局
一个比较直观的结论有两种布局,一种是分子布局,另一种是分母布局。
分子布局,就是分子是列向量形式,分母是行向量形式,就像下面这样:
\[\frac{\partial \pmb{f}_{2\times1}(\pmb{x})}{\partial \pmb{x}^T_{3\times1}}= \left[ \matrix{ \frac{\partial f_1}{\partial x_1}& \frac{\partial f_1}{\partial x_2}& \frac{\partial f_1}{\partial x_3}\\ \frac{\partial f_2}{\partial x_1}& \frac{\partial f_2}{\partial x_2}& \frac{\partial f_2}{\partial x_3}} \right]_{2\times 3} \\\\\]分母布局,就是分母是列向量形式,分子是行向量形式,就像下面这样:
\[\frac{\partial \pmb{f}^T_{2\times1}(\pmb{x})}{\partial \pmb{x}_{3\times1}}= \left[ \matrix{ \frac{\partial f_1}{\partial x_1}& \frac{\partial f_2}{\partial x_1} \\ \frac{\partial f_1}{\partial x_2}& \frac{\partial f_2}{\partial x_2} \\ \frac{\partial f_1}{\partial x_3}& \frac{\partial f_2}{\partial x_3} } \right]_{3\times 2} \\\\\]说得更加直观一点,那就是分子分母总会是一个是行向量,一个是列向量,那么我们的结果就是举列向量的行数,和行向量的列数。就像上面所说的例子一样。而所谓的布局,就是谁是列向量,取谁的布局。
2.2,梯度与行向量偏导
梯度与行向量偏导其实是两个比较类似的东西,因为我们常说的梯度,其实也可以叫做,列向量偏导。
对于一个实标量函数来说,他的梯度和行向量偏导分别如下:
\[\nabla_{\pmb{x}}f(\pmb{x})= \frac{\partial f(\pmb{x})}{\partial \pmb{x}}= \left[ \frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, \cdots, \frac{\partial f}{\partial x_n} \right]^T \\\\\] \[\text{D}_{\pmb{x}}f(\pmb{x})= \frac{\partial f(\pmb{x})}{\partial \pmb{x}^T}= \left[ \frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, \cdots, \frac{\partial f}{\partial x_n} \right] \\\\\]这里我们可以很容易的观察到,这里的梯度与行向量偏导其实是互为转置的。同时,我们也可以观察到,如果把那个标量看成\(1\times 1\)的行向量或者列向量的话,它是分别属于分母布局和分子布局。
这里举的是向量的例子,标量很好理解,但是矩阵呢?
2.3,实标量函数的矩阵变元
这里其实我们有两种处理方式,一种是按列堆栈来向量化,另一种是\(Jacobian\)矩阵形式。
首先是按列堆栈来向量化。
这里我们目前的处理方式就是把,矩阵转化成向量的形式。我们把这种方式用符号\(vec(\pmb{X})\)表示,它的作用就是把矩阵\(\pmb{X}_{m\times n}=(x_{ij})_{i=1,j=1}^{m,n}\)按列堆栈来向量化。
简单地说,这个按列堆栈来向量化,其实就是把矩阵中的列拆出来成为一个个列向量,然后拼接在一起成为一个大的列向量。
\[\text{vec}({\pmb{X})}= \left[ x_{11},x_{21},\cdots,x_{m1},x_{12},x_{22},\cdots,x_{m2},\cdots,x_{1n},x_{2n},\cdots,x_{mn} \right]^T \\\\ \tag{7}\]这种方式下,我们把一个矩阵转化成一个列向量,按照上面的做法,它会成为一个分母布局,就像下面这样:
\[\begin{align*} \nabla_{\text{vec}\pmb{X}}f(\pmb{X})&= \frac{\partial f(\pmb{X})}{\partial \text{vec}(\pmb{X})} \\\\ &= \left[ \frac{\partial f}{\partial x_{11}},\frac{\partial f}{\partial x_{21}},\cdots,\frac{\partial f}{\partial x_{m1}},\frac{\partial f}{\partial x_{12}},\frac{\partial f}{\partial x_{22}},\cdots,\frac{\partial f}{\partial x_{m2}},\cdots,\frac{\partial f} {\partial x_{1n}},\frac{\partial f}{\partial x_{2n}},\cdots,\frac{\partial f}{\partial x_{mn}} \right]^{T} \end{align*} \\\\\]当然,对于一个标量函数来说,我们也可以不对分子进行按列堆栈来向量化,我们可以直接对原矩阵变元的每个位置的元素逐个求偏导,结果布局和原矩阵布局一样:
\[\begin{align*} \nabla_{\pmb{X}}f(\pmb{X})&= \frac{\partial f(\pmb{X})}{\partial \pmb{X}_{m\times n}} \\\\ &= \left[ \matrix{ \frac{\partial f}{\partial x_{11}}&\frac{\partial f}{\partial x_{12}}&\cdots&\frac{\partial f}{\partial x_{1n}} \\ \frac{\partial f}{\partial x_{21}}&\frac{\partial f}{\partial x_{22}}& \cdots & \frac{\partial f}{\partial x_{2n}}\\ \vdots&\vdots&\vdots&\vdots\\ \frac{\partial f} {\partial x_{m1}}&\frac{\partial f}{\partial x_{m2}}&\cdots&\frac{\partial f}{\partial x_{mn}} } \right]_{m\times n} \end{align*} \\\\\]当然,和上面的向量变元一样,这里的梯度与行向量偏导也是互为转置的。
2.4,实矩阵函数的矩阵变元
其实这一部分才是最为重要的,因为前面的讲到的无论是变元还是函数,我们都可以把向量看成特殊的矩阵,标量看成特殊的向量,之前的公式都可以从这一部分推出来。
没讲到的矩阵变元的实向量函数、向量变元的实向量函数以及向量变元的实矩阵函数,都可以通过这一部分推到出来,所以不需要更多的赘述。通过之前的东西,无非是加深自己的理解和记忆。
就像我们之前说的前提,如果出现了矩阵,那么我们需要对矩阵进行处理,而分子分母都是矩阵的情况下,我们就只能进行向量化处理了。
我们先定义矩阵变元的实矩阵函数:\(\pmb{F}(\pmb{X})\) , \(\pmb{F}_{p\times q}=(f_{ij})_{i=1,j=1}^{p,q}\)。
这里和前面不同的是,我们要向量化处理的不再只是分母,而是分子分母一起处理。同时我们要注意,向量化处理后的分子分母依然要保持一个行向量一个列向量的形式。因此在梯度到行向量偏导的转置过程中,分子分母要同时转置。
\[\begin{align*} \nabla_{\pmb{X}}\pmb{F}(\pmb{X}) &=\frac{\partial \text{vec}_{pq\times 1}^T(\pmb{F}_{}(\pmb{X}))}{\partial \text{vec}_{mn\times 1}\pmb{X}} \\\\ &= \left[ \matrix{ \frac{\partial f_{11}}{\partial x_{11}}&\frac{\partial f_{21}}{\partial x_{11}}&\cdots&\frac{\partial f_{p1}}{\partial x_{11}}&\frac{\partial f_{12}}{\partial x_{11}}&\frac{\partial f_{22}}{\partial x_{11}}&\cdots&\frac{\partial f_{p2}}{\partial x_{11}}&\cdots&\frac{\partial f_{1q}}{\partial x_{11}}&\frac{\partial f_{2q}}{\partial x_{11}}&\cdots&\frac{\partial f_{pq}}{\partial x_{11}}\\ \frac{\partial f_{11}}{\partial x_{21}}&\frac{\partial f_{21}}{\partial x_{21}}&\cdots&\frac{\partial f_{p1}}{\partial x_{21}}&\frac{\partial f_{12}}{\partial x_{21}}&\frac{\partial f_{22}}{\partial x_{21}}&\cdots&\frac{\partial f_{p2}}{\partial x_{21}}&\cdots&\frac{\partial f_{1q}}{\partial x_{21}}&\frac{\partial f_{2q}}{\partial x_{21}}&\cdots&\frac{\partial f_{pq}}{\partial x_{21}}\\ \vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots\\ \frac{\partial f_{11}}{\partial x_{m1}}&\frac{\partial f_{21}}{\partial x_{m1}}&\cdots&\frac{\partial f_{p1}}{\partial x_{m1}}&\frac{\partial f_{12}}{\partial x_{m1}}&\frac{\partial f_{22}}{\partial x_{m1}}&\cdots&\frac{\partial f_{p2}}{\partial x_{m1}}&\cdots&\frac{\partial f_{1q}}{\partial x_{m1}}&\frac{\partial f_{2q}}{\partial x_{m1}}&\cdots&\frac{\partial f_{pq}}{\partial x_{m1}}\\ \frac{\partial f_{11}}{\partial x_{12}}&\frac{\partial f_{21}}{\partial x_{12}}&\cdots&\frac{\partial f_{p1}}{\partial x_{12}}&\frac{\partial f_{12}}{\partial x_{12}}&\frac{\partial f_{22}}{\partial x_{12}}&\cdots&\frac{\partial f_{p2}}{\partial x_{12}}&\cdots&\frac{\partial f_{1q}}{\partial x_{12}}&\frac{\partial f_{2q}}{\partial x_{12}}&\cdots&\frac{\partial f_{pq}}{\partial x_{12}}\\ \frac{\partial f_{11}}{\partial x_{22}}&\frac{\partial f_{21}}{\partial x_{22}}&\cdots&\frac{\partial f_{p1}}{\partial x_{22}}&\frac{\partial f_{12}}{\partial x_{22}}&\frac{\partial f_{22}}{\partial x_{22}}&\cdots&\frac{\partial f_{p2}}{\partial x_{22}}&\cdots&\frac{\partial f_{1q}}{\partial x_{22}}&\frac{\partial f_{2q}}{\partial x_{22}}&\cdots&\frac{\partial f_{pq}}{\partial x_{22}}\\ \vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots\\ \frac{\partial f_{11}}{\partial x_{m2}}&\frac{\partial f_{21}}{\partial x_{m2}}&\cdots&\frac{\partial f_{p1}}{\partial x_{m2}}&\frac{\partial f_{12}}{\partial x_{m2}}&\frac{\partial f_{22}}{\partial x_{m2}}&\cdots&\frac{\partial f_{p2}}{\partial x_{m2}}&\cdots&\frac{\partial f_{1q}}{\partial x_{m2}}&\frac{\partial f_{2q}}{\partial x_{m2}}&\cdots&\frac{\partial f_{pq}}{\partial x_{m2}}\\ \vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots\\ \frac{\partial f_{11}}{\partial x_{1n}}&\frac{\partial f_{21}}{\partial x_{1n}}&\cdots&\frac{\partial f_{p1}}{\partial x_{1n}}&\frac{\partial f_{12}}{\partial x_{1n}}&\frac{\partial f_{22}}{\partial x_{1n}}&\cdots&\frac{\partial f_{p2}}{\partial x_{1n}}&\cdots&\frac{\partial f_{1q}}{\partial x_{1n}}&\frac{\partial f_{2q}}{\partial x_{1n}}&\cdots&\frac{\partial f_{pq}}{\partial x_{1n}}\\ \frac{\partial f_{11}}{\partial x_{2n}}&\frac{\partial f_{21}}{\partial x_{2n}}&\cdots&\frac{\partial f_{p1}}{\partial x_{2n}}&\frac{\partial f_{12}}{\partial x_{2n}}&\frac{\partial f_{22}}{\partial x_{2n}}&\cdots&\frac{\partial f_{p2}}{\partial x_{2n}}&\cdots&\frac{\partial f_{1q}}{\partial x_{2n}}&\frac{\partial f_{2q}}{\partial x_{2n}}&\cdots&\frac{\partial f_{pq}}{\partial x_{2n}}\\ \vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots\\ \frac{\partial f_{11}}{\partial x_{mn}}&\frac{\partial f_{21}}{\partial x_{mn}}&\cdots&\frac{\partial f_{p1}}{\partial x_{mn}}&\frac{\partial f_{12}}{\partial x_{mn}}&\frac{\partial f_{22}}{\partial x_{mn}}&\cdots&\frac{\partial f_{p2}}{\partial x_{mn}}&\cdots&\frac{\partial f_{1q}}{\partial x_{mn}}&\frac{\partial f_{2q}}{\partial x_{mn}}&\cdots&\frac{\partial f_{pq}}{\partial x_{mn}}\\ } \right]_{mn \times pq} \end{align*} \\\\\]2.5,小结
到这里,我们的第二节就结束了。这一节主要讲的是求导结果的一个布局。
这里并没有讨论到所有情况,后续我们会继续说下去,这只是一个开始。
我们在这里可以简单总结一下上面的这些。
首先,我们讨论的前提是,分子分母的维度总和小于2,这样求导的结果是维度也是小于2,这样我们的才可以讨论结果的布局。
同时,我们也要求,两个向量必须是一个是行向量一个是列向量,当然到,分子分母中的一个是标量时候,这点是无所谓的。
最后,我们的结果就是取列向量的行数,和行向量的列数。就像上面所说的例子一样。而所谓的布局,就是谁是列向量,取谁的布局。