前言

之前没有接触过矩阵积分,在学习cs229的过程中遇到了,好在课程给了相关的参考文献。这篇Linear Algebra Review and Reference对复习线性代数的知识很有帮助,遂决定将其中第四部分矩阵积分的内容翻译过来。前三部分在大学本科阶段的线性代数都会涉及,在此不做翻译。

4. 矩阵积分

标准的线性代数课程都会包含前面章节的话题,但其中有一项看起来不会被经常提及(但我们接下来会经常用到),那就是对积分在向量方面的扩展。尽管我们实际用的积分相对比较琐碎,符号常常使事情看起来比实际困难得多。这部分我们给出一些关于矩阵积分基本的定义和例子。

4.1 梯度

f:Rm×nRf:\mathbb{R}^{m \times n} \rightarrow \mathbb{R}是一个函数,输入是一个m×nm \times n的矩阵AA,返回值是一个实数。则ff的梯度是对矩阵的每一个位置求偏导数,定义如下:

Af(A)Rm×n=[f(A)A11f(A)A12f(A)A1nf(A)A21f(A)A22f(A)A2nf(A)Am1f(A)Am2f(A)Amn]\nabla_A f(A)\in \mathbb{R}^{m \times n} = \begin{bmatrix} \frac{\partial f(A)}{\partial A_{11}} & \frac{\partial f(A)}{\partial A_{12}} & \cdots & \frac{\partial f(A)}{\partial A_{1n}} \\ \frac{\partial f(A)}{\partial A_{21}} & \frac{\partial f(A)}{\partial A_{22}} & \cdots & \frac{\partial f(A)}{\partial A_{2n}} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial f(A)}{\partial A_{m1}} & \frac{\partial f(A)}{\partial A_{m2}} & \cdots & \frac{\partial f(A)}{\partial A_{mn}} \end{bmatrix}

即,对一个m×nm \times n矩阵来说

(Af(A))ij=f(A)Aij{(\nabla_A f(A))}_{ij} = \frac{\partial f(A)}{\partial A_{ij}}

注意,Af(A)\nabla_Af(A)的大小总是和AA一样。特别地,对A是向量的情况,xRnx \in \mathbb{R}^n

xf(x)=[f(x)x1f(x)x2f(x)xn]\nabla_x f(x) = \begin{bmatrix} \frac{\partial f(x)}{\partial x_1} \\ \frac{\partial f(x)}{\partial x_2} \\ \vdots \\ \frac{\partial f(x)}{\partial x_n} \end{bmatrix}

只有当函数值为实数时函数的梯度才有定义(例如,f:Rn×nRnf:\mathbb{R}^{n \times n} \rightarrow \mathbb{R}^n的梯度就无定义,译者注),即,函数一定要返回一个标量,记住这一点十分重要。例如,我们不能对Ax,ARn×nAx,A \in \mathbb{R}^{n \times n}的每一个xx求梯度,因为它是一个向量。

根据偏导数的性质,可以得出下面的式子:

  • x(f(x)+g(x))=xf(x)+xg(x)\nabla_x \big( f(x) + g(x) \big) = \nabla_x f(x) + \nabla_x g(x)
  • 对每一个tRt \in \mathbb{R}x(tf(x))=txf(x)\nabla_x \big( t f(x) \big) = t \nabla_x f(x)

理论上,梯度是偏导数在多变量函数的自然延伸。然而,使用梯度有时候会因为符号而变得棘手。例如,ARm×nA \in \mathbb{R}^{m \times n}是一个固定系数的矩阵,xRnx \in \mathbb{R^n}是一个固定系数的向量。令f:RmRf:\mathbb{R}^m \rightarrow \mathbb{R}是由f(z)=zTzf(z) = z^T z定义的函数,这样的话zf(z)=2z\nabla_z f(z) = 2z。但是现在,请看以下式子:

f(Ax)\nabla f(Ax)

