前言

在笔者学习机器学习与深度的过程中,发现存在一些数学知识是会被经常用到,但是在理工科数学三大件(即高数,线代,概统)中未被提及的,例如本文的主题矩阵微分,或者叫矩阵求导。在数学分析中,我们会接触到的求导运算通常是如dx/dydx/dy一类标量对标量的求导,而矩阵微分,顾名思义就是涉及到向量与矩阵的求导。最典型的例子就是梯度下降,在梯度下降中,关键步骤就是损失函数对参数求导L/w{\partial L} / {\partial \boldsymbol{w}},损失函数值是一个标量,但是参数是一个向量,因此这是一个标量对向量的求导,这就涉及到矩阵微分了。

本文将从机器学习的角度,介绍矩阵微分中机器学习中最常用的部分,并不会详细的介绍整个矩阵微分理论,且本文会着重于数学推导,而不是简单的堆砌矩阵微分的计算公式。

注1:对梯度下降不了解的可以移步本站的梯度下降blog

注2:分享一个在线计算矩阵微分的网站Matrix Calculus,可以用于验证计算结果

定义

首先,我们要了解一下矩阵微分的定义,微分运算的自变量与因变量均有可能是标量,向量以及矩阵,因此有九种可能的微分运算,如下表

自变量\因变量 标量 yy 向量 y\boldsymbol{y} 矩阵 YY
标量 xx yx\frac{\partial y} {\partial x} yx\frac{\partial \boldsymbol{y}} {\partial x} Yx\frac{\partial Y} {\partial x}
向量 x\boldsymbol{x} yx\frac{\partial y} {\partial \boldsymbol{x}} yx\frac{\partial \boldsymbol{y}} {\partial \boldsymbol{x}} Yx\frac{\partial Y} {\partial \boldsymbol{x}}
矩阵 XX yX\frac{\partial y} {\partial X} yX\frac{\partial \boldsymbol{y}} {\partial X} YX\frac{\partial Y} {\partial X}

在上述的九种微分运算中,本文会关注标量对向量,矩阵的微分运算,以及向量,矩阵对标量的微分运算,也就是上表的第一行与第一列,因为这四种微分运算在机器学习与深度学习中最常被使用。

现在,让我们进入正题,讲讲我们关注的四种矩阵微分的定义,其实非常简单,首先是标量对向量,矩阵的微分运算,以向量为例,记

x=(x1,x2,,xm)T\boldsymbol{x} = (x_1, x_2, \cdots, x_m)^T

则标量yy对向量x\boldsymbol{x}求导为

yx=(yx1,yx2,,yxm)T\frac{\partial y} {\partial \boldsymbol{x}} = \left( \frac{\partial y} {\partial x_1}, \frac{\partial y} {\partial x_2}, \cdots, \frac{\partial y} {\partial x_m} \right)^T

其实就是标量yy对向量x\boldsymbol{x}中的每一个分量分别求导,然后再拼回一个向量,对矩阵求导则同理,即标量yy对矩阵XX中的每一个分量分别求导,然后再拼回一个矩阵。

不仅如此,向量,矩阵对标量的微分运算也是类似的,还是以向量为例,记

y=(y1,y2,,yn)T\boldsymbol{y} = (y_1, y_2, \cdots, y_n)^T

则向量y\boldsymbol{y}对标量xx求导为

yx=(y1x,y2x,,ynx)T\frac{\partial \boldsymbol{y}} {\partial x} = \left( \frac{\partial y_1} {\partial x}, \frac{\partial y_2} {\partial x}, \cdots, \frac{\partial y_n} {\partial x} \right)^T

就是向量y\boldsymbol{y}的每一个分量分别对标量xx求导,然后再拼回一个向量,矩阵同理。

分子布局与分母布局

说完了定义,我们还需要补充一个很重要的内容,矩阵微分的布局,其用于规定矩阵微分计算结果的形状,防止出现混乱。矩阵微分的布局一共有两种,分别为分子布局分母布局,其定义也很简单,分子布局代表计算结果的形状以分子的形状为主,而分母布局代表计算结果的形状以分母的形状为主,且分子布局与分母布局之间互为转置。以标量yy对向量x\boldsymbol{x}求导为例,向量x\boldsymbol{x}的形状为m×1m \times 1,且向量x\boldsymbol{x}的分母,因此在分母布局下,y/x{\partial y} / {\partial \boldsymbol{x}}的形状为m×1m \times 1,而在分子布局下,只需要进行转置即可,即y/x{\partial y} / {\partial \boldsymbol{x}}的形状为1×m1 \times m

对于本文关注的四种矩阵微分,其两种布局下的形状如下表

自变量\因变量 标量 yy 向量 yn×1\boldsymbol{y}_{n \times 1} 矩阵 Yn×mY_{n \times m}
标量 xx yx\frac{\partial \boldsymbol{y}} {\partial x}
分子布局:n×1n \times 1
分母布局:1×n1 \times n
Yx\frac{\partial Y} {\partial x}
分子布局:n×mn \times m
分母布局:m×nm \times n
向量 xm×1\boldsymbol{x}_{m \times 1} yx\frac{\partial y} {\partial \boldsymbol{x}}
分子布局:1×m1 \times m
分母布局:m×1m \times 1
矩阵 Xm×nX_{m \times n} yX\frac{\partial y} {\partial X}
分子布局:n×mn \times m
分母布局:m×nm \times n

注:布局相关的内容主要还是针对本文不涉及的四种矩阵微分运算的,因为其分子分母均为向量及矩阵,更加需要布局的规范

现在,我们了解了布局,那么在阅读机器学习资料的过程中,我们只要留意资料中的说明,明白资料中使用的是何种布局,就不会产生混乱了。但是,事实上有很多的资料都不会标注啦,这大概是因为大家多数时候都会约定俗成的使用一种“默认布局”(其实更可能是因为除了学数学的之外,大家都没有这种严谨的习惯)。

那么所谓的“默认布局”是分子布局还是分母布局呢?答案并没有这么简单啦,对于本文未提及的四种矩阵微分运算来说,“默认布局”就是分子布局,但是对于本文关注的四种矩阵微分运算来说,“默认布局”是一种被称为混合布局的布局方式。混合布局其实非常简单,让我们忘掉上面说的东西,现在有一个形状为m×1m \times 1的向量x\boldsymbol{x},那么y/x{\partial y} / {\partial \boldsymbol{x}}的形状是什么?大多数人的直觉肯定会觉得,既然向量x\boldsymbol{x}的形状为m×1m \times 1yy又是一个标量,那y/x{\partial y} / {\partial \boldsymbol{x}}的形状就按照向量x\boldsymbol{x}的形状来,是m×1m \times 1。同样的,有一个形状为n×1n \times 1的向量y\boldsymbol{y},那么y/x{\partial \boldsymbol{y}} / {\partial x}的形状是什么?按照上面的逻辑,应该是n×1n \times 1。这时候我们会发现,在这种按直觉进行的布局中,对于y/x{\partial y} / {\partial \boldsymbol{x}},我们使用了分母布局,而对于y/x{\partial \boldsymbol{y}} / {\partial x},我们使用了分子布局,这就是所谓的混合布局,也是所谓的“默认布局”。

定义法

接着让我们回归正题,既然讲完了定义,那么随着而来的自然是矩阵微分的定义法,从定义中我们可以知道,矩阵微分可以被拆分为多个标量求导运算,标量求导的运算我们都会算,因此把矩阵微分按照定义,拆分成多个标量求导运算,就是定义法。当然,这种方法非常的简单粗暴,因此其主要的用途是用于推导一些矩阵微分的计算公式,例如,y=aTxy = \boldsymbol{a}^T\boldsymbol{x},其中a\boldsymbol{a}x\boldsymbol{x}的形状都为m×1m \times 1,计算y/x{\partial y} / {\partial \boldsymbol{x}},根据定义法,将该矩阵微分拆解为yyx\boldsymbol{x}每一个分量分别求导,将yy拆开为

y=a1x1+a2x2++amxm=i=1maixiy = a_1 x_1 + a_2 x_2 + \cdots + a_m x_m = \sum_{i=1}^{m} a_i x_i

yyxix_i求导为

yxi=ai\frac{\partial y} {\partial x_i} = a_i

yx=(yx1,yx2,,yxm)T=(a1,a2,,am)T=a\frac{\partial y} {\partial \boldsymbol{x}} = \left( \frac{\partial y} {\partial x_1}, \frac{\partial y} {\partial x_2}, \cdots, \frac{\partial y} {\partial x_m} \right)^T = (a_1, a_2, \cdots, a_m)^T = \boldsymbol{a}

因此我们得到了一个矩阵微分的求导公式

aTxx=a\frac{\partial \boldsymbol{a}^T\boldsymbol{x}} {\partial \boldsymbol{x}} = \boldsymbol{a}

多数矩阵微分的求导公式都可以通过定义法进行推导。

微分法

介绍完矩阵微分的定义以及定义法,对于一些简单的矩阵微分,大家已经可以进行计算了,但是,这显然不够优雅,定义法本质上还是在算标量微分,我们应该需要一种在矩阵层面进行操作的方法,也就是本章节要介绍的微分法,这也是本文的绝对核心方法

矩阵形式

在正式开始介绍微分法之前,我想先做一些相关补充,以尽可能降低读者的理解门槛,由于接下来我们将从向量与矩阵的角度来进行操作,因此,会涉及到大量的矩阵形式,这个名字是我自己随便取的,大概意思就是会将标量内容写作向量或矩阵的形式,例如一个多元函数

y(x1,x2)=a1x1+a2x2y(x_1, x_2) = a_1 x_1 + a_2 x_2

写作向量形式就是

y(x1,x2)=a1x1+a2x2=(a1,a2)(x1x2)=aTxy(x_1, x_2) = a_1 x_1 + a_2 x_2 = (a_1, a_2) \begin{pmatrix} x_1 \\ x_2 \end{pmatrix} = \boldsymbol{a}^T \boldsymbol{x}

再例如

y(x1,x2,,xm)=x12+x22++xm2=(x1,x2,,xm)(x1x2xm)=xTxy(x_1, x_2, \cdots, x_m) = x_1^2 + x_2^2 + \cdots + x_m^2 = (x_1, x_2, \cdots, x_m) \begin{pmatrix} x_1 \\ x_2 \\ \cdots \\ x_m \end{pmatrix} = \boldsymbol{x}^T \boldsymbol{x}

这都是常见的矩阵形式的例子。矩阵形式并不是什么复杂的内容,且在后文中会大量使用,但是笔者发现鲜有教程提及,因此在此做为补充,希望对读者有所帮助。

注:如果读者对于矩阵形式不甚熟悉,我能给予的建议就是自己动手进行推导验证,包括后文的一些公式推导也是如此,主要的目的是让自己熟悉矩阵形式。其实学数学就是这样,对于一个陌生的概念与定理,最好的理解方法就是动手去算一些例子,去自己推导一遍定理,这一点数学系出身的笔者深有体会。

微分法的数学推导

微分

现在,让我们进入正题,所谓微分法,自然跟微分有关系,我知道,微分这个概念在数学分析中存在跟很低,大部分人都只记得导数了,所以这里我们简单复习一下,从一元函数开始,定义如下

df=f(x)dx{\rm d} f = f^{\prime} (x) {\rm d} x

到了多元函数,情况会更复杂一点,其定义为

df=fx1dx1+fx2dx2++fxmdxm{\rm d} f = \frac{\partial f} {\partial x_1} {\rm d} x_1 + \frac{\partial f} {\partial x_2} {\rm d} x_2 + \cdots + \frac{\partial f} {\partial x_m} {\rm d} x_m

上面的定义也被称为全微分,如果修过高数或者数分的读者,全微分期末考试应该是必考的。

标量对向量及矩阵的微分运算

现在,让我们结合一下上一小节提到的矩阵形式,将全微分写为矩阵形式,则为

df=fx1dx1+fx2dx2++fxmdxm=(fx1,fx2,,fxm)(dx1dx2dxm)=(fx)Tdx{\rm d} f = \frac{\partial f} {\partial x_1} {\rm d} x_1 + \frac{\partial f} {\partial x_2} {\rm d} x_2 + \cdots + \frac{\partial f} {\partial x_m} {\rm d} x_m = (\frac{\partial f} {\partial x_1}, \frac{\partial f} {\partial x_2}, \cdots, \frac{\partial f} {\partial x_m}) \begin{pmatrix} {\rm d} x_1 \\ {\rm d} x_2 \\ \cdots \\ {\rm d} x_m \end{pmatrix} = \left( \frac{\partial f} {\partial \boldsymbol{x}} \right)^T {\rm d} \boldsymbol{x}

至此,我们就得到了微分法的核心依赖公式,即

df=(fx)Tdx{\rm d} f = \left( \frac{\partial f} {\partial \boldsymbol{x}} \right)^T {\rm d} \boldsymbol{x}

这个公式说明,只要求出因变量的微分df{\rm d} f就可以得到矩阵微分f/x{\partial f} / {\partial \boldsymbol{x}},例如我们计算得到df=Adx{\rm d} f = A {\rm d} \boldsymbol{x},则f/x=AT{\partial f} / {\partial \boldsymbol{x}} = A^T

再进一步,如果自变量为矩阵XX,则

df=fx11dx11+fx12dx12++fxnmdxnm=tr[(fx11fx21fxn1fx12fx22fxn2fx1mfx2mfxnm)(dx11dx12dx1mdx21dx22dx2mdxn1dxn2dxnm)]=tr[(fX)TdX]{\rm d} f = \frac{\partial f} {\partial x_{11}} {\rm d} x_{11} + \frac{\partial f} {\partial x_{12}} {\rm d} x_{12} + \cdots + \frac{\partial f} {\partial x_{nm}} {\rm d} x_{nm} = \\ \mathrm{tr} \left[ \begin{pmatrix} \frac{\partial f} {\partial x_{11}} & \frac{\partial f} {\partial x_{21}} & \cdots & \frac{\partial f} {\partial x_{n1}} \\ \frac{\partial f} {\partial x_{12}} & \frac{\partial f} {\partial x_{22}} & \cdots & \frac{\partial f} {\partial x_{n2}} \\ \cdots & \cdots & \cdots & \cdots \\ \frac{\partial f} {\partial x_{1m}} & \frac{\partial f} {\partial x_{2m}} & \cdots & \frac{\partial f} {\partial x_{nm}} \end{pmatrix} \begin{pmatrix} {\rm d} x_{11} & {\rm d} x_{12} & \cdots & {\rm d} x_{1m} \\ {\rm d} x_{21} & {\rm d} x_{22} & \cdots & {\rm d} x_{2m} \\ \cdots & \cdots & \cdots & \cdots \\ {\rm d} x_{n1} & {\rm d} x_{n2} & \cdots & {\rm d} x_{nm} \end{pmatrix} \right] = \mathrm{tr} \left[ \left( \frac{\partial f} {\partial X} \right)^T {\rm d} X \right]

至此,我们也得到了矩阵情况下的微分法核心依赖公式,即

df=tr[(fX)TdX]{\rm d} f = \mathrm{tr} \left[ \left( \frac{\partial f} {\partial X} \right)^T {\rm d} X \right]

注1:上述公式中的tr\mathrm{tr}代表矩阵的迹(trace),其定义为矩阵对角线元素的和

注2:上述矩阵情况下的公式读者可以自行验证,也是一种常见的矩阵形式写法

