∂x∂(u⋅v)=∂x∂uTv=vT∂x∂u+uT∂x∂v
这个公式的记忆技巧是这样的: 对于标量对向量的求导, 一次对一项求导,剩下的部分则视作一个整体拿出来, 转置然后左乘 。
这是
分子布局
下的记号。分子布局,就是将分子看成列向量,竖着排(每一列的分子相同,每一行不同)。想象你的浏览器一开始是个竖长条,然后你拉伸它的右侧使其变成一个矩形的过程。
注意这个技巧对于向量对向量不成立,因为向量对向量定义为 雅可比矩阵 。比如说 d(Ax)/dx = A,没有转置。 关键在于标量本身没有行/列之分,而对向量求导强行扩展了行/列维度(所以导致了转置)。特别地,这个转置只出现在分子布局里面。
但是分子布局在向量/向量, 向量/矩阵,链式法则等方面都很方便…… 可能最方便的方法是异质计算(比如说标->向)使用
分母布局
,同质使用分子布局。
举例而言,通过这个技巧我们可以很容易得到 二次型 的导数:
∂x∂xTAx=∂x∂(x⋅Ax)=xTA+xTAT=xT(A+AT)
这里使用了另外一个技巧,就是把转置换成点乘然后应用上面的原则。这一步很重要否则很容易差一个转置。
我们来求解一个代表性问题展示如何使用矩阵微分迅速求解:
输入样本矩阵为X, 权重为w, 目标向量为y。求解 最小二乘法 的解w.
这等价于求解
∂w∂(Xw−y)T(Xw−y)=0
∂w∂(Xw−y)T(Xw−y)=2(Xw−y)TX=0
不难得到 w=(XTX)−1XTy
除法:
- 以向量为输入的标量函数相除: L=f(x)/g(x) . 这种情况下和标量除法的公式是一样的。(1/g(x)²) * [g(x) * (∂f/∂x) - f(x) * (∂g/∂x)]
- 向量除以标量 L=v/p . 这种情况下将其视作乘了一个标量 1/p ,然后按部就班: 1. 是什么量对x求导?向量!那么就没有转置! 2. 一次对一项求导,剩余部分左乘: ∂x∂v/p=p1⋅∂x∂v−vp21∂x∂p
特别地, 梯度 ∇ 是一种标量对向量求导的记号。请注意, 分子布局下, ∇f=(∂x∂f)T . 差了一个转置。为了不出错,我们设计一个 ∇N=∂x∂ ,这样, ∇=∇NT 。
这里介绍一个复杂的求导系统,感受一下真实计算的时候会发生什么:
∇θ2logp(θ)=∇(∇logp)=∇(p∇p)
到这一步可能还没问题,但是请注意了,内层已经变成了一个向量除以标量的混合情况,而不仅仅是标量了…… 同时,由于我们工作在分子布局下,不能再直接套用上面的公式,必须展开到的 ∇N 才能套用。
所以:
∇(p∇p)=∇NT(p∇NTp)=(p2p∇N2pT−∇Np⋅∇NTp)T=p2p∇N2p−∇Np⋅∇NTp
这个就是
hessian矩阵
。由于它是对称矩阵,所以最后看上去有点脱裤子放屁。读者(您)可以试着直接用nabla推导(但是强行套用上面的微分公式),很快您将发现商的第二项出现了维度不匹配错误。
这个例子生动地诠释了分母布局的必要性。在推导梯度的时候,没有烦人的转置。