矩阵求导
关于矩阵求导,其实严格意义上来说仅仅只是一种求导的矩阵表示形式,其本质还是和普通多元函数求导过程是一致的。将矩阵的各个元素拆分开来,将矩阵运算写成各个元素之间的运算,矩阵变换可以变成多元函数,这样矩阵求导过程就可以与多元函数求导过程联系起来了。要理解矩阵求导运算,最主要的其实是理解矩阵导数的表示,将矩阵导数的拆分形式与多元函数求导联系起来。
本文主要参考《Matrix cookbook》和wiki上面的内容,下面简单介绍一下矩阵求导的相关内容,为后面介绍前馈神经网络FNN的反向传播过程做铺垫。
矩阵求导的表示形式之一:值函数对向量/矩阵变量的导数
下面表达式中, y y 表示一个实值函数,
表示一个向量变量,那么他们的矩阵求导含义为:
∂y∂x=⎡⎣⎢⎢⎢⎢⎢⎢⎢∂y∂x1∂y∂x2⋯∂y∂xn⎤⎦⎥⎥⎥⎥⎥⎥⎥ ∂ y ∂ x = [ ∂ y ∂ x 1 ∂ y ∂ x 2 ⋯ ∂ y ∂ x n ]
y y 表示一个实值函数, 表示一个矩阵变量:
∂y∂X=⎡⎣⎢⎢⎢⎢⎢⎢⎢∂y∂x11∂y∂x21⋯∂y∂xp1∂y∂x12∂y∂x22⋯∂y∂xp2⋯⋯⋯⋯∂y∂x1q∂y∂x2q⋯∂y∂xpq⎤⎦⎥⎥⎥⎥⎥⎥⎥ ∂ y ∂ X = [ ∂ y ∂ x 11 ∂ y ∂ x 12 ⋯ ∂ y ∂ x 1 q ∂ y ∂ x 21 ∂ y ∂ x 22 ⋯ ∂ y ∂ x 2 q ⋯ ⋯ ⋯ ⋯ ∂ y ∂ x p 1 ∂ y ∂ x p 2 ⋯ ∂ y ∂ x p q ]
上面给出了矩阵求导的表示形式的具体含义,很容易理解。下面给出几个例子, a a 是实数, 和 x x 是向量, A A 、 B B 和 C C 是与 x x 无关的矩阵:
∂βTx∂x=β ∂ β T x ∂ x = β
∂xTx∂x=x ∂ x T x ∂ x = x
∂xTAx∂x=(A+AT)x ∂ x T A x ∂ x = ( A + A T ) x
如果你能发现这三个式子左边的分子都是一个数,分母都是一个向量,那么你应该很容易理解这几个等式。是在不能理解就自己把左右两边的矩阵运算拆分开来,然后使用多元函数求导的过程将左右两边分别表示出来就行了。以第一个为例:
βTx=∑i=1nβixi β T x = ∑ i = 1 n β i x i
∂βTx∂x=⎡⎣⎢⎢⎢⎢⎢⎢⎢∂βTx∂x1∂βTx∂x2⋯∂βTx∂xn⎤⎦⎥⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢⎢∂∑ni=1βixi∂x1∂∑ni=1βixi∂x2⋯∂∑ni=1βixi∂xn⎤⎦⎥⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢β1β2⋯βn⎤⎦⎥⎥⎥=β ∂ β T x ∂ x = [ ∂ β T x ∂ x 1 ∂ β T x ∂ x 2 ⋯ ∂ β T x ∂ x n ] = [ ∂ ∑ i = 1 n β i x i ∂ x 1 ∂ ∑ i = 1 n β i x i ∂ x 2 ⋯ ∂ ∑ i = 1 n β i x i ∂ x n ] = [ β 1 β 2 ⋯ β n ] = β
这样就能很清楚的理解矩阵矩阵求导的表示形式的具体含义了。
矩阵求导的表示形式之二:向量函数对值/向量/矩阵变量的导数
下面表达式中, y y 表示一个向量函数, x x 表示一个值变量,那么他们的矩阵求导含义为:
接下来是向量函数 y y 对向量变量 x x 的导数含义为:
∂y∂x=⎡⎣⎢⎢⎢⎢⎢⎢⎢∂y1∂x1∂y2∂x2⋯∂ym∂xn∂y1∂x2∂y2∂x2⋯∂ym∂x2⋯⋯⋯⋯∂y1∂xn∂y2∂xn⋯∂ym∂xn⎤⎦⎥⎥⎥⎥⎥⎥⎥ ∂ y ∂ x = [ ∂ y 1 ∂ x 1 ∂ y 1 ∂ x 2 ⋯ ∂ y 1 ∂ x n ∂ y 2 ∂ x 2 ∂ y 2 ∂ x 2 ⋯ ∂ y 2 ∂ x n ⋯ ⋯ ⋯ ⋯ ∂ y m ∂ x n ∂ y m ∂ x 2 ⋯ ∂ y m ∂ x n ]
以一个最为简单的例子为例:
y=Wx y = W x
那么:
∂y∂x=W ∂ y ∂ x = W
最后向量函数 y y 对矩阵变量 W W 的导数是一个张量,具体形状为:
∂y∂W=⎡⎣⎢⎢⎢⎢⎢⎢⎢∂y1∂W11∂y1∂W21⋯∂y1∂Wm1