http://blog.csdn.net/pipisorry/article/details/68961388
复杂的矩阵函数求导。著名的matrix cookbook为广大的研究者们提供了一本大字典,里面有着各种简单到复杂矩阵和向量的求导法则。
矩阵求导有两种布局,分子布局(numerator layout)和分母布局(denominator layout)。
为了阐明这两种布局的区别,我们先来看最简单的求导规则。
首先是向量 y对标量 x求导,我们假定所有的向量都是列向量,
在分子布局下,
而在分母布局下,
你可以随时在两种布局间进行转换,只要你自己不犯迷糊。
基本的求导规则
定义:若是
中向量
的数量函数,则
对
的导数(即数量函数
的梯度)为
在此,数量函数是指函数的输出是标量。由以上定义可知,我们所说的对向量的导数是函数关于向量元素的偏导数。因此,得到的导数结果是一向量,与向量
的维度一致。
本质上,向量就是矩阵,如果理解了数量函数关于向量的导数,就不难理解数量函数关于矩阵的导数。
注意到,标量对向量求导和向量对标量求导刚好反过来。
向量对向量求导,
标量对矩阵求导,
矩阵对标量求导,
事实上,直观上看,凡是对标量求导,结果的形式都要转置,而标量对向量和矩阵求导则位置保持不动。这样总结方便我们记忆。
总的来说,涉及矩阵和向量的求导不外乎五大类别,
机器学习中常用的矩阵求导公式
Y = A * X --> DY/DX = A'
Y = X * A --> DY/DX = A
Y = A' * X * B --> DY/DX = A * B'
Y = A' * X' * B --> DY/DX = B * A'
更多[http://en.wikipedia.org/wiki/Matrix_calculus]
皮皮blog
向量求导与标量求导法则不同的是,向量的求导还要注意结果的排法问题。注意排法是因为当一个目标函数是多个成分相加时,如果不注意排法可能导致有些结果是行,有些是列,无法继续进行运算。我总结的向量求导的基本推导准则是(以f(x)对向量求导为例):
1)先对f(x)求向量分量的导数,也就是标量的导数,该导数可能是标量,也可能是向量;
2)如果第一步求导结果为标量,直接将结果排列成x的形状(本例为列);如果第一步求出的结果是向量,在按照x排列结果时:
2.1)如果求导结果与x形状相同,则将结果取转置排成矩阵;
2.3)如果求导结果与x形状不同,则直接将结果排成矩阵。
以下约定向量x是列向量,是矩阵,
是A的转置。
例1
2.1)排列:求导结果与x形状相同,将取转置按列排好,即A的转置:
例2
1)
有了基本求导规则,就可以求一些更复杂基本函数的导数。对于矩阵的行列式,向量的叉积,矩阵的逆这些更复杂的导数的求法以及向量的链式求导规则,下篇再表。
如果变量是矩阵,上述法则是很容易推广到矩阵上去的:矩阵是由向量组成的,先利用上述向量的求导法则求导,再对结果进行排列,排列的讨论与2)非常类似。
首先是 ∂Ax∂x,注意到 (Ax)i=ai1x1+ai2x2+⋯+ainxn,于是利用向量对向量求导法则,我们有
∂Ax)∂x=⎡⎣⎢⎢⎢⎢⎢⎢∂(Ax)1∂x1∂(Ax)1∂x2⋮∂(Ax)1∂xn∂(Ax)2∂x1∂(Ax)2∂x2⋮∂(Ax)2∂xn⋯⋯⋱⋯∂(Ax)m∂x1∂(Ax)m∂x2⋮∂(Ax)m∂xn⎤⎦⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢a11a12⋮a1na21a22⋮a2n⋯⋯⋱⋯am1am2⋮amn⎤⎦⎥⎥⎥⎥=AT
理论上对于任意的表达式,我们都可以通过定义出发,利用上面这种形式推导得到。
但是对于一些复杂的求导,这个时候恐怕逐项展开分析就不是很靠谱了。
考虑 ∂Au∂x , A 与 x 无关,所以 A肯定可以先提出求导式,至于去哪了暂时不清楚。
假如 A∈ℝm×n,u∈ℝn×1,x∈ℝp×1,我们知道最后结果肯定和 ∂u∂x有关,注意到 ∂u∂x∈ℝp×n ,于是 A只能转置以后添在后面,因此
∂Au∂x=∂u∂xAT
同样对于 ∂au∂x,a和 x 相关的标量,假定 u∈ℝm×1,x∈ℝn×1 ,根据乘积法则(非精确版本),前一个部分肯定是 a∂u∂x,后一部分为 ∂a∂x∈ℝn×1和 u 的某种形式的积,分析维度发现只能是 ∂a∂xuT。于是
∂au∂x=a∂u∂x+∂a∂xuT
我们发现,虽然乘积法则的精准形式无法应用于矩阵求导中,然而这种非精确的乘积法则可以准确的告诉我们哪些项一定会出现在结果中,然后通过分析维度,我们就可以写出结果。再看 ∂xTAx∂x,其中 A 和 x无关,为了分析这个问题,我们考虑一个更一般的问题,
∂xTAy∂x,x∈ℝm×1,y∈ℝn×1
我们利用非精确的乘积法则,可以将这个分成两部分
∂(xTA)y∂x
于是结果和两部分相关,一个是∂y∂x∈ℝm×n,另一个是∂xTA∂x=A∈ℝm×n,同样通过分析维度,我们可以得到
∂(xTA)y∂x=∂y∂xATx+Ay
因此
∂xTAx∂x=(AT+A)x
最后看一个式子
∂aTxxTb∂x,a,b,x∈ℝm×1
∂aTxxTb∂x=∂(aTx)(xTb)∂x
注意到
∂(aTx)∂x=a,∂(xTb)∂x=b
所以(注意到 xTb∈ℝ)
∂aTxxTb∂x=∂(aTx)(xTb)∂x=axTb+baTx=(abT+baT)x
皮皮blog
1. 矩阵Y对标量x求导:
相当于每个元素求导数后转置一下,注意M×N矩阵求导后变成N×M了
Y = [y(ij)]--> dY/dx = [dy(ji)/dx]
2. 标量y对列向量X求导:
注意与上面不同,这次括号内是求偏导,不转置,对N×1向量求导后还是N×1向量
y = f(x1,x2,..,xn)--> dy/dX = (Dy/Dx1,Dy/Dx2,..,Dy/Dxn)'
3. 行向量Y'对列向量X求导:
注意1×M向量对N×1向量求导后是N×M矩阵。
将Y的每一列对X求偏导,将各列构成一个矩阵。
重要结论:
dX'/dX = I
d(AX)'/dX = A'
4. 列向量Y对行向量X’求导:
转化为行向量Y’对列向量X的导数,然后转置。
注意M×1向量对1×N向量求导结果为M×N矩阵。
dY/dX' = (dY'/dX)'
5. 向量积对列向量X求导运算法则:
注意与标量求导有点不同。
d(UV')/dX = (dU/dX)V' +U(dV'/dX)
d(U'V)/dX = (dU'/dX)V +(dV'/dX)U'
重要结论:
d(X'A)/dX = (dX'/dX)A +(dA/dX)X' = IA + 0X' = A
d(AX)/dX' = (d(X'A')/dX)' =(A')' = A
d(X'AX)/dX = (dX'/dX)AX +(d(AX)'/dX)X = AX + A'X
6. 矩阵Y对列向量X求导:
将Y对X的每一个分量求偏导,构成一个超向量。
注意该向量的每一个元素都是一个矩阵。
7. 矩阵积对列向量求导法则:
d(uV)/dX = (du/dX)V +u(dV/dX)
d(UV)/dX = (dU/dX)V +U(dV/dX)
重要结论:
d(X'A)/dX = (dX'/dX)A +X'(dA/dX) = IA + X'0 = A
8. 标量y对矩阵X的导数:
类似标量y对列向量X的导数,
把y对每个X的元素求偏导,不用转置。
dy/dX = [ Dy/Dx(ij) ]
重要结论:
y = U'XV = ΣΣu(i)x(ij)v(j)于是 dy/dX = [u(i)v(j)] = UV'
y = U'X'XU 则 dy/dX =2XUU'
y = (XU-V)'(XU-V) 则 dy/dX =d(U'X'XU - 2V'XU + V'V)/dX = 2XUU' - 2VU' + 0 = 2(XU-V)U'
9. 矩阵Y对矩阵X的导数:
将Y的每个元素对X求导,然后排在一起形成超级矩阵。
from: http://blog.csdn.net/pipisorry/article/details/68961388
ref: [刘丁酉《矩阵分析》]
[闲话矩阵求导]*