矩阵求导——只需要记住这个诀窍
1. 背景:
最近开始入门ml&&dl&&nn,第一个问题就是解决我的数学饥荒问题,还好所看教材书后有干货数学知识,优化了学习的进程。(这里打个广告,所看教材为复旦的邱锡鹏老师编纂的《神经网络与深度学习》,想看的同学可以微信搜索公众号CVer,找历史推送下载,非利益相关)。然后,本菜鸡开始卡死在矩阵的求导上,什么标量对向量,向量对矩阵,矩阵对向量,行向量对列向量等一大堆乱七八糟的导数(教材只介绍了向量对标量以及向量对向量)。找不到规律怎么办呢,于是请求博客里的大佬,看了一篇大佬的总结:
传送门
他把所有求导的情况都整理出来,但似乎没有总结规律,这里我靠自己的yy总结了一点方便记忆的规律,如果对哪位同学有帮助不甚荣幸(博主写的时候是大二,没有学过矩阵论,各位已经系统学过矩阵论的大佬应该就可以关掉窗口了)
2. 正文开始
首先,按照博主的分类,所有的情况都可以暴力归结为以下三个问题:
- 矩阵对矩阵求导
- 行向量对列向量的求导
- 元素对元素的求导
当然大家可以有自己的记忆法则和分类,这里我只介绍我觉得好使的方法
2.1 矩阵对矩阵的求导
为什么一上来就讲这么复杂的问题呢?相必大家在学习的时候有这样的体会,尤其是在学习一种模型的时候:总的来说有两种方法,即一般到特殊或特殊到一般,至于具体选择哪一个,就要看这个模型的特性了。例如对于已经学过线性代数的同学,反正国内大部分学校都是先讲矩阵再讲向量,但我们知道向量其实是可以视为 1 × n 1×n 1×n 或者 n × 1 n×1 n×1 的矩阵,它是一种特殊的矩阵。之所以先讲矩阵,是因为矩阵这个数学模型有非常良好的性质,这些性质方便学者们记忆并灵活使用。当学习完矩阵后,向量这个子类完全可以套用矩阵所具有的性质(在一定条件下),所以根据这种思路,我想直接讲矩阵的矩阵的求导
简单来说,矩阵的矩阵的求导和矩阵和矩阵的乘法很类似:
我们假设
Y
=
[
y
11
⋯
y
1
n
⋮
⋱
⋮
y
m
1
⋯
y
m
n
]
\bm{Y} = \left[ \begin{matrix} y_{11} & \cdots & y_{1n} \\ \vdots & \ddots & \vdots \\ y_{m1} & \cdots & y_{mn} \\ \end{matrix} \right]
Y=⎣⎢⎡y11⋮ym1⋯⋱⋯y1n⋮ymn⎦⎥⎤
是一个
m
×
n
m×n
m×n 的矩阵
X
=
[
x
11
⋯
x
1
q
⋮
⋱
⋮
x
p
1
⋯
x
p
q
]
\bm{X} = \left[ \begin{matrix} x_{11} & \cdots & x_{1q} \\ \vdots & \ddots & \vdots \\ x_{p1} & \cdots & x_{pq} \\ \end{matrix} \right]
X=⎣⎢⎡x11⋮xp1⋯⋱⋯x1q⋮xpq⎦⎥⎤
是一个
p
×
q
p×q
p×q 的矩阵,我们想求
∂
Y
∂
X
\frac{\partial {\bm{Y}}}{\partial{\bm{X}}}
∂X∂Y,首先先考虑结果的形式,是一个
m
×
q
m×q
m×q 的大矩阵,注意,这里的
m
m
m 和
q
q
q 并不是只元素的个数,而是小矩阵的个数,即
∂
Y
∂
X
\frac{\partial {\bm{Y}}}{\partial{\bm{X}}}
∂X∂Y 是由
m
×
q
m×q
m×q 个小矩阵组成的。
那么每一个小矩阵长什么样子呢?我们首先把矩阵分别按行和按列分成不同的向量:
Y
=
[
y
11
⋯
y
1
n
⋮
⋱
⋮
y
m
1
⋯
y
m
n
]
=
[
y
1
T
y
2
T
⋮
y
m
T
]
\bm{Y} = \left[ \begin{matrix} y_{11} & \cdots & y_{1n} \\ \vdots & \ddots & \vdots \\ y_{m1} & \cdots & y_{mn} \\ \end{matrix} \right] = \left[ \begin{matrix} \bm{y_1^T} \\ \bm{y_2^T} \\ \vdots \\ \bm{y_m^T} \end{matrix} \right]
Y=⎣⎢⎡y11⋮ym1⋯⋱⋯y1n⋮ymn⎦⎥⎤=⎣⎢⎢⎢⎡y1Ty2T⋮ymT⎦⎥⎥⎥⎤
X
=
[
x
11
⋯
x
1
q
⋮
⋱
⋮
x
p
1
⋯
x
p
q
]
=
[
x
1
x
2
⋯
x
q
]
\bm{X} = \left[ \begin{matrix} x_{11} & \cdots & x_{1q} \\ \vdots & \ddots & \vdots \\ x_{p1} & \cdots & x_{pq} \\ \end{matrix} \right] = \left[ \begin{matrix} \bm{x_1}& \bm{x_2} & \cdots &\bm {x_q} \\ \end{matrix} \right]
X=⎣⎢⎡x11⋮xp1⋯⋱⋯x1q⋮xpq⎦⎥⎤=[x1x2⋯xq]
则有如下结果:
∂ Y ∂ X = [ ∂ y 1 T ∂ x 1 ⋯ ∂ y 1 T ∂ x q ⋮ ⋱ ⋮ ∂ y m T ∂ x 1 ⋯ ∂ y m T ∂ x q ] \frac{\partial {\bm{Y}}}{\partial{\bm{X}}} = \left[ \begin{matrix} \frac{\partial {\bm{y_1^T}}}{\partial{\bm{x_1}}} & \cdots & \frac{\partial {\bm{y_1^T}}}{\partial{\bm{x_q}}} \\ \vdots & \ddots & \vdots \\ \frac{\partial {\bm{y_m^T}}}{\partial{\bm{x_1}}} & \cdots & \frac{\partial {\bm{y_m^T}}}{\partial{\bm{x_q}}} \\ \end{matrix} \right] ∂X∂Y=⎣⎢⎢⎡∂x1∂y1T⋮∂x1∂ymT⋯⋱⋯∂xq∂y1T⋮∂xq∂ymT⎦⎥⎥⎤
故,矩阵对矩阵求导,第一步就是要化成 m × q m×q m×q 的大矩阵,其中第 i i i 行第 j j j 列的元素为 ∂ y i T ∂ x j \frac{\partial {\bm{y_i^T}}}{\partial{\bm{x_j}}} ∂xj∂yiT,可知这是一个行向量对一个列向量进行求导。
2.2 行向量对列向量的求导
下面要解决的问题是行向量如何对列向量求导,这里直接把大神的图片粘过来:
可知,求导结果是一个
p
×
n
p×n
p×n 的矩阵,相当于
y
T
\bm{y^T}
yT 中的每个元素分别对
x
\bm{x}
x 中的每个元素求导,求导结果中,每一个求导的自变量的角标与自变量
x
\bm{x}
x 的同行元素的角标相同(例如,求导后的矩阵第一行的所有分母都是
x
1
\bm{x_1}
x1 )
2.3 元素对元素的求导
这个没有什么可说的了,就是微积分的知识。