我们该如何解释该式子呢?至少有两种可能的解释:

  1. 第一种解释。因为zf(z)=2z\nabla_z f(z) = 2z,我们把f(Ax)\nabla f(Ax)解释成求AxAx处的梯度,因此,

f(Ax)=2(Ax)=2AxRm\nabla f(Ax) = 2(Ax) = 2Ax \in \mathbb{R}^m

  1. 第二种解释。我们把f(Ax)f(Ax)看成xx的函数,即,令g(x)=f(Ax)g(x) = f(Ax)。因此,

f(Ax)=xg(x)Rn\nabla f(Ax) = \nabla_x g(x) \in \mathbb{R}^n

这两种不同的解释的结果是完全不同的。第一个结果是一个m维度的向量,第二个结果是一个n维的向量。如何解决这个问题呢?

关键是要明确我们所求的微分变量。第一个例子里,我们对函数ff的每一个参数zz求微分,然后带入参数AxAx。第二个例子里,我们对复合函数g(x)=f(Ax)g(x) = f(Ax)的每一个xx求微分。我们定义,第一个例子为zf(Ax)\nabla_z f(Ax),第二个例子为xf(Ax)\nabla_x f(Ax)。你会在作业中发现,清楚的定义是极其重要的。

4.2 海森矩阵

设函数f:RnRf:\mathbb{R^n} \rightarrow \mathbb{R}xx的海森矩阵写作x2f(x)\nabla_x^2 f(x)或简记为HH,是一个n×nn \times n的偏导数矩阵。

x2f(x)Rn×n=[2f(x)x122f(x)x1x22f(x)x1xn2f(x)x2x12f(x)x222f(x)x2xn2f(x)xnx12f(x)xnx22f(x)xn2]\nabla_x^2 f(x) \in \mathbb{R}^{n \times n} = \begin{bmatrix} \frac{\partial^2 f(x)}{\partial x_1^2} & \frac{\partial^2 f(x)}{\partial x_1 \partial x_2} & \cdots & \frac{\partial^2 f(x)}{\partial x_1 \partial x_n} \\ \frac{\partial^2 f(x)}{\partial x_2 \partial x_1} & \frac{\partial^2 f(x)}{\partial x_2^2} & \cdots & \frac{\partial^2 f(x)}{\partial x_2 \partial x_n} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial^2 f(x)}{\partial x_n \partial x_1} & \frac{\partial^2 f(x)}{\partial x_n \partial x_2} & \cdots & \frac{\partial^2 f(x)}{\partial x_n^2} \end{bmatrix}

也记作

(x2f(x))ij=2f(x)xixj{\big(\nabla_x^2 f(x)\big)}_{ij} = \frac{\partial^2 f(x)}{\partial x_i \partial x_j}

注意Hessian是对称的

2f(x)xixj=2f(x)xjxi\frac{\partial^2 f(x)}{\partial x_i \partial x_j} = \frac{\partial^2 f(x)}{\partial x_j \partial x_i}

和梯度的定义类似,Hessian也只有当f(x)f(x)的返回值是实数时有定义。

可以很自然联想到,梯度类似函数的一阶导数,Hessian类似二阶导数(我们使用的符号也暗示了这种关系)。这个直觉总体上是正确的,但是也有少部分事项需要注意。

首先,返回值是实数的、只有一个变量的函数,f:RRf: \mathbb{R} \rightarrow \mathbb{R},基本的定义是二阶导数是一阶导数的导数,即

d2fdx2=ddxddxf(x)\frac{\mathrm{d}^2 f}{\mathrm{d} x^2} = \frac{\mathrm{d}}{\mathrm{d} x} \frac{\mathrm{d}}{\mathrm{d} x} f(x)

译者注:原文是2f(x)x2=xxf(x)\frac{\partial^2 f(x)}{\partial x^2} = \frac{\partial}{\partial x} \frac{\partial}{\partial x} f(x),但这里的函数只有一个变量,而偏导符号用于两个变量及以上,因此更改为求导符而不是求偏导符

然而,对于参数是向量的函数来说,函数的梯度是一个向量,我们无法对这个向量再求梯度,例如

xxf(x)=x[f(x)x1f(x)x2f(x)xn]\nabla_x \nabla_x f(x) = \nabla_x \begin{bmatrix} \frac{\partial f(x)}{\partial x_1} \\ \frac{\partial f(x)}{\partial x_2} \\ \vdots \\ \frac{\partial f(x)}{\partial x_n} \end{bmatrix}

这个式子是没有定义的。因此,不能说Hessian是梯度的梯度。但也几乎是正确的,比如下面的情形:如果我们取向量第ii项的梯度(xf(x))i=f(x)xi{\big(\nabla_x f(x)\big)}_i = \frac{\partial f(x)}{\partial x_i},然后对每一项取梯度,得到

xf(x)xi=[2f(x)xix12f(x)xix22f(x)xixn]\nabla_x \frac{\partial f(x)}{\partial x_i} = \begin{bmatrix} \frac{\partial^2 f(x)}{\partial x_i \partial x_1} \\ \frac{\partial^2 f(x)}{\partial x_i \partial x_2} \\ \vdots \\ \frac{\partial^2 f(x)}{\partial x_i \partial x_n} \end{bmatrix}

这正是Hessian的第ii列(或行)。因此

x2f(x)=[x(xf(x))1x(xf(x))2(xf(x))n]\nabla_x^2 f(x) = \begin{bmatrix} \nabla_x {\big(\nabla_x f(x)\big)}_1 \quad \nabla_x {\big(\nabla_x f(x)\big)}_2 \quad \cdots \quad {\big(\nabla_x f(x)\big)}_n \end{bmatrix}

粗略一点来说x2f(x)=x(xf(x))T\nabla_x^2 f(x) = \nabla_x(\nabla_x f(x))^T。只要我们知道它的意思是将(xf(x))T(\nabla_x f(x))^T的每一项分别求梯度,而不是对整个向量求梯度即可。

最后,虽然可求出矩阵ARnA \in \mathbb{R}^n的梯度,但在本课程里,我们仅考虑向量xRnx \in \mathbb{R}^n的Hessian矩阵。仅仅是为了方便(事实上,没有计算需要我们去求矩阵的Hessian矩阵),因为矩阵的Hessian矩阵需要表示出所有项的偏导数2AijAijAkl\frac{\partial^2 A_{ij}}{\partial A_{ij} \partial A_{kl}},一个矩阵是难以将这些表示出来的。

4.3 线性函数或二次函数的梯度和Hessian

现在,让我们试着定义一些简单函数的梯度或Hessian矩阵。应当指出,这里给出的梯度是CS229课程所给出梯度的特例。

对于xRnx \in \mathbb{R}^n,令f(x)=bTxf(x) = b^T x,其中bRnb \in \mathbb{R}^n是已知的向量。则

f(x)=i=1nbixif(x) = \sum_{i=1}^n b_i x_i

所以

f(x)xk=xki=1nbixi=bk\frac{\partial f(x)}{\partial x_k} = \frac{\partial}{\partial x_k} \sum_{i=1}^n b_i x_i = b_k

显然,xbTx=b\nabla_x b^Tx = b,与线性函数类比,ddxax=a\frac{\mathrm{d}}{\mathrm{d} x} ax = a

现在考虑二次函数f(x)=xTAxf(x) = x^T A x,对ASnA \in \mathbb{S}^n(对称阵),有

f(x)=i=1nj=1nAijxixjf(x) = \sum_{i=1}^n \sum_{j=1}^n A_{ij} x_i x_j

为了求偏导数,我们分开考虑包含xkx_kxk2x_k^2的情况:

f(x)xk=xki=1nj=1nAijxixj=xk[ikjkAijxixj+jkAikxixk+jkAkjxkxj+Akkxk2]=ikAikxi+jkAkjxj+2Akkxk=i=1nAikxi+j=1nAkjxj=2i=1nAkixi\begin{aligned} \frac{\partial f(x)}{\partial x_k} & = \frac{\partial}{\partial x_k} \sum_{i=1}^n \sum_{j=1} ^n A_{ij}x_ix_j \\ & = \frac{\partial}{\partial x_k}[\sum_{i \not = k} \sum_{j \not = k} A_{ij} x_i x_j + \sum_{j \not = k} A_{ik} x_i x_k + \sum_{j \not = k} A_{kj} x_k x_j + A_{kk} x_k^2] \\ & = \sum_{i \not = k} A_{ik} x_i + \sum_{j \not = k} A_{kj} x_j + 2A_{kk} x_k \\ & = \sum_{i=1}^n A_{ik} x_i + \sum_{j=1}^n A_{kj} x_j \\ & = 2\sum_{i=1}^n A_{ki} x_i \end{aligned}

最后一个等式是因为AA是对称的(因为它是一个二次型)。注意,xf(x)\nabla_x f(x)的第k项是AA的第k行和xx的内积。因此,xxTAx=2Ax\nabla_x x^T A x = 2Ax。我们再次和线性函数的二阶导数类比,即ddxax2=2ax\frac{\mathrm{d}}{\mathrm{d} x} ax^2 = 2ax

最后,让我们看一下二次函数f(x)=xTAxf(x) = x^T A x的Hessian(线性函数bTxb^Tx的Hessian显然是00矩阵)。即

2f(x)xkx=xk[f(x)x]=xk[2i=1nAixi]=2Ak\frac{\partial^2 f(x)}{\partial x_k \partial x_\ell} = \frac{\partial}{\partial x_k} [\frac{\partial f(x)}{\partial x_\ell}] = \frac{\partial}{\partial x_k} [2\sum_{i=1}^n A_{\ell i} x_i] = 2A_{\ell k}

因此,应当明确x2xTAx=2A\nabla_x^2 x^T A x = 2A,这和我们期望的一样(再次类比线性函数,d2dx2ax2=2a\frac{\mathrm{d}^2}{\mathrm{d} x^2} ax^2 = 2a)。
总结如下:

  • xbTx=b\nabla_x b^T x = b
  • xxTAx=2Ax\nabla_x x^T A x = 2Ax(若AA是对称阵)
  • x2xTAx=2A\nabla_x^2 x^T A x = 2A(若AA是对称阵)

4.4 最小二乘法

让我们用从上一节中得到的公式来推导最小二乘法。

给定矩阵ARm×nA \in \mathbb{R^{m \times n}}(为了简便假设AA满秩)和向量bRmb \in \mathbb{R^m},并且bR(A)b \notin \mathcal{R}(A)。这种情况下我们无法找到一个向量xRnx \in \mathbb{R^n},使得Ax=bAx = b。我们希望找到一个向量xx,使AxAx的值和bb越接近越好,用欧几里得范数Axb22{\| Ax - b \|}_2^2来表示这个接近的程度。

x22=xTx{\| x \|}_2^2 = x^Tx,于是,有

Axb22=(Axb)T(Axb)=xTATAx2bTAx+bTb\begin{aligned} {\| Ax - b \|}_2^2 & = (Ax - b)^T(Ax - b) \\ & = x^T A^T A x - 2b^T A x + b^T b \end{aligned}

求上式的结果对xx的梯度,结合我们上一节中的结论,有

x(xTATAx2bTAx+bTb)=xxTATAxx2bTAx+x bTb=2ATAx2ATb\begin{aligned} \nabla_x(x^T A^T A x - 2b^T A x + b^T b) & = \nabla_x x^T A^T A x - \nabla_x 2b^T A x + \nabla_x\ b^T b \\ & = 2A^T A x - 2A^T b \end{aligned}

