对矩阵微积分的解释 - Illustrated Matrix/Tensor Calculus
在不破坏既有定义(针对向量)的前提下,给出张量和张量求导的定义。
基本概念
标量、向量和矩阵
维度 | 0 | 1 | 2 | >=3 |
---|---|---|---|---|
名称 | 标量 Scalar | 向量 Vector | 矩阵 Matrix | 张量 Tensor/Array |
注意区别:
- 某一维长度为0的array
- 此时说明整个array没有可以放元素数值的地方,包含0个数据元素,但不代表没有维度方向
- 某一维长度为1的array
- squeeze or not
- 标量和1维向量
- 前者shape为
()
,后者shape为(1,)
- 前者shape为
- 矩阵的分片(以
a.shape = (2, 3, 4)
为例)- 如果是单纯的取索引,那么相当于从对应维度考虑这个矩阵。此时这个矩阵相当于一个列表,通过下标索引相当于对列表取出元素。如果这么考虑,对应的维度坍缩是可以理解的。
- 比如
a[0, :, :].shape = (3, 4)
,a[:, 0, :].shape = (2, 4)
,a[0, 0, 0:2].shape = (2)
.
- 比如
- 如果是取矩阵的一个分片,那么这个维度没有消失,对应的维度不应该坍缩。
- 比如
a[0:1, :, :].shape = (1, 3, 4)
,a[:, 0:1, :].shape = (2, 1, 4)
- 比如
- 如果是单纯的取索引,那么相当于从对应维度考虑这个矩阵。此时这个矩阵相当于一个列表,通过下标索引相当于对列表取出元素。如果这么考虑,对应的维度坍缩是可以理解的。
向量求导的既有定义
希望我们建立的这套体系尽量能和已有的一些东西吻合
- 向量和向量求导: ∂ y ∂ x = [ ∂ y i ∂ x j ] m ∗ n \frac{\partial y}{\partial x} = [\frac{\partial y_i}{\partial x_j}]_{m*n} ∂x∂y=[∂xj∂yi]m∗n
- Hessian矩阵和Jacobian矩阵、Jacobian行列式最好能融入到体系中来:见Eq60,Eq61
计算概念
内积:
计算方法是对应元素乘积之和,要求两个张量shape一样。内积是定义在同一个空间里面的运算,所以两个操作数的shape肯定是一样的。
标量对张量的导数
此处的张量包括标量、向量、矩阵、张量。(我们一般只研究到二维的矩阵)
因为
d
f
=
d
X
∗
d
f
d
X
df = dX * \frac{df}{dX}
df=dX∗dXdf(其中乘号表示内积),所以
d
f
d
X
\frac{df}{dX}
dXdf的shape和
d
X
dX
dX的shape一样,进而和
X
X
X的shape一样。很明显,把导数定义成对应元素的乘积即可。
d
f
d
X
=
[
d
f
d
X
i
j
]
m
∗
n
\frac{df}{dX} = [ \frac{df}{dX_{ij}} ]_{m*n}
dXdf=[dXijdf]m∗n
一句话解释:标量对张量求导,就是对其每一个元素求导,同时shape和张量保持不变。
张量对张量的导数
注意到张量是一系列标量元素的集成,那么下面的定义应该是容易接受的:
d
A
=
[
d
A
i
j
]
m
∗
n
dA = [dA_{ij}]_{m*n}
dA=[dAij]m∗n
根据这个公式就能很好地给出张量对张量求导的定义:先通过上式展开成标量对张量求导(此时这些导数组成的矩阵的size为被求导张量的size),然后每个元素都是一个标量对张量的导数(每个元素张量的size为求导张量的size),形成整个的大张量。
d
A
d
X
=
[
d
A
i
j
d
X
]
m
∗
n
=
[
d
A
i
j
d
X
k
l
]
m
∗
n
∗
p
∗
q
\frac{dA}{dX} = [\frac{dA_{ij}}{dX}]_{m*n} = [\frac{dA_{ij}}{dX_{kl}}]_{m*n*p*q}
dXdA=[dXdAij]m∗n=[dXkldAij]m∗n∗p∗q
衍生出来一个问题:上面的解释是基于上升维度的。或者说,用上式计算的矩阵和矩阵之间的导数是四维的(
d
A
d
X
[
i
]
[
j
]
=
d
A
i
j
d
X
=
[
d
A
i
j
d
X
k
l
]
p
∗
q
\frac{dA}{dX}[i][j] = \frac{dA_{ij}}{dX} = [\frac{dA_{ij}}{dX_{kl}}]_{p*q}
dXdA[i][j]=dXdAij=[dXkldAij]p∗q)。如果要求矩阵对矩阵的导数还是二维的,以什么形式平铺?
一个简单的考虑是把每个元素(标量对张量的导数,矩阵)concat起来作为平铺。实际上大部分教材就是这么做的。于是问题解决了。
但是问题还没解决。
列向量对列向量求导,按照以上张量对张量求导的准则,应该是一个长的列。但是我们希望
d
f
d
x
=
[
d
f
j
d
x
i
]
i
∈
[
1..
m
]
,
j
∈
[
1..
n
]
\frac{df}{dx} = [\frac{df_j}{dx_i}]_{i\in [1..m], j\in [1..n]}
dxdf=[dxidfj]i∈[1..m],j∈[1..n]
Then let it be. 对于向量对向量求导,就这样好了。
参考
主要参考 HU, Pili. “Matrix Calculus: Derivation and Simple Application.” (2012). 本文更多地是对此文的解读,而且本文中的公式号和此文是对应的。