向量及矩阵函数对标量的微分运算

而对于向量及矩阵函数对标量的微分运算,情况则更加简单,因为自变量是一个标量,因此其等价于一元函数的微分,即

df=fxdx,dF=Fxdx{\rm d} \boldsymbol{f} = \frac{\partial \boldsymbol{f}} {\partial x} {\rm d} x, \quad {\rm d} F= \frac{\partial F} {\partial x} {\rm d} x

微分法

综上,我们可以得到使用微分法计算矩阵微分的步骤

  1. 计算因变量fff\boldsymbol{f}FF的微分
  2. 根据微分与导数的关系,得到导数

四种矩阵微分运算与其导数的关系式如下表

自变量\因变量 标量 yy 向量 y\boldsymbol{y} 矩阵 YY
标量 xx dy=yxdx{\rm d} \boldsymbol{y} = \frac{\partial \boldsymbol{y}} {\partial x} {\rm d} x dY=Yxdx{\rm d} Y= \frac{\partial Y} {\partial x} {\rm d} x
向量 x\boldsymbol{x} dy=(yx)Tdx{\rm d} y = \left( \frac{\partial y} {\partial \boldsymbol{x}} \right)^T {\rm d} \boldsymbol{x}
矩阵 XX dy=tr[(yX)TdX]{\rm d} y = \mathrm{tr} \left[ \left( \frac{\partial y} {\partial X} \right)^T {\rm d} X \right]

微分运算法则

既然微分法的核心是计算微分,那我们就需要先学习一下矩阵微分的运算法则

  • 加减法:d(X±Y)=dX±dY{\rm d} (X \pm Y) = {\rm d} X \pm {\rm d} Y
  • 矩阵乘法:d(XY)=dXY+XdY{\rm d} (XY) = {\rm d} X Y + X {\rm d} Y
  • 转置:d(XT)=(dX)T{\rm d} (X^T) = ({\rm d} X)^T
  • 逆:d(X1)=X1dXX1{\rm d} (X^{-1}) = - X^{-1} {\rm d} X X^{-1}
  • 行列式:dX=tr(XdX){\rm d} |X| = {\rm tr} (X^{*} {\rm d} X)XX^*表示XX的伴随矩阵,若XX可逆,则dX=tr(X1dX){\rm d} |X| = {\rm tr} (X^{-1} {\rm d} X)
  • 迹:d(tr(X))=tr(dX){\rm d} ({\rm tr} (X)) = {\rm tr} ({\rm d} X)
  • Hadamard积:d(XY)=dXY+XdY{\rm d} (X \odot Y) = {\rm d} X \odot Y + X \odot {\rm d} Y,Hadamard表示两个形状相同的向量或矩阵逐元素相乘
  • 逐元素函数:dσ(X)=σ(X)dXd\sigma(X) = \sigma'(X) \odot dX

这里单独说一下逐元素函数,对于大多数标量函数来说,例如指数函数exe^x,将其输入改为向量或矩阵,意为使用该函数对向量或矩阵的每一个分量进行函数运算,即σ(X)=[σ(Xij)]\sigma(X) = [\sigma(X_{ij})],对这种求微分,就可以使用上述公式,以指数函数exe^x为例

deX=eXdX{\rm d} e^{X} = e^{X} \odot {\rm d} X

迹的运算法则与迹技巧

然后,由于在标量对矩阵求导的情况中,会涉及到矩阵的迹运算,因此,我们还需要复习一下矩阵的迹的运算法则以及一些常用的公式,一般称之为迹技巧(trace trick)

  • 加减法:tr(A±B)=tr(A)±tr(B){\rm tr} (A \pm B) = {\rm tr} (A) \pm {\rm tr} (B)
  • 转置:tr(AT)=tr(A){\rm tr} (A^T) = {\rm tr} (A)
  • 矩阵乘法交换:tr(AB)=tr(BA){\rm tr} (AB) = {\rm tr} (BA)AABTB^T的形状相同
  • 矩阵乘法复合Hadamard积:tr(AT(BC))=tr((AB)TC){\rm tr} (A^T (B \odot C)) = {\rm tr} ((A \odot B)^T C)

并且,由于标量套上迹之后没有任何变化,因此,即使在不涉及迹的情况下,也经常会出现给标量套上迹,然后使用迹技巧的做法。

实例

经过了无聊的堆公式环节,让我们正式进入实例环节

例1y=aTXby = \boldsymbol{a}^TX\boldsymbol{b}a\boldsymbol{a}的形状为n×1n \times 1XX的形状为n×mn \times mb\boldsymbol{b}的形状为m×1m \times 1

dy=aTdXb=tr(aTdXb)=tr(baTdX){\rm d} y = \boldsymbol{a}^T {\rm d} X \boldsymbol{b} = {\rm tr} (\boldsymbol{a}^T {\rm d} X \boldsymbol{b}) = {\rm tr} (\boldsymbol{b} \boldsymbol{a}^T {\rm d} X)

yX=(baT)T=abT\frac{\partial y} {\partial X} = (\boldsymbol{b} \boldsymbol{a}^T)^T = \boldsymbol{a} \boldsymbol{b}^T

注:上述计算过程使用了tr(AB)=tr(BA){\rm tr} (AB) = {\rm tr} (BA),把aTdX\boldsymbol{a}^T {\rm d} X看作AAb\boldsymbol{b}看作BB,这是该公式的常见用法

例2f=aTe(Xb)f = \boldsymbol{a}^T e^{(X\boldsymbol{b})}a\boldsymbol{a}的形状为n×1n \times 1XX的形状为n×mn \times mb\boldsymbol{b}的形状为m×1m \times 1

dy=aTd(e(Xb))=aT(e(Xb)d(Xb))=tr[aT(e(Xb)d(Xb))]=tr[(ae(Xb))Td(Xb)]=tr[(ae(Xb))TdXb]=tr[b(ae(Xb))TdX]{\rm d} y = \boldsymbol{a}^T {\rm d}(e^{(X\boldsymbol{b})}) = \boldsymbol{a}^T (e^{(X\boldsymbol{b})} \odot {\rm d} (X\boldsymbol{b})) = {\rm tr} [\boldsymbol{a}^T (e^{(X\boldsymbol{b})} \odot {\rm d} (X\boldsymbol{b}))] \\ = {\rm tr} [ (\boldsymbol{a} \odot e^{(X\boldsymbol{b})})^T {\rm d} (X\boldsymbol{b}) ] = {\rm tr} [ (\boldsymbol{a} \odot e^{(X\boldsymbol{b})})^T {\rm d} X \boldsymbol{b} ] = {\rm tr} [ \boldsymbol{b} (\boldsymbol{a} \odot e^{(X\boldsymbol{b})})^T {\rm d} X ]

yX=(b(ae(Xb))T)T=(ae(Xb))bT\frac{\partial y} {\partial X} = (\boldsymbol{b} (\boldsymbol{a} \odot e^{(X\boldsymbol{b})})^T)^T = (\boldsymbol{a} \odot e^{(X\boldsymbol{b})}) \boldsymbol{b}^T

链式法则

接着,我们来介绍矩阵微分中的链式法则,这也是矩阵微分计算中非常重要的技巧。链式法则用于计算复合函数的导数,简单来说,假设有两个函数y=f(x)y = f(x)以及x=h(t)x = h(t),可以通过计算y/x{\partial y} / {\partial x}以及x/t{\partial x} / {\partial t}来算得y/t{\partial y} / {\partial t}。对于标量的情况,只需要简单进行相乘即可,即

yt=yxxt\frac{\partial y} {\partial t} = \frac{\partial y} {\partial x} \frac{\partial x} {\partial t}

不过矩阵微分的情况要稍微复杂一点,这里我们直接通过一个例子来说明

:将上文例1进行简单的修改,依旧是y=aTXby = \boldsymbol{a}^TX\boldsymbol{b},再定义X=tcTX = \boldsymbol{t}\boldsymbol{c}^T,其中c\boldsymbol{c}的形状为m×1m \times 1t\boldsymbol{t}的形状为n×1n \times 1,计算y/t{\partial y} / {\partial \boldsymbol{t}}

首先,我们需要计算y/X{\partial y} / {\partial \boldsymbol{X}},将上文的计算结果拿过来,即

dy=tr(baTdX){\rm d} y = {\rm tr} (\boldsymbol{b} \boldsymbol{a}^T {\rm d} X)

保留微分形式是因为后续我们还需要在微分形式上做运算,接下来我们来计算dX{\rm d} X

dX=dtcT{\rm d} X = {\rm d} \boldsymbol{t}\boldsymbol{c}^T

将其代入上述dy{\rm d} y的计算式中

dy=tr(baTdX)=tr(baTdtcT)=tr(cTbaTdt){\rm d} y = {\rm tr} (\boldsymbol{b} \boldsymbol{a}^T {\rm d} X) = {\rm tr} (\boldsymbol{b} \boldsymbol{a}^T {\rm d} \boldsymbol{t}\boldsymbol{c}^T) = {\rm tr} (\boldsymbol{c}^T \boldsymbol{b} \boldsymbol{a}^T {\rm d} \boldsymbol{t})

yt=(cTbaT)T=abTc\frac{\partial y} {\partial \boldsymbol{t}} = (\boldsymbol{c}^T \boldsymbol{b} \boldsymbol{a}^T)^T = \boldsymbol{a} \boldsymbol{b}^T \boldsymbol{c}

如果有多层嵌套也是一样的,假设上述t\boldsymbol{t}之后还有一层复合,那么就继续计算dt{\rm d} \boldsymbol{t},然后代入。

矩阵微分在机器学习中的应用

最后,我们来讲一些机器学习中的经典例子

例1(线性回归):损失函数L=yXw2L = ||\boldsymbol{y} - X\boldsymbol{w}||^2,计算L/w{\partial L} / {\partial \boldsymbol{w}}

计算损失函数LL的微分

dL=dyXw2=d(yXw)T(yXw)=d(yXw)T(yXw)+(yXw)Td(yXw)=(Xdw)T(yXw)+(yXw)T(Xdw)=tr[(Xdw)T(yXw)]tr[(yXw)TXdw]=2tr[(yXw)TXdw]=2(yXw)TXdw=2(Xwy)TXdw{\rm d} L = {\rm d} ||\boldsymbol{y} - X\boldsymbol{w}||^2 = {\rm d} (\boldsymbol{y} - X\boldsymbol{w})^T (\boldsymbol{y} - X\boldsymbol{w}) = {\rm d} (\boldsymbol{y} - X\boldsymbol{w})^T (\boldsymbol{y} - X\boldsymbol{w}) + (\boldsymbol{y} - X\boldsymbol{w})^T {\rm d} (\boldsymbol{y} - X\boldsymbol{w}) \\ = (- X {\rm d} \boldsymbol{w})^T (\boldsymbol{y} - X\boldsymbol{w}) + (\boldsymbol{y} - X\boldsymbol{w})^T (- X {\rm d} \boldsymbol{w}) = - {\rm tr} [(X {\rm d} \boldsymbol{w})^T (\boldsymbol{y} - X\boldsymbol{w})] - {\rm tr} [(\boldsymbol{y} - X\boldsymbol{w})^T X {\rm d} \boldsymbol{w}] \\ = - 2 {\rm tr} [(\boldsymbol{y} - X\boldsymbol{w})^T X {\rm d} \boldsymbol{w}] = - 2 (\boldsymbol{y} - X\boldsymbol{w})^T X {\rm d} \boldsymbol{w} = 2 (X\boldsymbol{w} - \boldsymbol{y})^T X {\rm d} \boldsymbol{w}

Lw=2XT(Xwy)\frac{\partial L} {\partial \boldsymbol{w}} = 2 X^T (X\boldsymbol{w} - \boldsymbol{y})

例2(logistic回归):损失函数L(w)=yTlny^(1y)Tln(1y^)L(\boldsymbol{w}) = - \boldsymbol{y}^T \ln \hat{\boldsymbol{y}} - (\boldsymbol{1} - \boldsymbol{y})^T \ln (\boldsymbol{1} - \hat{\boldsymbol{y}}),其中y^=σ(Xw)\hat{\boldsymbol{y}} = \sigma(X \boldsymbol{w})sigmoid函数σ(x)=1/1+ex\sigma(x) = {1}/{1 + e^{-x}},计算L/w{\partial L} / {\partial \boldsymbol{w}}

由于损失函数比较复杂,使用链式法则进行逐层运算,首先计算L/y^{\partial L} / {\partial \hat{\boldsymbol{y}}}

dL=yTdlny^(1y)Tdln(1y^)=yT(1y^dy^)(1y)T(11y^dy^)=(1y)T(11y^dy^)yT(1y^dy^)=tr[(1y)T(11y^dy^)]tr[yT(1y^dy^)]{\rm d} L = - \boldsymbol{y}^T {\rm d} \ln \hat{\boldsymbol{y}} - (\boldsymbol{1} - \boldsymbol{y})^T {\rm d} \ln (\boldsymbol{1} - \hat{\boldsymbol{y}}) = - \boldsymbol{y}^T \left( \frac{1}{\hat{\boldsymbol{y}}} \odot {\rm d} \hat{\boldsymbol{y}} \right) - (\boldsymbol{1} - \boldsymbol{y})^T \left( \frac{1}{\boldsymbol{1} - \hat{\boldsymbol{y}}} \odot {\rm d} \hat{\boldsymbol{y}} \right) \\ = (\boldsymbol{1} - \boldsymbol{y})^T \left( \frac{1}{\boldsymbol{1} - \hat{\boldsymbol{y}}} \odot {\rm d} \hat{\boldsymbol{y}} \right) - \boldsymbol{y}^T \left( \frac{1}{\hat{\boldsymbol{y}}} \odot {\rm d} \hat{\boldsymbol{y}} \right) = {\rm tr} \left[ (\boldsymbol{1} - \boldsymbol{y})^T \left( \frac{1}{\boldsymbol{1} - \hat{\boldsymbol{y}}} \odot {\rm d} \hat{\boldsymbol{y}} \right) \right] - {\rm tr} \left[ \boldsymbol{y}^T \left( \frac{1}{\hat{\boldsymbol{y}}} \odot {\rm d} \hat{\boldsymbol{y}} \right) \right]

tr[(1y)T(11y^dy^)]=tr[((1y)11y^)Tdy^]{\rm tr} \left[ (\boldsymbol{1} - \boldsymbol{y})^T \left( \frac{1}{\boldsymbol{1} - \hat{\boldsymbol{y}}} \odot {\rm d} \hat{\boldsymbol{y}} \right) \right] = {\rm tr} \left[ \left( (\boldsymbol{1} - \boldsymbol{y}) \odot \frac{1}{\boldsymbol{1} - \hat{\boldsymbol{y}}} \right)^T {\rm d} \hat{\boldsymbol{y}} \right]

tr[yT(1y^dy^)]=tr[(y1y^)Tdy^]{\rm tr} \left[ \boldsymbol{y}^T \left( \frac{1}{\hat{\boldsymbol{y}}} \odot {\rm d} \hat{\boldsymbol{y}} \right) \right] = {\rm tr} \left[ \left( \boldsymbol{y} \odot \frac{1}{\hat{\boldsymbol{y}}} \right)^T {\rm d} \hat{\boldsymbol{y}} \right]

dL=tr[((1y)11y^)Tdy^]tr[(y1y^)Tdy^]=[((1y)11y^)T(y1y^)T]dy^{\rm d} L = {\rm tr} \left[ \left( (\boldsymbol{1} - \boldsymbol{y}) \odot \frac{1}{\boldsymbol{1} - \hat{\boldsymbol{y}}} \right)^T {\rm d} \hat{\boldsymbol{y}} \right] - {\rm tr} \left[ \left( \boldsymbol{y} \odot \frac{1}{\hat{\boldsymbol{y}}} \right)^T {\rm d} \hat{\boldsymbol{y}} \right] \\ = \left[ \left( (\boldsymbol{1} - \boldsymbol{y}) \odot \frac{1}{\boldsymbol{1} - \hat{\boldsymbol{y}}} \right)^T - \left( \boldsymbol{y} \odot \frac{1}{\hat{\boldsymbol{y}}} \right)^T \right] {\rm d} \hat{\boldsymbol{y}}

接着计算dy^{\rm d} \hat{\boldsymbol{y}}

dy^=dσ(Xw)=σ(Xw)d(Xw)=σ(Xw)(Xdw){\rm d} \hat{\boldsymbol{y}} = {\rm d} \sigma(X \boldsymbol{w}) = \sigma^\prime(X \boldsymbol{w}) \odot {\rm d} (X \boldsymbol{w}) = \sigma^\prime(X \boldsymbol{w}) \odot (X {\rm d} \boldsymbol{w})

其中

σ(Xw)=σ(Xw)(1σ(Xw))=y^(1y^)\sigma^\prime(X \boldsymbol{w}) = \sigma(X \boldsymbol{w}) (\boldsymbol{1} - \sigma(X \boldsymbol{w})) = \hat{\boldsymbol{y}} (\boldsymbol{1} - \hat{\boldsymbol{y}})

将其代入上式

dL=[((1y)11y^)T(y1y^)T]dy^=[((1y)11y^)T(y1y^)T]σ(Xw)(Xdw)=tr[[((1y)11y^)(y1y^)]Tσ(Xw)(Xdw)]=tr[[[((1y)11y^)(y1y^)]σ(Xw)]TXdw]=tr[[((1y)y^)(y(1y^))]TXdw]=[((1y)y^)(y(1y^))]TXdw{\rm d} L = \left[ \left( (\boldsymbol{1} - \boldsymbol{y}) \odot \frac{1}{\boldsymbol{1} - \hat{\boldsymbol{y}}} \right)^T - \left( \boldsymbol{y} \odot \frac{1}{\hat{\boldsymbol{y}}} \right)^T \right] {\rm d} \hat{\boldsymbol{y}} \\ = \left[ \left( (\boldsymbol{1} - \boldsymbol{y}) \odot \frac{1}{\boldsymbol{1} - \hat{\boldsymbol{y}}} \right)^T - \left( \boldsymbol{y} \odot \frac{1}{\hat{\boldsymbol{y}}} \right)^T \right] \sigma^\prime(X \boldsymbol{w}) \odot (X {\rm d} \boldsymbol{w}) \\ = {\rm tr} \left[ \left[ \left( (\boldsymbol{1} - \boldsymbol{y}) \odot \frac{1}{\boldsymbol{1} - \hat{\boldsymbol{y}}} \right) - \left( \boldsymbol{y} \odot \frac{1}{\hat{\boldsymbol{y}}} \right) \right]^T \sigma^\prime(X \boldsymbol{w}) \odot (X {\rm d} \boldsymbol{w}) \right] \\ = {\rm tr} \left[ \left[ \left[ \left( (\boldsymbol{1} - \boldsymbol{y}) \odot \frac{1}{\boldsymbol{1} - \hat{\boldsymbol{y}}} \right) - \left( \boldsymbol{y} \odot \frac{1}{\hat{\boldsymbol{y}}} \right) \right] \odot \sigma^\prime(X \boldsymbol{w}) \right]^T X {\rm d} \boldsymbol{w} \right] \\ = {\rm tr} \left[ \left[ ((\boldsymbol{1} - \boldsymbol{y}) \odot \hat{\boldsymbol{y}} \right) - \left( \boldsymbol{y} \odot (\boldsymbol{1} - \hat{\boldsymbol{y}})) \right]^T X {\rm d} \boldsymbol{w} \right] = \left[ ((\boldsymbol{1} - \boldsymbol{y}) \odot \hat{\boldsymbol{y}} \right) - \left( \boldsymbol{y} \odot (\boldsymbol{1} - \hat{\boldsymbol{y}})) \right]^T X {\rm d} \boldsymbol{w}

Lw=XT[((1y)y^)(y(1y^))]\frac{\partial L} {\partial \boldsymbol{w}} = X^{T} [ ((\boldsymbol{1} - \boldsymbol{y}) \odot \hat{\boldsymbol{y}}) - (\boldsymbol{y} \odot (\boldsymbol{1} - \hat{\boldsymbol{y}})) ]

例3(softmax回归):损失函数为L(W)=tr(YTlnY^)L(W) = - \mathrm{tr} (Y^T \ln \hat{Y}),其中Y^=softmax(XW)\hat{Y} = \mathrm{softmax}(XW),计算L/w{\partial L} / {\partial \boldsymbol{w}}