令上式的最后一步等于00,解xx,得

x=(ATA)1ATbx = (A^T A)^{-1} A^T b

这与我们课堂上推导的结果是一致的。

4.5 行列式的梯度

我们可以找到函数相对于矩阵的梯度,现在,考虑这样一种情形,ARn×nA \in R^{n \times n},我们希望求出AA\nabla_A |A|。回顾我们对于导数的讨论,并且根据A|A|的计算公式

A=i=1n(1)i+jAijAi,j(j1,2,...,n)|A| = \sum_{i=1}^n (-1)^{i+j}A_{ij}|A_{\setminus i,\setminus j}| \qquad \qquad (j \in 1,2,...,n)

(这里就是行列式的计算方法,还可以用代数余子式来表示,译者注)

我们得出

AklA=Akli=1n(1)i+jAijAi,j=(1)k+lAk,l=(adj(A))lk\frac{\partial}{\partial{A_{kl}}} |A| = \frac{\partial}{\partial{A_{kl}}} \sum_{i=1}^n (-1)^{i+j}A_{ij}|A_{\setminus i,\setminus j}| = (-1)^{k+l}|A_{\setminus k,\setminus l}| = {\big(adj(A)\big)}_{lk}

根据伴随矩阵的性质,马上可以得到

AA=(adj(A))T=A(A1)T\nabla_A |A| = \big(adj(A)\big)^T = |A|(A^{-1})^T

现在,我们思考这么一个函数,f:S++nRf:S^n_{+ +} \rightarrow Rf(A)=logAf(A) = \log{|A|}。注意我们不得不限制ff的定义域为正定矩阵,因为这可以保证A>0|A| > 0,所以logA\log{|A|}为实数。这样我们就可以使用链式法则(没什么花里胡哨的,只是单变量微分的普通链式规则)来表示

logAAij=logAAAAij=1AAAij\frac{\partial \log{|A|}}{\partial A_{ij}} = \frac{\partial \log{|A|}}{\partial |A|} \frac{\partial |A|}{\partial A_{ij}} = \frac{1}{|A|} \frac{\partial |A|}{\partial A{_ij}}

显然,

AlogA=1AAA=A1\nabla_A \log{|A|} = \frac{1}{|A|} \nabla_A |A| = A^{-1}

类比单变量的情况,d/(dx)logx=1/x\mathrm{d} / (\mathrm{d} x) \log x = 1/x

4.6 特征值优化

最后,我们使用矩阵积分来解决一种最优化问题,分析这种方式可以直接导出特征值、特征向量。考虑下面的式子,等式约束下的最优化问题(条件极值问题,译者注):

maxxRnxTAx其中x22=1{max}_{x \in R^n} \quad x^TAx \quad \text{其中} {\|x\|}_2^2 = 1

对一个对称矩阵ARnA \in \mathbb{R^n},一个解决等式约束下最优化问题的标准方式是构造拉格朗日函数,目标函数要包括约束函数。本例中的拉格朗日函数可构造为:

L(x,λ)=xTAxλxTx\mathcal{L}(x, \lambda) = x^TAx - \lambda x^Tx

这里,λ\lambda叫做拉格朗日乘数,和约束函数相关联。可以确定$ x^* $是这个问题的最优解,在 $ x^* $ 点拉格朗日函数的梯度为0,即

xL(x,λ)=x(xTAxλxTx)=2ATx2λx=0\nabla_x \mathcal{L}(x, \lambda) = \nabla_x (x^TAx - \lambda x^Tx) = 2A^Tx - 2 \lambda x = 0

注意,这其实就是线性方程Ax=λxAx = \lambda x。这表明,在xTx=1x^Tx = 1的条件下使xTAxx^TAx取最大值(或最小值)的点就是AA的特征向量