矩阵求导

上一篇文章从数学角度上分析了过拟合产生的原因以及在损失函数中添加正则化从而在一定程度上避免过拟合,并从MLE和MAP两个角度来对线性回归进行建模,进而求解。然而在求解过程中,涉及到一些矩阵求导的基础知识,由于篇幅原因,现在本篇文章中做一个简要说明。

对一元函数 \(y=f(x)\),输入是一维变量(标量),输出也是一个标量。那么:

\[\dfrac{dy}{dx} = \dfrac{df(x)}{dx}, dy = \dfrac{df(x)}{dx}dx,(1) \]

对于二元函数\(y=f(x), x = (x_{1}, x_{2})^{T}\),输入是一维变量(标量),输出也是一个标量。那么:

\[\dfrac{\partial y}{\partial x_{1}} = \dfrac{\partial f(x)}{dx_{1}}, \dfrac{\partial y}{\partial x_{2}} = \dfrac{\partial f(x)}{dx_{2}}, dy = \dfrac{\partial f(x)}{dx_{1}} dx_{1} + \dfrac{\partial f(x)}{dx_{2}} dx_{2},(2) \]

相应地,若输入变量为\(n\)维度,即\(x = (x_{1}, x_{2},...,x_{n})^{T}\),那么:

\[dy = \dfrac{\partial f(x)}{dx_{1}} dx_{1}+\dfrac{\partial f(x)}{dx_{2}} dx_{2}+...+\dfrac{\partial f(x)}{dx_{n}} dx_{n} = \sum_{i=1}^{n} \dfrac{\partial f(x)}{dx_{i}} dx_{i},(3) \]

在这里,由于 \(y\) 是一个标量,标量对向量求导就等于标量对向量里的每一个元素分别求导,所以:

\[\dfrac{\partial f(x)}{dx} = (\dfrac{\partial f(x)}{dx_{1}}, \dfrac{\partial f(x)}{dx_{2}},...,\dfrac{\partial f(x)}{dx_{n}}),(4) \]

所以我们可以得到n维输入向量的全微分矩阵表示形式:

\[dy = \dfrac{\partial f(x)}{dx}^{T} dx,(5) \]

由于之前提到过,统计学习的输入通常是向量,而不管以后的BP神经网络,深度学习中的大部分输入(比如图像超分辨率,图像去噪,图像分割)等都是以向量的方式输入,最后的损失函数一般选取\(L_{1}, L_{2}\)或者交叉熵等标量,因此本文重点讨论标量对向量的求导过程。

根据上述公式,找出标量对输入的导数,只需要将公式转换为全微分的形式,在 \(dx\) 之前的就是所要求的结果。类似于一元/二元微积分,由于向量运算的特殊性质,仍需要重新定义一套基本的求导法则,然后根据简单的求导法则逐步去求解更为复杂的函数导数。

\[d(x \pm y) = dx \pm dy, d(xy) = (dx)y + xdy, d(x^{T}) = (dx)^{T},(6) \]

\[df(x) = f'(x) \odot dx, d(x \odot y) = (dx) \odot y + x \odot dy,(7) \]

下面利用这些公式对 \(X^{-1}\) 的导数进行证明:

\[d(x^{-1}) = -x^{-1}(dx)x^{-1},(8) \]

证明:

\[xx^{-1} = I, 于是:dxx^{-1} = (dx)x^{-1} + xdx^{-1} = 0,d(x^{-1}) = -x^{-1}(dx)x^{-1} \]

有了上述的基础之后,我们来再一次求解上节中的线性回归问题,问题描述如下:

\[Loss = \dfrac{1}{2} \sum (y_{i}-x_{i}w)^{2} = \dfrac{1}{2} (y-xw)^{2},(9) \]

求解过程:

\[dLoss = d(y-xw)^{2} = d(y-xw)^{T}(y-xw),(10) \]

展开后,得公式(11):

\[d(y-xw)^{T}(y-xw) = d(y-xw)^{T}(y-xw) + (y-xw)^{T}d(y-xw) \]

计算到这里,似乎陷入了僵局,由于个人能力有限,无法对上式再进行进一步地化简,那么就必须引入另外的一个概念来帮助我们求解。

矩阵的迹:

矩阵的迹表示行列式主对角线上所有元素的和,即为两个矩阵的元素乘积。下面借用一个例子来解释一下这个概念:

\[A = [a_{11}, a_{12}; a_{21}, a_{22};], B = [b_{11}, b_{12}; b_{21}, b_{22};] \]

那么:

\[trace(A^{T}B) = trace( [a_{11},a_{12}; a_{21}, a_{22};]^{T} [b_{11}, b_{12}; b_{21}, b_{22};]) \]

所以:

\[trace(A^{T}B) = a_{11}b_{11}+a_{12}b_{12}+a_{21}b_{21}+a_{22}b_{22} \]

于是,公式(5)可以表示为:

\[dy = \dfrac{\partial f(x)}{dx}^{T} dx = trace(\dfrac{\partial f(x)}{dx}^{T} dx), (12) \]

因此,通过将全微分化成矩阵的迹的形式,便可以找到偏导数。似乎看起来并没有什么用,那么通过下面的性质,便可以轻松地对公式(11)进行求解。

\[tr(a) = a, tr(A^{T}) = A, tr(A \pm B) = tr(A) \pm tr(B), tr(AB) = tr(BA) \]

下面继续求解公式(11):

\[d(y-xw)^{T}(y-xw) = d(y-xw)^{T}(y-xw) + (y-xw)^{T}d(y-xw) \\ = ((y-xw)^{T}d(y-xw))^{T}+ (y-xw)^{T}d(y-xw) \]

又因为:

\[tr(((y-xw)^{T}d(y-xw))^{T}+ (y-xw)^{T}d(y-xw)) = tr(((y-xw)^{T}d(y-xw))^{T}) + tr((y-xw)^{T}d(y-xw)) \\ = 2tr((y-xw)^{T}d(y-xw)) \]

所以:

\[-(y-xw)^{T}x = -(x^{T}(y-xw)) = x^{T}y-x^{T}xw = 0 \]

解得:\(w = (x^{T}x)^{-1}x^{T}y\)

再来看一个例子:求 \(f = a^{T}xb\)\(x\) 的偏导数 \(\partial f / \partial x\)

首先通过全微分展开,由于 \(a, b\) 均不是\(x\)的函数,因此我们得到:

\[df = d(a^{T}xb) = a^{T}d(x)b = a^{T}(dx)b \]

由于矩阵无法随意交换乘法的位置,通过trace的性质,我们得到:

\[tr(a^{T}(dx)b) = tr(ba^{T}dx) \]

因此:\(\dfrac{\partial f}{\partial x} = (ba^{T})^{T} = ab^{T}\)

posted @ 2021-06-22 13:30  ZhiboZhao  阅读(509)  评论(0编辑  收藏  举报