矩阵向量求导
摘自:https://www.cnblogs.com/pinard/p/10825264.html,并加入了自己的一丢丢想法。
说明1
- 在矩阵向量求导中,可以采用定义法,微分法和链式求导法。
- 选择:优先选择链式求导法,其次选择微分法,最后使用定义法。
- 无论采用哪种方法都涉及到求导布局的问题,应首先掌握求导布局。
说明2
- 符号约定:
- x小写字母表示标量。
- x小写黑体字母表示向量(默认是列向量)。
- X大写字母表示矩阵。
- 求导布局约定:
- 标量对向量求导和标量对矩阵求导均采用分母布局,保证求导的结果使得和向量或矩阵同型。
- 向量对标量求导和矩阵对标量求导均采用分子布局,保证求导的结果使得和向量或矩阵同型。
- 向量对向量求导采用分子布局,即雅克比式
- 其他约定:
- 不涉及以下求导
- 标量对标量求导【因为这个相比较其他的求导方式来说,简单了】
- 向量对矩阵的求导【遇到的不多】
- 矩阵对矩阵的求导【遇到的不多】
- 矩阵对矩阵的求导【遇到的不多】
- 想深入了解,请参见:https://www.cnblogs.com/pinard/p/10930902.html
1.定义法
- 标量对向量或对矩阵求导,采用分母布局;向量对向量求导采用分子布局。
1. 用定义法求解标量对向量求导
举个例子
y=aTx,求解∂x∂y。
∂xi∂y=xi∂aTx=∂xi∂∑j=1najxj=ai
-
因为采用分母布局,结果应该和分母(列向量)同型,所以
∂x∂aTx=a
-
同理,采用分母布局计算∂x∂xTa:
∂x∂xTa=a
y=xTx,求解∂x∂y。
-
将标量(分子)完全展开
∂xi∂y=xi∂xTx=∂xi∂j=1∑nxjxj=2xj
-
因为采用分母布局,结果应该和分母(列向量)同型,所以
-
∂x∂aTx=2x
y=xTAx,求解∂x∂y。
-
将标量(分子)完全展开
∂xk∂xTAx=∂xk∂i=1∑nj=1∑nxiAijxj=i=1∑nAikxk+i=j∑nAjkxk=ATx+Ax
-
可以发现,这个最后写成矩阵表达形式不像上面那么简单。
定义法求导对于简单的实值函数是很容易的,但是复杂的实值函数就算求出了任意一个分量的导数,要排列出最终的求导结果还挺麻烦的,因此我们需要找到其他的简便一些的方法来整体求导,而不是每次都先去针对任意一个分量,再进行排列。
2.用定义法求解标量对矩阵求导
- 解决矩阵标量。
举个例子
y=aTXb,求解∂X∂aTXb。Xm∗n,am∗1,bn∗1
-
将标量(分子)完全展开
∂X∂aTXb=∂Xij∂p=1∑mq=1∑napXpabq=∂Xij∂aiXijbj=aibj
-
采用分母布局,最终结果为m∗n的矩阵。所以有
∂X∂aTXb=abT
3.用定义法求解向量对向量的求导
- 解决向量向量。
举个例子
y=Ax,求解∂x∂Ax。Am∗n,xn∗1,ym∗1。
-
根据向量对向量的求导的结果应该为m∗n维的矩阵。
-
先求矩阵的第i行和向量的内积对向量的第j分量求导,用定义法求解过程如下:
∂xj∂Aix=∂xj∂k=1∑nAikxk=Aij
-
矩阵 A的第i行和向量的内积对向量的第j分量求导的结果就是矩阵 A的(i,j)位置的值。
-
因为采用了分子布局,所以求导结果为A;而不是采用分母布局后的AT。
- 可见求导布局对于最后结果的输出的影响是很大的。结果上差一个转置。
小结
==使用定义法虽然已经求出一些简单的向量矩阵求导的结果,但是对于复杂的求导式子,则中间运算会很复杂,=同时求导出的结果排列也是很麻烦。==所以需要引入微分法。
2. 微分法
- 使用微分法来求解标量对向量的求导,以及标量对矩阵的求导。
- 标量对向量的求导,以及标量对矩阵的求导使用分母布局。
1.矩阵微分
- 解决(向量标量,矩阵标量)。
1.单变量
2.多变量
3.矩阵微分
迹函数
i=1∑mj=1∑nAijBji=tr(ATB)
-
其中A,B同型。
-
举个例子:
X=⎝⎛x11x21x31x12x22x31⎠⎞dX=⎝⎛dx11dx21dx31dx12dx22dx31⎠⎞∴df=∂x11∂fdx11+∂x21∂fdx21+∂x31∂fdx31+∂x12∂fdx12+∂x22∂fdx22+∂x32∂fdx32
∴df=tr(⎝⎜⎛∂x11∂f∂x21∂f∂x31∂f∂x12∂f∂x22∂f∂x23∂f⎠⎟⎞T⎝⎛dx11dx21dx31dx12dx22dx31⎠⎞)
其中:
⎝⎜⎛∂x11∂f∂x21∂f∂x31∂f∂x12∂f∂x22∂f∂x23∂f⎠⎟⎞T⎝⎛dx11dx21dx31dx12dx22dx31⎠⎞=(∂x11∂fdx11+∂x21∂fdx21+∂x31∂fdx31∗∗∂x12∂fdx12+∂22∂fdx22+∂x32∂fdx32)
所以:
df=tr((X∂f)TdX)
统一表示
- 上面矩阵微分的式子,可以看到矩阵微分和它的导数也有一个转置的关系,不过在外面套了一个迹函数而已。由于标量的迹函数就是它本身,那么矩阵微分和向量微分可以统一表示。即:
向量微分:df=tr((∂x∂f)Tdx)矩阵微分:df==tr((X∂f)TdX)
2.矩阵微分性质和迹函数的性质
矩阵微分的性质
- 微分加减法:d(X+Y)=dX+dY。
- 微分乘法:d(XY)=(dX)Y+X(dY)。
- 微分转置:d(xT)=(dX)T。
- 微分的迹:tr(dX)=d(tr(X))。
- 微分的哈达玛积:d(X⊙Y)=d(X)⊙d(Y)。
- 逐个元素求导:d(σ′(X))=σ′(X)⊙d(X)。
- 逆矩阵微分:d(X−1)=−X−1d(X)X−1。
- 行列式微分:d(∣X∣)=∣X∣tr(X−1dX)。
说明:
- 其中的哈达玛积的计算,一般表示为A⊙B或A∘B,参考百度即可:哈达玛积
- 上述的逆矩阵的微分和行列式的微分,个人并没有推导。
迹函数的性质
- 标量的迹等于它本身:tr(y)=y。
- 矩阵转置不改变迹的值:tr(AT)=tr(A)。
- 迹满足交换律:tr(AB)=tr(BA),其中A,BT同型。
- 迹的加减法:tr(X+Y)=tr(X)+tr(Y);tr(X−Y)=tr(X)−tr(Y)。
- 矩阵乘法和迹交换:tr((A⊙B)T⊙C)=tr(AT(B⊙C))。其中A,B,C同型。
3.使用微分法对矩阵向量求导
1.法则
若标量函数f是矩阵X经加减乘法、逆、行列式、逐元素函数等运算构成。
- 则使用相应的运算法则对f求微分。
- 再使用迹函数技巧给df套上迹。
- 并将其它项交换至dX左侧。
- 那么对于迹函数里面在dX左边的部分,我们只需要加一个转置就可以得到导数了。
2.例子
例1
y=aTXb,求∂X∂y。am∗1,Xm∗n,bn∗1,y1∗1。类型矩阵标量,y是一个标量,dy也是一个标量。
求解步骤:
-
使用微分法的乘法对f求微分。
dy=d(aT)Xb+aTd(X)b+aTXd(b)=aTd(X)b
- 因为最终是对X求导(dX),那么微分中不含dX的最终结果都为0。
-
等式两边进行取迹(tr)操作。
dy=tr(dy)=tr(aTd(X)b)=tr(baTd(X))
- 第一个等式成立是因为,标量的迹等于它本身,
- 第二等式成立是因为,那本身等式的两边取迹。
- 第三个等式成立是为,迹函数的性质三。
-
已经将dX放在迹内的最右侧了,那么其前面的部分加上转置就是求导后的结果。
∂X∂f=(baT)T=abT
查表Scalar-by-matrix identities的第8行,结果一致。采用分母布局。
例2
y=aTexp(Xb),求∂X∂y。am∗1,Xm∗n,bn∗1,y1∗1。类型矩阵标量,y是一个标量,dy也是一个标量。
-
dy=d(a)exp(Xb)+aTd(exp(Xb))=aTd(exp(Xb))=aTexp(Xb)⊙d(Xb)=aTexp(Xb)⊙(d(X)b)
- 第三个等式成立,是很显然的,用到哈达玛积。
- 第四个等式成立,目标是要剥离出dX,同时这样的写法是没用问题的。b对于X来说是常数。可以展开来详细看看。
-
dy=tr(dy)=tr(aTexp(Xb)⊙(d(X)b))=tr((a⊙exp(Xb))T(d(X)b))=tr((a⊙exp(Xb))TdXb)=tr(b(a⊙exp(Xb))TdX)
- 第一个等号是因为,标量的迹等于它本身。
- 第三个等号成立是因为,迹函数的技巧5,矩阵乘法和迹交换.
- 第六个等号成立是因为,去掉dX的符号和原来一样,目标也是要把dX给剥离出来。
- 最后一个等号成立是因为,迹的交换律。
-
所以最终结论为:
∂X∂y=(b(a⊙exp(Xb))T)T=(a⊙exp(Xb))bT
4.使用迹函数对矩阵向量求导
1.基本形式
∂A∂tr(AB),其中Am∗n,Bn∗m。tr(AB)(1∗1)是个标量。类型矩阵标量。
-
展开
d(tr(AB))=tr(d(AB))=tr(d(A)B+AdB)=tr(d(A)B)=tr(BdA)
- 第一个等式成立是以为,d操作和tr操作可以互换。矩阵微分性质4,微分的迹。
- 第二个等式成立是因为,矩阵微分2,微分乘法。
- 第三个等式成立是因为,做种求的是关于dA,所以不含d(A)的项最终值均为0,故舍去。
- 第四个等式成立是因为,迹函数技巧3,迹的交换律。
-
结果,加个转置
∂A∂tr(AB)=BT
∂B∂tr(AB),其中Am∗n,Bn∗m。tr(AB)(1∗1)是个标量。
- ∂B∂tr(AB)=AT
2.例子
∂W∂tr(WTAW)=∂W∂(WTAW)。Wn∗1,An∗n,WTAW(1∗1)是一个标量。类型向量标量
-
d(tr(WTAW))=tr(d(WTAW))=tr(d(WT)AW+WTAd(W))=tr((d(W)TAW+WTAd(W))=tr((d(W))TAW)+tr(WTAd(W))=tr((AW)Td(W))+tr(WTAd(W))
-
所以,
∂W∂tr(WTAW)=((AW)T)T+(WTA)T=AW+ATW=(A+AT)W
小结
- 使用矩阵微分,可以在不对向量或矩阵中的某一元素单独求导再拼接,因此会比较方便,当然熟练使用的前提是对上面矩阵微分的性质,以及迹函数的性质熟练运用。
- 还有一些场景,求导的自变量和因变量直接有复杂的多层链式求导的关系,此时微分法使用起来也有些麻烦。如果我们可以利用一些常用的简单求导结果,再使用链式求导法则。
3.链式法
求导的自变量和因变量直接有复杂的多层链式求导的关系,此时微分法使用起来也有些麻烦。使用矩阵向量求导链式法则,快速求出导数结果。
- 标量对向量的求导,标量对矩阵的求导使用分母布局, 向量对向量的求导使用分子布局。
1.向量对向量的求导法则
假设存在多个向量的依赖关系,如x→y→z。其中xp∗1,ym∗1,zn∗1。
-
∂x∂z应该是(n∗p)维。采用分子布局,雅克比式。
-
所以有:
∂x∂z=∂y∂z∂x∂y
注意:这个写法只在全是向量的依存关系时,才是对的。
-
拓展:x→y1⋯→yn→z。
∂x∂z=∂yn∂z∂yn−1∂yn⋯∂x∂y
2.标量对多个向量的链式求导法则
在机器学习算法中,最终要优化的一般是一个标量损失函数,因此最后求导的目标是标量。所以这个更常用一点。
假设存在多个向量的依赖关系,如x→y→z。其中xp∗1,ym∗1,z1∗1。z是标量。
-
∂x∂z应该是(p∗1)维。采用分母布局。
-
∂y∂z是(m∗1)维,采用分母布局。∂x∂y是(m∗p)维。
-
要使上述的链式求导时维度可以相容,即
维度p∗1=维度p∗m∗维度m∗1
∂x∂z=(∂x∂y)T∂y∂z
-
推论:x→y1⋯→yn→z。
∂x∂z=(∂yn−1∂yn∂yn−2∂yn−1⋯∂x∂y1)T∂yn∂z
例子
设有列向量θ,列向量z=Xθ−y,标量l=zTz。θn∗1,Xm∗n,ym∗1,l1∗1。
构成:θ→z→l,求∂θ∂l
∂θ∂l=(∂θ∂z)T∂z∂l
-
∂θ∂z=∂θ∂(Xθ−y)=∂θ∂(Xθ)=向量向量=X
- 采用分子布局,∂θ∂(Xθ)是(m∗n)维。所以结果是Xm∗n,而不是XT。
-
∂z∂l=∂z∂zTz=向量标量=2z
-
∂θ∂l=(∂θ∂z)T∂z∂l=XT(2z)=2XT(Xθ−y)
3.标量对多个矩阵的链式求导法则
假设有X→Y→z。其中Xp∗q,Ym∗n,z1∗1。X,Y是矩阵,$z是标量。求网络的参数。
-
矩阵对矩阵的求导是比较复杂的定义,不给出基于矩阵整体的链式求导法则。参考
-
给出对矩阵中一个标量的链式求导方法。
-
虽然我们没有全局的标量对矩阵的链式求导法则,但是对于一些线性关系的链式求导,还是可以得到一些有用的结论的。
∂xij∂z=k,l∑∂Ykl∂z∂xij∂Ykl=tr((∂Y∂z)T∂xij∂Y)
- 其中k,l分别从Y的行数和列数中取值(或列数和行数)。
- 第一等式成立是以为,在X中的一个元素xij都和Y中的元素ykl相关。同时对于Y的某个确定的yk∗l∗。yk∗l∗总是和z相关。所以出现对Y中的每个元素对xij求导,z对每个Y中的元素求导,然后用链式穿起来(因为都是标量,所以谁前谁后没关系)。
- 第二等式成立是以为,前面矩阵微分已经详细说明了,并且举了例子。
经典例子
设A,X,B,Y都是矩阵,z是标量,其中z=f(Y),Y=AX+B。求∂X∂z就是经典的机器学习中问题。A是参数矩阵,X是数据集构成的矩阵。其中Xm∗n,Ap∗m,Yp∗n,z1∗1,Bp∗n。
-
标量的链式求导法则求∂xij∂z。
∂xij∂z=k,l∑∂Ykl∂z∂xij∂Ykl
-
对于∂xij∂Ykl。
∂xij∂Ykl=∂xij∂s∑(Aksxsl)=∂xij∂(Akixil)={Aki,l=j0,l=j=Akiδlj.当l=j时,δlj=1;当l=j时,δlj=0.
- 第一个等号成立是因为,为了方便第二个等式的推导。其实没必要给出,给出的目的只是为了强化矩阵的乘法。
- 算的的标量的求导,那么对于xij的偏导一定是一个变量,说白了就是矩阵相乘时xij前的系数。这个系数的计算肯定用到矩阵的乘法。
- 第二个等式成立是因为:
- X和A相乘,现在已经知道是对Xij求导,它在第i行出现,对应的Akl一定在第i列。所以s=i。所以锁定Aki。其中的k是已经确定的,相当于知道了是A的第k行。
- 与Aki相乘的元素,对应X中的第i行,可以表示为Akixil,l取尽X中的所有列。因为要求的是xij的导数,所以在l=j时,对它的导数为Aki,在l=j时,对它的导数0。
-
所以
∂xij∂z=k,l∑∂Ykl∂z∂xij∂Ykl=k∑∂Ykj∂zAkiδlj=k∑∂Ykj∂zAk
- 第二个等式成立是因为,取尽所有Y中的列数得出的结果。
- l=j时,δ为0。l=j时,δ为1。
- 第三个等式成立是因为,去掉δ并不会该变其值。因为δ的取值只有0或1。
-
对于∑k∂Ykj∂zAki。
-
这个可以写成矩阵的表达形式。
-
以为是对k进行遍历求和,而给出的只有(k∗i)和(k∗l)。通过矩阵相乘的概念,k应该出现在矩阵相乘维度相容的中间,即(i∗k)和(k∗l)或(l∗k)和∗(k∗i)。
-
若采用(i∗k)和(k∗l),矩阵AT的第i行和∂Y∂z的第j列的内积。
∂X∂z=AT∂Y∂z
- 因为采用分布分母布局,所以∂X∂z应该是$m*n维的。
- AT是m∗p的,∂Y∂z是p∗n的。
- 所以上述是维度是匹配的(相容的)。
-
若采用(l∗k)和(k∗i),矩阵(∂Y∂z)T的第l行和A的第i列的内积。
∂X∂z=(∂Y∂z)TA
- 因为采用的是分母布局,所以上述的表达式维度相容,故舍去。
结论
结论1
- 设A,X,B,Y都是矩阵,z是标量,其中z=f(Y),Y=AX+B。求∂X∂z。
z=f(Y),Y=AX+B
则
∂X∂z=AT∂Y∂z
2. 设A都是矩阵,x,y,b是向量,z是标量,其中z=f(Y),Y=Ax+b。求∂x∂z。
z=f(Y),Y=Ax+b
∂x∂z=AT∂y∂z
结论2
- 如果要求导的自变量在左边,线性变换在右边,也有类似稍有不同的结论如下
-
设A,X,B,Y都是矩阵,z是标量,其中z=f(Y),Y=XA+B。求∂X∂z。
z=f(Y),Y=XA+B
∂X∂z=∂Y∂zAT
-
设X是矩阵,a,y,b是向量,z是标量,其中z=f(Y),Y=Xa+b。求∂x∂z。
z=f(Y),Y=Xa+b
∂X∂z=∂y∂zaT
技巧
- 无论自变量在那边,均采用分母布局的方式处理矩阵标量。
- ∂X∂z=参数矩阵T∗∂Y∂z或∂X∂z=∂Y∂z∗参数矩阵T。至于是那种形式,根据矩阵相乘时的维度相容即可判别。
小结
- 在同等情况下,优先考虑链式求导法,尤其后面的的四个结论。其次选择微分法、最后考虑定义法。
- 没有结局的问题是,矩阵对矩阵的求导,还有矩阵对向量,向量对矩阵求导这三种形式。这个遇到的不多,具体参考:https://www.cnblogs.com/pinard/p/10930902.html。
- 常见的形式是:标量标量,向量标量,矩阵标量,标量向量,向量向量,标量矩阵。
- 重点:向量标量,矩阵标量,向量向量。
- (矩阵微分性质+迹函数技巧)是真的强大,,矩阵向量链式求导法则(向量对多个向量求导,标量对多个向量求导,标量对多个矩阵的求导)【维度相容】。
参考:
这个是真的大佬!
- 求导定义与求导布局
- 矩阵向量求导之定义法
- 矩阵向量求导之微分法
- 矩阵向量求导链式法则
- 矩阵对矩阵的求导