由于在数学上,多样本的softmax函数写起来比较复杂,并且也不利于后续操作,因此,这里我们可以选择曲线救国,先计算单样本情况下的导数,再使用定义法扩展至多样本,会简单不少。在单样本的情况下,损失函数为L(w)=yTlny^L(\boldsymbol{w}) = - \boldsymbol{y}^T \ln \hat{\boldsymbol{y}},其中y^=softmax(Xw)\hat{\boldsymbol{y}} = \mathrm{softmax}(X \boldsymbol{w})softmax函数softmax(x)=ex/1Tex\mathrm{softmax}(\boldsymbol{x}) = { e^{\boldsymbol{x}} }/{\boldsymbol{1}^T e^{\boldsymbol{x}}}

定义z=Xw\boldsymbol{z} = X \boldsymbol{w},并将y^\hat{\boldsymbol{y}}代入,因为softmax函数中包含指数运算,代入之后配合对数运算会好处理很多

L(w)=yTlny^=yTlnez1Tez=yTz+yT1ln(1Tez)=yTz+ln(1Tez)L(\boldsymbol{w}) = - \boldsymbol{y}^T \ln \hat{\boldsymbol{y}} = - \boldsymbol{y}^T \ln \frac{ e^{\boldsymbol{z}} }{\boldsymbol{1}^T e^{\boldsymbol{z}}} = - \boldsymbol{y}^T \boldsymbol{z} + \boldsymbol{y}^T \boldsymbol{1} \ln (\boldsymbol{1}^T e^{\boldsymbol{z}}) = - \boldsymbol{y}^T \boldsymbol{z} + \ln (\boldsymbol{1}^T e^{\boldsymbol{z}})

注意到ln(a/b)=lna1lnb\ln (\boldsymbol{a} / b) = \ln \boldsymbol{a} - \boldsymbol{1} \ln ba\boldsymbol{a}为向量,bb为标量,因此需要使用全一向量进行维度扩展,且yT1=1\boldsymbol{y}^T \boldsymbol{1} = 1,因为y\boldsymbol{y}是只有一个分量为11,剩余分量均为00的向量。

再计算微分

dL=yTdz+dln(1Tez)=yTdz+(11Tezd1Tez)=yTdz+[11Tez(1T(ezdz))]=yTdz+(ez)Tdz1Tez=((ez)T1TezyT)dz=(softmax(z)TyT)dz{\rm d} L = - \boldsymbol{y}^T {\rm d} \boldsymbol{z} + {\rm d} \ln (\boldsymbol{1}^T e^{\boldsymbol{z}}) = - \boldsymbol{y}^T {\rm d} \boldsymbol{z} + \left( \frac{1}{\boldsymbol{1}^T e^{\boldsymbol{z}}} \odot {\rm d} \boldsymbol{1}^T e^{\boldsymbol{z}} \right) = - \boldsymbol{y}^T {\rm d} \boldsymbol{z} + \left[ \frac{1}{\boldsymbol{1}^T e^{\boldsymbol{z}}} \odot \left( \boldsymbol{1}^T (e^{\boldsymbol{z}} \odot {\rm d} \boldsymbol{z}) \right) \right] \\ = - \boldsymbol{y}^T {\rm d} \boldsymbol{z} + \frac{ (e^{ \boldsymbol{z} })^T {\rm d} \boldsymbol{z} }{ \boldsymbol{1}^T e^{ \boldsymbol{z} } } = \left( \frac{ (e^{ \boldsymbol{z} })^T }{ \boldsymbol{1}^T e^{ \boldsymbol{z} } } - \boldsymbol{y}^T \right) {\rm d} \boldsymbol{z} = \left( {\rm softmax} (\boldsymbol{z})^T - \boldsymbol{y}^T \right) {\rm d} \boldsymbol{z}

上述运算中,有两个需要提及的点,第一,由于1Tez\boldsymbol{1}^T e^{\boldsymbol{z}}是标量,所以逐元素相乘相当于直接相乘,第二,上述计算中使用了公式

1T(ab)=aTb1T(ezdz)=(ez)Tdz\boldsymbol{1}^T (\boldsymbol{a} \odot \boldsymbol{b}) = \boldsymbol{a}^T \boldsymbol{b} \quad \Rightarrow \quad \boldsymbol{1}^T (e^{\boldsymbol{z}} \odot {\rm d} \boldsymbol{z}) = (e^{\boldsymbol{z}})^T {\rm d} \boldsymbol{z}

综上

Lz=softmax(z)y\frac{\partial L} {\partial \boldsymbol{z}} = {\rm softmax} (\boldsymbol{z}) - \boldsymbol{y}

扩展到多样本为

LZ=softmax(Z)Y\frac{\partial L} {\partial Z} = {\rm softmax} (Z) - Y

其中Z=XWZ = XW,计算dZ=XdW{\rm d} Z = X {\rm d}W,故

dL=(softmax(Z)TYT)XdW{\rm d} L = ({\rm softmax} (Z)^T - Y^T) X {\rm d} W

LW=XT(softmax(Z)Y)=XT(Y^Y)\frac{\partial L} {\partial W} = X^T ({\rm softmax} (Z) - Y) = X^T (\hat{Y} - Y)