目录
序言
如果你对机器学习|深度学习相关模型的底层原理推导感兴趣的话,矩阵求导的知识是绕不开的。所以本文我想帮助对这一块感兴趣且有疑问的小伙伴对矩阵求导相关知识进行梳理。
一.标量对向量求导
这里 和 均是列向量(不加T的默认表示列向量,后面出现不再赘述)
跟大家说一下我对公式的理解,这个公式是如何诞生的(ps:我觉得搞清楚公式产生的原因比记住公式本身更重要,掌握创造公式的思路,以后你自己也可以造新的公式)
设,,可以发现对每个的偏导均为前面的系数,此时我们想找一种优雅的规范,把的导数统一组织起来,那最简单的方式就是把其对应的导数也组织成与相同的向量形式,即,这样,对的导数就可以写成上面那个简单的形式。
二.标量对矩阵求导
2.1 基本定义
先给出结论,下面再分析公式的形成思想:
其中,为标量,和均为 m×n 的矩阵。
设:
则标量对的导数可表示为:
那么此时考虑另一个问题,的微分如何优雅的表示?首先以标量微分为例:设为和的二元函数,则,可以进一步写成。类比到我们这里,在上面已经给出了的定义,可以类似的写出的定义:
关键的一步思考来了,如何把和关联起来?是不是像标量运算那样直接乘起来就行了?不过这2个矩阵都是,不能直接相乘。那如果把转置一下乘以呢?欸~好像在运算上可以成立:相当于的每一列与的每一列相乘。还有一点要注意,因为是标量,所以也同样应该是标量,但是的结果依旧为矩阵,如何对应呢?
理论上的结果应该等于,即对每个变量的偏导乘以对应变量的微分。想到这,可以惊奇的发现,这个结果就是的对角线元素和。大学时学过线性代数都知道,有个定义叫矩阵的迹,用表示,含义就是矩阵的对角线元素和。到这里,完整的定义就构思出来了:
2.2 一个在机器学习中常见的例子
这里举一个在机器学习模型关于损失函数推导时常出现的某个步骤:
设,求
在证明前先列出几个基本定义:
定义(1)类似标量微分乘法的运算,定义(2)和(3)就是线性代数中描述的矩阵迹的性质,这些基础性的知识我就不展开说了(你可能会说我看你就是懒,啊你说得对^-^)
如果你理解上面的几条定义,那下面的证明就比较简单理解了:
结合前面提到的的定义,可以发现就是。
三.向量对向量的导数
先给出结论:设,
为什么这样定义?我的理解是为了遵循标量对向量的导数定义。怎么说?单独拎一个出来可以发现,对的导数就是的第个列向量,而也是列向量,这符合标量对向量的导数定义。那么把多个标量对向量的导数作为列向量拼起来,不就刚好是上面的形式嘛。
至于,其形式甚至比标量对矩阵的导数还要简单:
结合上面的说法,其实就是的每个列向量和做点乘,结果刚好就是
大家在学习数学相关的算法时应该都接触过Hessian矩阵和Jacobian矩阵,其实如果你看懂了我前面说的内容,你会惊讶的发现下面的结论(下面公式中为标量,为列向量):
利用矩阵求导法则,是不是发现曾经让人头痛的2个矩阵看起来异常清晰?
四.矩阵求导链式法则
设为一组列向量,且是的函数,则:
proof: