前段时间看过一些矩阵求导的教程,在看过的资料中,尤其喜欢斯坦福大学CS231n卷积神经网络课程中提到的Erik这篇文章。循着他的思路,可以逐步将复杂的求导过程简化、再简化,直到发现其中有规律的部分。话不多说,一起来看看吧。
撰文 | Erik Learned-Miller
翻译 | 写代码的橘子
来源 | 橘子AI笔记(ID:datawitch)
本文旨在帮助您学习向量、矩阵和高阶张量(三维或三维以上的数组)的求导方法,以及如何求对向量、矩阵和高阶张量的导数。
01. 简化,简化,再简化
在求关于数组的导数时,大部分困惑都源自于我们想要一次同时做好几件事。这“几件事”包括同时对多个元素求导、在求和符号下求导以及应用链式法则。至少在我们积累丰富的经验之前,想要同时做这么多件事情是很容易犯错的。
1.1 写出矩阵中单个元素的表达式
为了简化给定的计算,有一种方法是:写出输出中单个标量元素的表达式,这个表达式只包含标量变量。一旦写出了输出中单个标量元素与其他标量值的表达式,就可以使用标量的微积分求导方法,这比同时进行矩阵的求和、求导要容易得多。
例子 假设我们有一个长度为C的列向量
假设我们想求
让我们先从计算其中一个元素开始,比如,
也就是一个标量对另一个标量求导。
在求导之前,我们要先写出
此时,我们已经将原始矩阵方程式(1)简化为了一个标量方程,从而更容易计算所需的导数。
1.2 去掉求和符号
虽然我们可以尝试直接求式(2)的导数,但包含求和符号(
当然,这个表达式中包括了含有
通过把关注点放在y中的一个元素对x中的一个元素的求导过程,我们尽可能地简化了计算。以后当你在矩阵求导计算中产生困惑时,也可以试着将问题简化到这个最基本的程度,这样便于看清哪里出了问题。
1.2.1 完成求导:雅可比矩阵
别忘了,我们的终极目标是计算
在这种特殊情况下,它被称为雅可比矩阵(Jacobian maxtirx),但这个术语对理解我们的目的而言并不那么重要。
注意,对于公式
也就是说,偏导数的矩阵可以表示为
现在可以看出,这个矩阵当然就是矩阵
因此,推导了这么半天,我们终于能得出,对
求
2. 如果是行向量该怎么算
在使用不同的神经网络库时,留意权重矩阵、数据矩阵等矩阵的具体表达形式是非常重要的。例如,如果一个数据矩阵
在第一部分的例子中,我们计算的向量
2.1 第二个例子
假设
虽然
在这个例子中,写出
会得到
注意这个例子中的元素序号与第一个例子中相反。如果写出完整的雅可比矩阵,我们仍然可以得出
3. 超过二维的情形该怎么算
现在假设一个与前两部分密切相关的情形,如下式
在这个情况下,
在处理三维数组的时候,尝试去找出展示它们的方法可能会带来不必要的麻烦。相反,我们应该简单地用表达式写出结果,用这些表达式可以计算出所需三维数组中的任何元素。
让我们继续以标量导数的计算开始,比如y中的一个元素
然而,我们发现
也就是说
不过,
其实仔细看式(8)就很容易发现这一点。
一般情况下,当
除此以外,三维数组中的其他元素都是0。如果用
其中
但是
最终,如果我们定义一个新的二维数组
就可以看出,我们需要的所有关于
以紧凑的形式表示导数数组对于神经网络的高效实现而言至关重要。
4. 有多条数据该怎么算
前面的例子已经是很好的求导练习了,但如果需要用到多条数据,也就是多个向量
它是一个
按照我们写出给定元素表达式的方法,可以写出
我们马上就能从这个式子中看出,对于偏导数
只有
我们可以进一步发现
完全不依赖于我们比较的是
事实上,矩阵
如果用
正是对之前式(7)的一个简单的普遍化形式。
5. 向量和矩阵中的链式法则
我们已经通过几个例子学会了一些基本形式的计算,现在通过链式法则把这些例子结合在一起。再次假设
尝试计算
然而,我们想通过链式法则来定义中间结果,以观察在非标量求导过程中是如何应用链式法则的。
我们把中间结果定义为
于是有
然后我们可以运用链式法则写出
为了确保我们确切地知道该式的含义,再次采用每次分析一个元素的老办法,从
右边的乘积该怎么解释呢?链式法则的思想是将
回忆之前关于向量对向量求导的计算方法,发现
其实是
其实是
这就是用
综上所述,我们可以用链式法则来表示向量和矩阵的导数,只需要注意:
- 清楚说明中间结果和表示中间结果的变量,
- 表示出最终导数中各个元素的链式法则,
- 对链式法则表达式中的中间结果适当求和。
参考资料: http:// cs231n.stanford.edu/vec Derivs.pdf